• Matthew Wilcox (Oracle)'s avatar
    mm: make folios_put() the basis of release_pages() · 99fbb6bf
    Matthew Wilcox (Oracle) authored
    Patch series "Rearrange batched folio freeing", v3.
    
    Other than the obvious "remove calls to compound_head" changes, the
    fundamental belief here is that iterating a linked list is much slower
    than iterating an array (5-15x slower in my testing).  There's also an
    associated belief that since we iterate the batch of folios three times,
    we do better when the array is small (ie 15 entries) than we do with a
    batch that is hundreds of entries long, which only gives us the
    opportunity for the first pages to fall out of cache by the time we get to
    the end.
    
    It is possible we should increase the size of folio_batch.  Hopefully the
    bots let us know if this introduces any performance regressions.
    
    
    This patch (of 3):
    
    By making release_pages() call folios_put(), we can get rid of the calls
    to compound_head() for the callers that already know they have folios.  We
    can also get rid of the lock_batch tracking as we know the size of the
    batch is limited by folio_batch.  This does reduce the maximum number of
    pages for which the lruvec lock is held, from SWAP_CLUSTER_MAX (32) to
    PAGEVEC_SIZE (15).  I do not expect this to make a significant difference,
    but if it does, we can increase PAGEVEC_SIZE to 31.
    
    Link: https://lkml.kernel.org/r/20240227174254.710559-1-willy@infradead.org
    Link: https://lkml.kernel.org/r/20240227174254.710559-2-willy@infradead.orgSigned-off-by: default avatarMatthew Wilcox (Oracle) <willy@infradead.org>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Mel Gorman <mgorman@suse.de>
    Cc: Ryan Roberts <ryan.roberts@arm.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    99fbb6bf
swap.c 31.8 KB