• Peter Xu's avatar
    mm: change zap_details.zap_mapping into even_cows · 2e148f1e
    Peter Xu authored
    Currently we have a zap_mapping pointer maintained in zap_details, when
    it is specified we only want to zap the pages that has the same mapping
    with what the caller has specified.
    
    But what we want to do is actually simpler: we want to skip zapping
    private (COW-ed) pages in some cases.  We can refer to
    unmap_mapping_pages() callers where we could have passed in different
    even_cows values.  The other user is unmap_mapping_folio() where we
    always want to skip private pages.
    
    According to Hugh, we used a mapping pointer for historical reason, as
    explained here:
    
      https://lore.kernel.org/lkml/391aa58d-ce84-9d4-d68d-d98a9c533255@google.com/
    
    Quoting partly from Hugh:
    
      Which raises the question again of why I did not just use a boolean flag
      there originally: aah, I think I've found why.  In those days there was a
      horrible "optimization", for better performance on some benchmark I guess,
      which when you read from /dev/zero into a private mapping, would map the zero
      page there (look up read_zero_pagealigned() and zeromap_page_range() if you
      dare).  So there was another category of page to be skipped along with the
      anon COWs, and I didn't want multiple tests in the zap loop, so checking
      check_mapping against page->mapping did both.  I think nowadays you could do
      it by checking for PageAnon page (or genuine swap entry) instead.
    
    This patch replaces the zap_details.zap_mapping pointer into the even_cows
    boolean, then we check it against PageAnon.
    
    Link: https://lkml.kernel.org/r/20220216094810.60572-4-peterx@redhat.comSigned-off-by: default avatarPeter Xu <peterx@redhat.com>
    Suggested-by: default avatarHugh Dickins <hughd@google.com>
    Reviewed-by: default avatarJohn Hubbard <jhubbard@nvidia.com>
    Cc: David Hildenbrand <david@redhat.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: "Kirill A . Shutemov" <kirill@shutemov.name>
    Cc: Matthew Wilcox <willy@infradead.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Cc: Yang Shi <shy828301@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2e148f1e
memory.c 149 KB