| Subject | Re: [PATCH v9 08/96] mm: Fix struct page layout on 32-bit systems | From | Vlastimil Babka <> | Date | Wed, 5 May 2021 19:33:35 +0200 |
| |
On 5/5/21 5:05 PM, Matthew Wilcox (Oracle) wrote: > 32-bit architectures which expect 8-byte alignment for 8-byte integers > and need 64-bit DMA addresses (arm, mips, ppc) had their struct page > inadvertently expanded in 2019. When the dma_addr_t was added, it forced > the alignment of the union to 8 bytes, which inserted a 4 byte gap between > 'flags' and the union. > > Fix this by storing the dma_addr_t in one or two adjacent unsigned longs. > This restores the alignment to that of an unsigned long. We always > store the low bits in the first word to prevent the PageTail bit from > being inadvertently set on a big endian platform. If that happened, > get_user_pages_fast() racing against a page which was freed and > reallocated to the page_pool could dereference a bogus compound_head(), > which would be hard to trace back to this cause. > > Fixes: c25fff7171be ("mm: add dma_addr_t to struct page") > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> > Acked-by: Jesper Dangaard Brouer <brouer@redhat.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
|