• C
    PAGEFLAGS_EXTENDED and separate page flags for Head and Tail · e20b8cca
    Christoph Lameter 提交于
    Having separate page flags for the head and the tail of a compound page allows
    the compiler to use bitops instead of operations on a word to check for a tail
    page.  That is f.e.  important for virt_to_head_page() which is used in
    various critical code paths (kfree for example):
    
    Code for PageTail(page)
    
    Before:
    
     mov    (%rdi),%rdx		page->flags
     mov    %rdx,%rax		3 bytes
     and    $0x12000,%eax		5 bytes
     cmp    $0x12000,%rax		6 bytes
     je     897 <kfree+0xa7>
    
    After:
    
     mov    (%rdi),%rax
     test   $0x40,%ah			(3 bytes)
     jne    887 <kfree+0x97>
    
    So we go from 14 bytes to 3 bytes and from 3 instructions to one.  From the
    use of 2 registers we go to none.
    
    We can only use page flags for this if we have page flags available.  This
    patch introduces CONFIG_PAGEFLAGS_EXTENDED that is set if pageflags are not
    scarce due to SPARSEMEM using page flags for its sectionid on 32 bit NUMA
    platforms.
    
    Additional page flag definitions can be added to the CONFIG_PAGEFLAGS_EXTENDED
    section in page-flags.h if the functionality depends on PAGEFLAGS_EXTENDED or
    if more page flag overlapping tricks are used for the !PAGEFLAGS_EXTENDED
    fallback (the upcoming virtual compound patch may hook in here and Rik's/Lee's
    additional page flags to solve the reclaim issues could also be added there
    [hint...  hint...  where are these patchsets?]).
    
    Avoiding the overlaying of Pg_reclaim also clears the way for possible use of
    compound pages for the pagecache or on the LRU.
    Signed-off-by: NChristoph Lameter <clameter@sgi.com>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    e20b8cca
Kconfig 6.2 KB