On Tuesday, 22 June 2021 2:26:23 AM AEST Peter Xu wrote: > On Mon, Jun 21, 2021 at 10:36:46PM +1000, Alistair Popple wrote: > > On Friday, 28 May 2021 6:21:35 AM AEST Peter Xu wrote: > > > Firstly, the comment in zap_pte_range() is misleading because it checks against > > > details rather than check_mappings, so it's against what the code did. > > > > > > Meanwhile, it's confusing too on not explaining why passing in the details > > > pointer would mean to skip all swap entries. New user of zap_details could > > > very possibly miss this fact if they don't read deep until zap_pte_range() > > > because there's no comment at zap_details talking about it at all, so swap > > > entries could be errornously skipped without being noticed. > > > > > > This partly reverts 3e8715fdc03e ("mm: drop zap_details::check_swap_entries"), > > > but introduce ZAP_FLAG_SKIP_SWAP flag, which means the opposite of previous > > > "details" parameter: the caller should explicitly set this to skip swap > > > entries, otherwise swap entries will always be considered (which is still the > > > major case here). > > > > > > Cc: Kirill A. Shutemov <kirill@xxxxxxxxxxxxx> > > > Signed-off-by: Peter Xu <peterx@xxxxxxxxxx> > > > --- > > > include/linux/mm.h | 12 ++++++++++++ > > > mm/memory.c | 8 +++++--- > > > 2 files changed, 17 insertions(+), 3 deletions(-) > > > > > > diff --git a/include/linux/mm.h b/include/linux/mm.h > > > index 52d3ef2ed753..1adf313a01fe 100644 > > > --- a/include/linux/mm.h > > > +++ b/include/linux/mm.h > > > @@ -1723,6 +1723,8 @@ extern void user_shm_unlock(size_t, struct user_struct *); > > > > > > /* Whether to check page->mapping when zapping */ > > > #define ZAP_FLAG_CHECK_MAPPING BIT(0) > > > +/* Whether to skip zapping swap entries */ > > > +#define ZAP_FLAG_SKIP_SWAP BIT(1) > > > > > > /* > > > * Parameter block passed down to zap_pte_range in exceptional cases. > > > @@ -1745,6 +1747,16 @@ zap_check_mapping_skip(struct zap_details *details, struct page *page) > > > return details->zap_mapping != page_rmapping(page); > > > } > > > > > > +/* Return true if skip swap entries, false otherwise */ > > > +static inline bool > > > +zap_skip_swap(struct zap_details *details) > > > > Minor nit-pick but imho it would be nice if the naming was consistent between > > this and check mapping. Ie. zap_skip_swap()/zap_skip_check_mapping() or > > zap_swap_skip()/zap_check_mapping_skip(). > > Makes sense; I'll use zap_skip_swap()/zap_skip_check_mapping() I think, then I > keep this patch untouched. Sounds good. > > > > > +{ > > > + if (!details) > > > + return false; > > > + > > > + return details->zap_flags & ZAP_FLAG_SKIP_SWAP; > > > +} > > > + > > > struct page *vm_normal_page(struct vm_area_struct *vma, unsigned long addr, > > > pte_t pte); > > > struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr, > > > diff --git a/mm/memory.c b/mm/memory.c > > > index c9dc4e9e05b5..8a3751be87ba 100644 > > > --- a/mm/memory.c > > > +++ b/mm/memory.c > > > @@ -1376,8 +1376,7 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, > > > continue; > > > } > > > > > > - /* If details->check_mapping, we leave swap entries. */ > > > - if (unlikely(details)) > > > + if (unlikely(zap_skip_swap(details))) > > > continue; > > > > > > if (!non_swap_entry(entry)) > > > @@ -3328,7 +3327,10 @@ void unmap_mapping_pages(struct address_space *mapping, pgoff_t start, > > > pgoff_t nr, bool even_cows) > > > { > > > pgoff_t first_index = start, last_index = start + nr - 1; > > > - struct zap_details details = { .zap_mapping = mapping }; > > > + struct zap_details details = { > > > + .zap_mapping = mapping, > > > > I meant to comment on this in the previous patch, but it might be nice to set > > .zap_mapping in the !even_cows case below to make it very obvious it only > > applies to ZAP_FLAG_CHECK_MAPPING. > > I wanted to make it easy to understand by having zap_mapping always points to > the mapping it's zapping, so it does not contain any other information like > "whether we want to check the mapping is the same when zap", which now stays > fully in the flags. Then it's always legal to reference zap_mapping without any > prior knowledge. But indeed it's only used by ZAP_FLAG_CHECK_MAPPING. > > I do have a slight preference to keep it as the patch does, but I don't have a > strong opinion. Let me know if you insist; I can change. No insistence from me if you want to keep it this way, it's all pretty obvious anyway. > > > > Otherwise I think this is a good clean up which makes things clearer. I double > > checked that unmap_mapping_pages() was the only place in the existing code that > > needs ZAP_FLAG_SKIP_SWAP and that appears to be the case so there shouldn't be > > any behaviour changes from this. > > > > Reviewed-by: Alistair Popple <apopple@xxxxxxxxxx> > > Since I won't change anything within this patch, I'll take this away, thanks! > >