Re: [PATCH v4] mm: fix is_pinnable_page against on cma page

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 5/11/22 18:08, John Hubbard wrote:
On 5/11/22 18:03, Minchan Kim wrote:

Or there might be some code path that really hates a READ_ONCE() in
that place.

My worry about chaning __get_pfnblock_flags_mask is it's called
multiple hot places in mm codes so I didn't want to add overhead
to them.

...unless it really does generate the same code as is already there,
right? Let me check that real quick.


It does change the generated code slightly. I don't know if this will
affect performance here or not. But just for completeness, here you go:

free_one_page() originally has this (just showing the changed parts):

    mov    0x8(%rdx,%rax,8),%rbx
    and    $0x3f,%ecx
    shr    %cl,%rbx
    and    $0x7,


And after applying this diff:

diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 0e42038382c1..df1f8e9a294f 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -482,7 +482,7 @@ unsigned long __get_pfnblock_flags_mask(const struct page *page,
        word_bitidx = bitidx / BITS_PER_LONG;
        bitidx &= (BITS_PER_LONG-1);

-       word = bitmap[word_bitidx];
+       word = READ_ONCE(bitmap[word_bitidx]);
        return (word >> bitidx) & mask;
 }


...it now does an extra memory dereference:

    lea    0x8(%rdx,%rax,8),%rax
    and    $0x3f,%ecx
    mov    (%rax),%rbx
    shr    %cl,%rbx
    and    $0x7,%ebx


thanks,
--
John Hubbard
NVIDIA




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux