diff options
| author | Alan Cox <alc@FreeBSD.org> | 2003-09-08 02:45:03 +0000 |
|---|---|---|
| committer | Alan Cox <alc@FreeBSD.org> | 2003-09-08 02:45:03 +0000 |
| commit | ba2157f21867991a390cd590ec7f7ed44e7a18c1 (patch) | |
| tree | b2790809d73f520fb71ebb6aa2acc4efb7933854 /sys | |
| parent | a94100fa9b9ddccb74164cb9407e69fba557dbac (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/alpha/alpha/pmap.c | 23 | ||||
| -rw-r--r-- | sys/amd64/amd64/pmap.c | 24 | ||||
| -rw-r--r-- | sys/i386/i386/pmap.c | 24 | ||||
| -rw-r--r-- | sys/ia64/ia64/pmap.c | 24 | ||||
| -rw-r--r-- | sys/sparc64/sparc64/pmap.c | 22 | ||||
| -rw-r--r-- | sys/vm/pmap.h | 1 |
6 files changed, 118 insertions, 0 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c index 223d82408dab..a2f5a50dea3c 100644 --- a/sys/alpha/alpha/pmap.c +++ b/sys/alpha/alpha/pmap.c @@ -811,6 +811,29 @@ pmap_extract(pmap, va) return 0; } +/* + * Routine: pmap_extract_and_hold + * Function: + * Atomically extract and hold the physical page + * with the given pmap and virtual address. + */ +vm_page_t +pmap_extract_and_hold(pmap_t pmap, vm_offset_t va) +{ + vm_paddr_t pa; + vm_page_t m; + + m = NULL; + mtx_lock(&Giant); + if ((pa = pmap_extract(pmap, va)) != 0) { + m = PHYS_TO_VM_PAGE(pa); + vm_page_lock_queues(); + vm_page_hold(m); + vm_page_unlock_queues(); + } + mtx_unlock(&Giant); + return (m); +} /*************************************************** * Low level mapping routines..... diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index e862c82196c1..fed7dac8a6b6 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -749,6 +749,30 @@ pmap_extract(pmap, va) } +/* + * Routine: pmap_extract_and_hold + * Function: + * Atomically extract and hold the physical page + * with the given pmap and virtual address. + */ +vm_page_t +pmap_extract_and_hold(pmap_t pmap, vm_offset_t va) +{ + vm_paddr_t pa; + vm_page_t m; + + m = NULL; + mtx_lock(&Giant); + if ((pa = pmap_extract(pmap, va)) != 0) { + m = PHYS_TO_VM_PAGE(pa); + vm_page_lock_queues(); + vm_page_hold(m); + vm_page_unlock_queues(); + } + mtx_unlock(&Giant); + return (m); +} + vm_paddr_t pmap_kextract(vm_offset_t va) { diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 1f13890fa362..924a14f4887b 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -861,6 +861,30 @@ pmap_extract(pmap, va) } +/* + * Routine: pmap_extract_and_hold + * Function: + * Atomically extract and hold the physical page + * with the given pmap and virtual address. + */ +vm_page_t +pmap_extract_and_hold(pmap_t pmap, vm_offset_t va) +{ + vm_paddr_t pa; + vm_page_t m; + + m = NULL; + mtx_lock(&Giant); + if ((pa = pmap_extract(pmap, va)) != 0) { + m = PHYS_TO_VM_PAGE(pa); + vm_page_lock_queues(); + vm_page_hold(m); + vm_page_unlock_queues(); + } + mtx_unlock(&Giant); + return (m); +} + /*************************************************** * Low level mapping routines..... ***************************************************/ diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c index 8b0a8c0411a9..f5f54599f49f 100644 --- a/sys/ia64/ia64/pmap.c +++ b/sys/ia64/ia64/pmap.c @@ -1102,6 +1102,30 @@ pmap_extract(pmap, va) return pmap_pte_pa(pte); } +/* + * Routine: pmap_extract_and_hold + * Function: + * Atomically extract and hold the physical page + * with the given pmap and virtual address. + */ +vm_page_t +pmap_extract_and_hold(pmap_t pmap, vm_offset_t va) +{ + vm_paddr_t pa; + vm_page_t m; + + m = NULL; + mtx_lock(&Giant); + if ((pa = pmap_extract(pmap, va)) != 0) { + m = PHYS_TO_VM_PAGE(pa); + vm_page_lock_queues(); + vm_page_hold(m); + vm_page_unlock_queues(); + } + mtx_unlock(&Giant); + return (m); +} + /*************************************************** * Low level mapping routines..... ***************************************************/ diff --git a/sys/sparc64/sparc64/pmap.c b/sys/sparc64/sparc64/pmap.c index f4a391be623a..f53215210520 100644 --- a/sys/sparc64/sparc64/pmap.c +++ b/sys/sparc64/sparc64/pmap.c @@ -621,6 +621,28 @@ pmap_extract(pmap_t pm, vm_offset_t va) } /* + * Atomically extract and hold the physical page with the given + * pmap and virtual address pair. + */ +vm_page_t +pmap_extract_and_hold(pmap_t pmap, vm_offset_t va) +{ + vm_paddr_t pa; + vm_page_t m; + + m = NULL; + mtx_lock(&Giant); + if ((pa = pmap_extract(pmap, va)) != 0) { + m = PHYS_TO_VM_PAGE(pa); + vm_page_lock_queues(); + vm_page_hold(m); + vm_page_unlock_queues(); + } + mtx_unlock(&Giant); + return (m); +} + +/* * Extract the physical page address associated with the given kernel virtual * address. */ diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h index af809bbbbd0c..29f20c259602 100644 --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -106,6 +106,7 @@ void pmap_enter(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, vm_page_t pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte); vm_paddr_t pmap_extract(pmap_t pmap, vm_offset_t va); +vm_page_t pmap_extract_and_hold(pmap_t pmap, vm_offset_t va); void pmap_growkernel(vm_offset_t); void pmap_init(vm_paddr_t, vm_paddr_t); boolean_t pmap_is_modified(vm_page_t m); |
