git: 797020a76406 - main - vm: retire vm_page_lock()
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 11 Jun 2025 20:21:53 UTC
The branch main has been updated by alc:
URL: https://cgit.FreeBSD.org/src/commit/?id=797020a76406a8e7a4afbd3706884b58a6e4b4ec
commit 797020a76406a8e7a4afbd3706884b58a6e4b4ec
Author: Alan Cox <alc@FreeBSD.org>
AuthorDate: 2025-06-10 07:23:23 +0000
Commit: Alan Cox <alc@FreeBSD.org>
CommitDate: 2025-06-11 20:19:41 +0000
vm: retire vm_page_lock()
vm_page_lock() and its underlying array of locks, pa_lock[], have been
replaced throughout the virtual memory system by either atomics or
busy-style, per-page synchronization. The Linux KPI support contained
the only remaining use cases. Eliminate or update them as appropriate
to each case.
Reviewed by: kib, markj
Differential Revision: https://reviews.freebsd.org/D50767
---
sys/amd64/include/vmparam.h | 4 --
sys/compat/linuxkpi/common/include/linux/highmem.h | 2 -
sys/compat/linuxkpi/common/include/linux/mm.h | 4 +-
sys/powerpc/aim/mmu_oea64.c | 2 +-
sys/powerpc/include/vmparam.h | 6 ---
sys/vm/vm_object.c | 1 -
sys/vm/vm_page.c | 41 ---------------------
sys/vm/vm_page.h | 43 ----------------------
sys/vm/vm_param.h | 8 ----
9 files changed, 3 insertions(+), 108 deletions(-)
diff --git a/sys/amd64/include/vmparam.h b/sys/amd64/include/vmparam.h
index 026da4b460e2..0cd9bb4fa7a4 100644
--- a/sys/amd64/include/vmparam.h
+++ b/sys/amd64/include/vmparam.h
@@ -149,10 +149,6 @@
#define VM_LEVEL_0_ORDER 9
#endif
-#ifdef SMP
-#define PA_LOCK_COUNT 256
-#endif
-
/*
* Kernel physical load address for non-UEFI boot and for legacy UEFI loader.
* Newer UEFI loader loads kernel anywhere below 4G, with memory allocated
diff --git a/sys/compat/linuxkpi/common/include/linux/highmem.h b/sys/compat/linuxkpi/common/include/linux/highmem.h
index 8b5255c1869c..58a9cdcdf60f 100644
--- a/sys/compat/linuxkpi/common/include/linux/highmem.h
+++ b/sys/compat/linuxkpi/common/include/linux/highmem.h
@@ -79,9 +79,7 @@ kmap_atomic_prot(struct page *page, pgprot_t prot)
vm_memattr_t attr = pgprot2cachemode(prot);
if (attr != VM_MEMATTR_DEFAULT) {
- vm_page_lock(page);
page->flags |= PG_FICTITIOUS;
- vm_page_unlock(page);
pmap_page_set_memattr(page, attr);
}
return (kmap(page));
diff --git a/sys/compat/linuxkpi/common/include/linux/mm.h b/sys/compat/linuxkpi/common/include/linux/mm.h
index 068dbb627c82..156b00a0c0f0 100644
--- a/sys/compat/linuxkpi/common/include/linux/mm.h
+++ b/sys/compat/linuxkpi/common/include/linux/mm.h
@@ -406,14 +406,14 @@ vmalloc_to_page(const void *addr)
static inline int
trylock_page(struct page *page)
{
- return (vm_page_trylock(page));
+ return (vm_page_tryxbusy(page));
}
static inline void
unlock_page(struct page *page)
{
- vm_page_unlock(page);
+ vm_page_xunbusy(page);
}
extern int is_vmalloc_addr(const void *addr);
diff --git a/sys/powerpc/aim/mmu_oea64.c b/sys/powerpc/aim/mmu_oea64.c
index e24f591498dd..40dd232f47c1 100644
--- a/sys/powerpc/aim/mmu_oea64.c
+++ b/sys/powerpc/aim/mmu_oea64.c
@@ -122,7 +122,7 @@ uintptr_t moea64_get_unique_vsid(void);
*
*/
-#define PV_LOCK_COUNT PA_LOCK_COUNT
+#define PV_LOCK_COUNT MAXCPU
static struct mtx_padalign pv_lock[PV_LOCK_COUNT];
/*
diff --git a/sys/powerpc/include/vmparam.h b/sys/powerpc/include/vmparam.h
index a612acbef239..67fce74ade55 100644
--- a/sys/powerpc/include/vmparam.h
+++ b/sys/powerpc/include/vmparam.h
@@ -216,12 +216,6 @@ extern int vm_level_0_order;
#define VM_LEVEL_0_ORDER_MAX 12
#endif
-#ifdef __powerpc64__
-#ifdef SMP
-#define PA_LOCK_COUNT 256
-#endif
-#endif
-
#ifndef VM_INITIAL_PAGEIN
#define VM_INITIAL_PAGEIN 16
#endif
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 0e429b58aa1c..f0769102aca1 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -1005,7 +1005,6 @@ vm_object_page_clean_flush(struct pctrie_iter *pages, vm_page_t p,
vm_page_t ma[vm_pageout_page_count];
int count, runlen;
- vm_page_lock_assert(p, MA_NOTOWNED);
vm_page_assert_xbusied(p);
ma[0] = p;
runlen = vm_radix_iter_lookup_range(pages, p->pindex + 1,
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index 128a1ef7ca54..b00f775de6e7 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -114,8 +114,6 @@ struct vm_domain vm_dom[MAXMEMDOM];
DPCPU_DEFINE_STATIC(struct vm_batchqueue, pqbatch[MAXMEMDOM][PQ_COUNT]);
-struct mtx_padalign __exclusive_cache_line pa_lock[PA_LOCK_COUNT];
-
struct mtx_padalign __exclusive_cache_line vm_domainset_lock;
/* The following fields are protected by the domainset lock. */
domainset_t __exclusive_cache_line vm_min_domains;
@@ -586,8 +584,6 @@ vm_page_startup(vm_offset_t vaddr)
* Initialize the page and queue locks.
*/
mtx_init(&vm_domainset_lock, "vm domainset lock", NULL, MTX_DEF);
- for (i = 0; i < PA_LOCK_COUNT; i++)
- mtx_init(&pa_lock[i], "vm page", NULL, MTX_DEF);
for (i = 0; i < vm_ndomains; i++)
vm_page_domain_init(i);
@@ -5809,43 +5805,6 @@ vm_page_valid(vm_page_t m)
vm_page_bits_set(m, &m->valid, VM_PAGE_BITS_ALL);
}
-void
-vm_page_lock_KBI(vm_page_t m, const char *file, int line)
-{
-
- mtx_lock_flags_(vm_page_lockptr(m), 0, file, line);
-}
-
-void
-vm_page_unlock_KBI(vm_page_t m, const char *file, int line)
-{
-
- mtx_unlock_flags_(vm_page_lockptr(m), 0, file, line);
-}
-
-int
-vm_page_trylock_KBI(vm_page_t m, const char *file, int line)
-{
-
- return (mtx_trylock_flags_(vm_page_lockptr(m), 0, file, line));
-}
-
-#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
-void
-vm_page_assert_locked_KBI(vm_page_t m, const char *file, int line)
-{
-
- vm_page_lock_assert_KBI(m, MA_OWNED, file, line);
-}
-
-void
-vm_page_lock_assert_KBI(vm_page_t m, int a, const char *file, int line)
-{
-
- mtx_assert_(vm_page_lockptr(m), a, file, line);
-}
-#endif
-
#ifdef INVARIANTS
void
vm_page_object_busy_assert(vm_page_t m)
diff --git a/sys/vm/vm_page.h b/sys/vm/vm_page.h
index 4f82a69ebe25..062cf00b5b33 100644
--- a/sys/vm/vm_page.h
+++ b/sys/vm/vm_page.h
@@ -336,8 +336,6 @@ SLIST_HEAD(spglist, vm_page);
extern vm_page_t bogus_page;
#endif /* _KERNEL */
-extern struct mtx_padalign pa_lock[];
-
#if defined(__arm__)
#define PDRSHIFT PDR_SHIFT
#elif !defined(PDRSHIFT)
@@ -345,40 +343,6 @@ extern struct mtx_padalign pa_lock[];
#endif
#define pa_index(pa) ((pa) >> PDRSHIFT)
-#define PA_LOCKPTR(pa) ((struct mtx *)(&pa_lock[pa_index(pa) % PA_LOCK_COUNT]))
-#define PA_LOCKOBJPTR(pa) ((struct lock_object *)PA_LOCKPTR((pa)))
-#define PA_LOCK(pa) mtx_lock(PA_LOCKPTR(pa))
-#define PA_TRYLOCK(pa) mtx_trylock(PA_LOCKPTR(pa))
-#define PA_UNLOCK(pa) mtx_unlock(PA_LOCKPTR(pa))
-#define PA_UNLOCK_COND(pa) \
- do { \
- if ((pa) != 0) { \
- PA_UNLOCK((pa)); \
- (pa) = 0; \
- } \
- } while (0)
-
-#define PA_LOCK_ASSERT(pa, a) mtx_assert(PA_LOCKPTR(pa), (a))
-
-#if defined(KLD_MODULE) && !defined(KLD_TIED)
-#define vm_page_lock(m) vm_page_lock_KBI((m), LOCK_FILE, LOCK_LINE)
-#define vm_page_unlock(m) vm_page_unlock_KBI((m), LOCK_FILE, LOCK_LINE)
-#define vm_page_trylock(m) vm_page_trylock_KBI((m), LOCK_FILE, LOCK_LINE)
-#else /* !KLD_MODULE */
-#define vm_page_lockptr(m) (PA_LOCKPTR(VM_PAGE_TO_PHYS((m))))
-#define vm_page_lock(m) mtx_lock(vm_page_lockptr((m)))
-#define vm_page_unlock(m) mtx_unlock(vm_page_lockptr((m)))
-#define vm_page_trylock(m) mtx_trylock(vm_page_lockptr((m)))
-#endif
-#if defined(INVARIANTS)
-#define vm_page_assert_locked(m) \
- vm_page_assert_locked_KBI((m), __FILE__, __LINE__)
-#define vm_page_lock_assert(m, a) \
- vm_page_lock_assert_KBI((m), (a), __FILE__, __LINE__)
-#else
-#define vm_page_assert_locked(m)
-#define vm_page_lock_assert(m, a)
-#endif
/*
* The vm_page's aflags are updated using atomic operations. To set or clear
@@ -713,13 +677,6 @@ vm_page_bits_t vm_page_bits(int base, int size);
void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid);
void vm_page_dirty_KBI(vm_page_t m);
-void vm_page_lock_KBI(vm_page_t m, const char *file, int line);
-void vm_page_unlock_KBI(vm_page_t m, const char *file, int line);
-int vm_page_trylock_KBI(vm_page_t m, const char *file, int line);
-#if defined(INVARIANTS) || defined(INVARIANT_SUPPORT)
-void vm_page_assert_locked_KBI(vm_page_t m, const char *file, int line);
-void vm_page_lock_assert_KBI(vm_page_t m, int a, const char *file, int line);
-#endif
#define vm_page_busy_fetch(m) atomic_load_int(&(m)->busy_lock)
diff --git a/sys/vm/vm_param.h b/sys/vm/vm_param.h
index c18dfef97ed4..51b7fdadbf88 100644
--- a/sys/vm/vm_param.h
+++ b/sys/vm/vm_param.h
@@ -112,14 +112,6 @@ struct xswdev {
#define KERN_OUT_OF_BOUNDS 9
#define KERN_RESTART 10
-#ifndef PA_LOCK_COUNT
-#ifdef SMP
-#define PA_LOCK_COUNT 32
-#else
-#define PA_LOCK_COUNT 1
-#endif /* !SMP */
-#endif /* !PA_LOCK_COUNT */
-
#ifndef KSTACK_MAX_PAGES
#define KSTACK_MAX_PAGES 32
#endif