diff options
author | kib <kib@FreeBSD.org> | 2014-08-08 17:12:03 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2014-08-08 17:12:03 +0000 |
commit | 094158b3f2a6f1f1c94fd8c1357192c5d7486a79 (patch) | |
tree | 0e7cb8ef3548f12ba3d175300ec28e89f06df725 /sys/vm | |
parent | 3ed5bde00cf51c1adc0152be002adec285130187 (diff) | |
download | FreeBSD-src-094158b3f2a6f1f1c94fd8c1357192c5d7486a79.zip FreeBSD-src-094158b3f2a6f1f1c94fd8c1357192c5d7486a79.tar.gz |
Change pmap_enter(9) interface to take flags parameter and superpage
mapping size (currently unused). The flags includes the fault access
bits, wired flag as PMAP_ENTER_WIRED, and a new flag
PMAP_ENTER_NOSLEEP to indicate that pmap should not sleep.
For powerpc aim both 32 and 64 bit, fix implementation to ensure that
the requested mapping is created when PMAP_ENTER_NOSLEEP is not
specified, in particular, wait for the available memory required to
proceed.
In collaboration with: alc
Tested by: nwhitehorn (ppc aim32 and booke)
Sponsored by: The FreeBSD Foundation and EMC / Isilon Storage Division
MFC after: 2 weeks
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/pmap.h | 11 | ||||
-rw-r--r-- | sys/vm/vm_fault.c | 6 | ||||
-rw-r--r-- | sys/vm/vm_kern.c | 11 |
3 files changed, 19 insertions, 9 deletions
diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h index 1f2a017..d73babc 100644 --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -97,6 +97,13 @@ struct thread; */ extern vm_offset_t kernel_vm_end; +/* + * Flags for pmap_enter(). The bits in the low-order byte are reserved + * for the protection code (vm_prot_t) that describes the fault type. + */ +#define PMAP_ENTER_NOSLEEP 0x0100 +#define PMAP_ENTER_WIRED 0x0200 + void pmap_activate(struct thread *td); void pmap_advise(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, int advice); @@ -107,8 +114,8 @@ void pmap_copy(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t); void pmap_copy_page(vm_page_t, vm_page_t); void pmap_copy_pages(vm_page_t ma[], vm_offset_t a_offset, vm_page_t mb[], vm_offset_t b_offset, int xfersize); -void pmap_enter(pmap_t, vm_offset_t, vm_prot_t, vm_page_t, - vm_prot_t, boolean_t); +int pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, + vm_prot_t prot, u_int flags, int8_t psind); void pmap_enter_object(pmap_t pmap, vm_offset_t start, vm_offset_t end, vm_page_t m_start, vm_prot_t prot); void pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index cedc59c..5a1b2c2 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -902,7 +902,8 @@ vnode_locked: * back on the active queue until later so that the pageout daemon * won't find it (yet). */ - pmap_enter(fs.map->pmap, vaddr, fault_type, fs.m, prot, wired); + pmap_enter(fs.map->pmap, vaddr, fs.m, prot, + fault_type | (wired ? PMAP_ENTER_WIRED : 0), 0); if (faultcount != 1 && (fault_flags & VM_FAULT_CHANGE_WIRING) == 0 && wired == 0) vm_fault_prefault(&fs, vaddr, faultcount, reqpage); @@ -1318,7 +1319,8 @@ again: * mapping is being replaced by a write-enabled * mapping, then wire that new mapping. */ - pmap_enter(dst_map->pmap, vaddr, access, dst_m, prot, upgrade); + pmap_enter(dst_map->pmap, vaddr, dst_m, prot, + access | (upgrade ? PMAP_ENTER_WIRED : 0), 0); /* * Mark it no longer busy, and put it on the active list. diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c index 37c0a27..5aa15e8 100644 --- a/sys/vm/vm_kern.c +++ b/sys/vm/vm_kern.c @@ -202,8 +202,8 @@ retry: if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) pmap_zero_page(m); m->valid = VM_PAGE_BITS_ALL; - pmap_enter(kernel_pmap, addr + i, VM_PROT_ALL, m, VM_PROT_ALL, - TRUE); + pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, + VM_PROT_ALL | PMAP_ENTER_WIRED, 0); } VM_OBJECT_WUNLOCK(object); return (addr); @@ -255,7 +255,8 @@ retry: if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) pmap_zero_page(m); m->valid = VM_PAGE_BITS_ALL; - pmap_enter(kernel_pmap, tmp, VM_PROT_ALL, m, VM_PROT_ALL, true); + pmap_enter(kernel_pmap, tmp, m, VM_PROT_ALL, + VM_PROT_ALL | PMAP_ENTER_WIRED, 0); tmp += PAGE_SIZE; } VM_OBJECT_WUNLOCK(object); @@ -378,8 +379,8 @@ retry: KASSERT((m->oflags & VPO_UNMANAGED) != 0, ("kmem_malloc: page %p is managed", m)); m->valid = VM_PAGE_BITS_ALL; - pmap_enter(kernel_pmap, addr + i, VM_PROT_ALL, m, VM_PROT_ALL, - TRUE); + pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, + VM_PROT_ALL | PMAP_ENTER_WIRED, 0); } VM_OBJECT_WUNLOCK(object); |