Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: avoid unnecessary use of is_swap_pmd()

PMD 'non-swap' swap entries are currently used for PMD-level migration
entries and device private entries.

To add to the confusion in this terminology we use is_swap_pmd() in an
inconsistent way similar to how is_swap_pte() was being used - sometimes
adopting the convention that !pmd_none(), !pmd_present() implies PMD 'swap'
entry, sometimes not.

This patch handles the low-hanging fruit of cases where we can simply
substitute other predicates for is_swap_pmd().

No functional change intended.

Link: https://lkml.kernel.org/r/8a1704b36a009c18032d5bea4cb68e71448fbbe5.1762812360.git.lorenzo.stoakes@oracle.com
Signed-off-by: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
Reviewed-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>
Cc: Alistair Popple <apopple@nvidia.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Axel Rasmussen <axelrasmussen@google.com>
Cc: Baolin Wang <baolin.wang@linux.alibaba.com>
Cc: Baoquan He <bhe@redhat.com>
Cc: Barry Song <baohua@kernel.org>
Cc: Byungchul Park <byungchul@sk.com>
Cc: Chengming Zhou <chengming.zhou@linux.dev>
Cc: Chris Li <chrisl@kernel.org>
Cc: Christian Borntraeger <borntraeger@linux.ibm.com>
Cc: Christian Brauner <brauner@kernel.org>
Cc: Claudio Imbrenda <imbrenda@linux.ibm.com>
Cc: David Hildenbrand <david@redhat.com>
Cc: Dev Jain <dev.jain@arm.com>
Cc: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Cc: Gregory Price <gourry@gourry.net>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: "Huang, Ying" <ying.huang@linux.alibaba.com>
Cc: Hugh Dickins <hughd@google.com>
Cc: Jan Kara <jack@suse.cz>
Cc: Jann Horn <jannh@google.com>
Cc: Janosch Frank <frankja@linux.ibm.com>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Joshua Hahn <joshua.hahnjy@gmail.com>
Cc: Kairui Song <kasong@tencent.com>
Cc: Kemeng Shi <shikemeng@huaweicloud.com>
Cc: Lance Yang <lance.yang@linux.dev>
Cc: Leon Romanovsky <leon@kernel.org>
Cc: Liam Howlett <liam.howlett@oracle.com>
Cc: Mathew Brost <matthew.brost@intel.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Mike Rapoport <rppt@kernel.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Naoya Horiguchi <nao.horiguchi@gmail.com>
Cc: Nhat Pham <nphamcs@gmail.com>
Cc: Nico Pache <npache@redhat.com>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: Pasha Tatashin <pasha.tatashin@soleen.com>
Cc: Peter Xu <peterx@redhat.com>
Cc: Rakie Kim <rakie.kim@sk.com>
Cc: Rik van Riel <riel@surriel.com>
Cc: Ryan Roberts <ryan.roberts@arm.com>
Cc: SeongJae Park <sj@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Wei Xu <weixugc@google.com>
Cc: xu xin <xu.xin16@zte.com.cn>
Cc: Yuanchu Xie <yuanchu@google.com>
Cc: Zi Yan <ziy@nvidia.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Lorenzo Stoakes and committed by
Andrew Morton
aa62204c de4d6c94

+65 -32
+12 -3
fs/proc/task_mmu.c
··· 1059 1059 bool present = false; 1060 1060 struct folio *folio; 1061 1061 1062 + if (pmd_none(*pmd)) 1063 + return; 1062 1064 if (pmd_present(*pmd)) { 1063 1065 page = vm_normal_page_pmd(vma, addr, *pmd); 1064 1066 present = true; 1065 - } else if (unlikely(thp_migration_supported() && is_swap_pmd(*pmd))) { 1067 + } else if (unlikely(thp_migration_supported())) { 1066 1068 swp_entry_t entry = pmd_to_swp_entry(*pmd); 1067 1069 1068 1070 if (is_pfn_swap_entry(entry)) ··· 2002 2000 if (vma->vm_flags & VM_SOFTDIRTY) 2003 2001 flags |= PM_SOFT_DIRTY; 2004 2002 2003 + if (pmd_none(pmd)) 2004 + goto populate_pagemap; 2005 + 2005 2006 if (pmd_present(pmd)) { 2006 2007 page = pmd_page(pmd); 2007 2008 ··· 2015 2010 flags |= PM_UFFD_WP; 2016 2011 if (pm->show_pfn) 2017 2012 frame = pmd_pfn(pmd) + idx; 2018 - } else if (thp_migration_supported() && is_swap_pmd(pmd)) { 2013 + } else if (thp_migration_supported()) { 2019 2014 swp_entry_t entry = pmd_to_swp_entry(pmd); 2020 2015 unsigned long offset; 2021 2016 ··· 2042 2037 flags |= PM_FILE; 2043 2038 } 2044 2039 2040 + populate_pagemap: 2045 2041 for (; addr != end; addr += PAGE_SIZE, idx++) { 2046 2042 u64 cur_flags = flags; 2047 2043 pagemap_entry_t pme; ··· 2405 2399 { 2406 2400 unsigned long categories = PAGE_IS_HUGE; 2407 2401 2402 + if (pmd_none(pmd)) 2403 + return categories; 2404 + 2408 2405 if (pmd_present(pmd)) { 2409 2406 struct page *page; 2410 2407 ··· 2425 2416 categories |= PAGE_IS_PFNZERO; 2426 2417 if (pmd_soft_dirty(pmd)) 2427 2418 categories |= PAGE_IS_SOFT_DIRTY; 2428 - } else if (is_swap_pmd(pmd)) { 2419 + } else { 2429 2420 swp_entry_t swp; 2430 2421 2431 2422 categories |= PAGE_IS_SWAPPED;
+14 -2
include/linux/swapops.h
··· 509 509 510 510 static inline int is_pmd_migration_entry(pmd_t pmd) 511 511 { 512 - return is_swap_pmd(pmd) && is_migration_entry(pmd_to_swp_entry(pmd)); 512 + swp_entry_t entry; 513 + 514 + if (pmd_present(pmd)) 515 + return 0; 516 + 517 + entry = pmd_to_swp_entry(pmd); 518 + return is_migration_entry(entry); 513 519 } 514 520 #else /* CONFIG_ARCH_ENABLE_THP_MIGRATION */ 515 521 static inline int set_pmd_migration_entry(struct page_vma_mapped_walk *pvmw, ··· 563 557 */ 564 558 static inline int is_pmd_device_private_entry(pmd_t pmd) 565 559 { 566 - return is_swap_pmd(pmd) && is_device_private_entry(pmd_to_swp_entry(pmd)); 560 + swp_entry_t entry; 561 + 562 + if (pmd_present(pmd)) 563 + return 0; 564 + 565 + entry = pmd_to_swp_entry(pmd); 566 + return is_device_private_entry(entry); 567 567 } 568 568 569 569 #else /* CONFIG_ZONE_DEVICE && CONFIG_ARCH_ENABLE_THP_MIGRATION */
+3 -1
mm/huge_memory.c
··· 2354 2354 2355 2355 static pmd_t clear_uffd_wp_pmd(pmd_t pmd) 2356 2356 { 2357 + if (pmd_none(pmd)) 2358 + return pmd; 2357 2359 if (pmd_present(pmd)) 2358 2360 pmd = pmd_clear_uffd_wp(pmd); 2359 - else if (is_swap_pmd(pmd)) 2361 + else 2360 2362 pmd = pmd_swp_clear_uffd_wp(pmd); 2361 2363 2362 2364 return pmd;
+28 -22
mm/memory.c
··· 1376 1376 next = pmd_addr_end(addr, end); 1377 1377 if (is_swap_pmd(*src_pmd) || pmd_trans_huge(*src_pmd)) { 1378 1378 int err; 1379 + 1379 1380 VM_BUG_ON_VMA(next-addr != HPAGE_PMD_SIZE, src_vma); 1380 1381 err = copy_huge_pmd(dst_mm, src_mm, dst_pmd, src_pmd, 1381 1382 addr, dst_vma, src_vma); ··· 6341 6340 if (pmd_none(*vmf.pmd) && 6342 6341 thp_vma_allowable_order(vma, vm_flags, TVA_PAGEFAULT, PMD_ORDER)) { 6343 6342 ret = create_huge_pmd(&vmf); 6344 - if (!(ret & VM_FAULT_FALLBACK)) 6343 + if (ret & VM_FAULT_FALLBACK) 6344 + goto fallback; 6345 + else 6345 6346 return ret; 6346 - } else { 6347 - vmf.orig_pmd = pmdp_get_lockless(vmf.pmd); 6347 + } 6348 6348 6349 - if (unlikely(is_swap_pmd(vmf.orig_pmd))) { 6350 - if (is_pmd_device_private_entry(vmf.orig_pmd)) 6351 - return do_huge_pmd_device_private(&vmf); 6349 + vmf.orig_pmd = pmdp_get_lockless(vmf.pmd); 6350 + if (pmd_none(vmf.orig_pmd)) 6351 + goto fallback; 6352 6352 6353 - if (is_pmd_migration_entry(vmf.orig_pmd)) 6354 - pmd_migration_entry_wait(mm, vmf.pmd); 6353 + if (unlikely(!pmd_present(vmf.orig_pmd))) { 6354 + if (is_pmd_device_private_entry(vmf.orig_pmd)) 6355 + return do_huge_pmd_device_private(&vmf); 6356 + 6357 + if (is_pmd_migration_entry(vmf.orig_pmd)) 6358 + pmd_migration_entry_wait(mm, vmf.pmd); 6359 + return 0; 6360 + } 6361 + if (pmd_trans_huge(vmf.orig_pmd)) { 6362 + if (pmd_protnone(vmf.orig_pmd) && vma_is_accessible(vma)) 6363 + return do_huge_pmd_numa_page(&vmf); 6364 + 6365 + if ((flags & (FAULT_FLAG_WRITE|FAULT_FLAG_UNSHARE)) && 6366 + !pmd_write(vmf.orig_pmd)) { 6367 + ret = wp_huge_pmd(&vmf); 6368 + if (!(ret & VM_FAULT_FALLBACK)) 6369 + return ret; 6370 + } else { 6371 + huge_pmd_set_accessed(&vmf); 6355 6372 return 0; 6356 - } 6357 - if (pmd_trans_huge(vmf.orig_pmd)) { 6358 - if (pmd_protnone(vmf.orig_pmd) && vma_is_accessible(vma)) 6359 - return do_huge_pmd_numa_page(&vmf); 6360 - 6361 - if ((flags & (FAULT_FLAG_WRITE|FAULT_FLAG_UNSHARE)) && 6362 - !pmd_write(vmf.orig_pmd)) { 6363 - ret = wp_huge_pmd(&vmf); 6364 - if (!(ret & VM_FAULT_FALLBACK)) 6365 - return ret; 6366 - } else { 6367 - huge_pmd_set_accessed(&vmf); 6368 - return 0; 6369 - } 6370 6373 } 6371 6374 } 6372 6375 6376 + fallback: 6373 6377 return handle_pte_fault(&vmf); 6374 6378 } 6375 6379
+8 -4
mm/page_table_check.c
··· 215 215 216 216 static inline void page_table_check_pmd_flags(pmd_t pmd) 217 217 { 218 - if (pmd_present(pmd) && pmd_uffd_wp(pmd)) 219 - WARN_ON_ONCE(pmd_write(pmd)); 220 - else if (is_swap_pmd(pmd) && pmd_swp_uffd_wp(pmd)) 221 - WARN_ON_ONCE(swap_cached_writable(pmd_to_swp_entry(pmd))); 218 + if (pmd_present(pmd)) { 219 + if (pmd_uffd_wp(pmd)) 220 + WARN_ON_ONCE(pmd_write(pmd)); 221 + } else if (pmd_swp_uffd_wp(pmd)) { 222 + swp_entry_t entry = pmd_to_swp_entry(pmd); 223 + 224 + WARN_ON_ONCE(swap_cached_writable(entry)); 225 + } 222 226 } 223 227 224 228 void __page_table_check_pmds_set(struct mm_struct *mm, pmd_t *pmdp, pmd_t pmd,