Thread (26 messages) 26 messages, 11 authors, 2021-04-21

Re: [PATCH 1/2] mm: Fix struct page layout on 32-bit systems

From: Matthew Wilcox <willy@infradead.org>
Date: 2021-04-20 11:33:04
Also in: linux-arm-kernel, linux-mips, linux-mm, linuxppc-dev, lkml

On Tue, Apr 20, 2021 at 09:39:54AM +0200, Geert Uytterhoeven wrote:
quoted
+++ b/include/linux/mm_types.h
@@ -97,10 +97,10 @@ struct page {
                };
                struct {        /* page_pool used by netstack */
                        /**
-                        * @dma_addr: might require a 64-bit value even on
+                        * @dma_addr: might require a 64-bit value on
                         * 32-bit architectures.
                         */
-                       dma_addr_t dma_addr;
+                       unsigned long dma_addr[2];
So we get two 64-bit words on 64-bit platforms, while only one is
needed?
Not really.  This is part of the 5-word union in struct page, so the space
ends up being reserved anyway, event if it's not "assigned" to dma_addr.
quoted
+       dma_addr_t ret = page->dma_addr[0];
+       if (sizeof(dma_addr_t) > sizeof(unsigned long))
+               ret |= (dma_addr_t)page->dma_addr[1] << 16 << 16;
We don't seem to have a handy macro for a 32-bit left shift yet...

But you can also avoid the warning using

    ret |= (u64)page->dma_addr[1] << 32;
Sure.  It doesn't really matter which way we eliminate the warning;
the code is unreachable.
quoted
+{
+       page->dma_addr[0] = addr;
+       if (sizeof(dma_addr_t) > sizeof(unsigned long))
+               page->dma_addr[1] = addr >> 16 >> 16;
... but we do have upper_32_bits() for a 32-bit right shift.
Yep, that's what my current tree looks like.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help