mirror of
https://github.com/opnsense/src.git
synced 2026-06-11 09:41:03 -04:00
vm_page: update comments and KASSERT()s concerning page allocation
Update the legend describing the arguments to the most commonly used
page allocation functions. Notably, eliminate a reference to a function
that no longer exists; and update to reflect the elimination of
VM_ALLOC_NOOBJ, specifically, VM_ALLOC_WAITOK is no longer a legal
option to vm_page_alloc{,_contig}().
Eliminate a nonsensical KASSERT(). VM_ALLOC_SBUSY is forbidden as an
argument to vm_page_alloc_noobj{,_contig,}_domain() by a KASSERT(), so
having a different KASSERT() that tests for it is nonsensical.
Strengthen other KASSERT()s involving VM_ALLOC_NOBUSY and
VM_ALLOC_NOFREE.
Reviewed by: kib, markj, dougm (an earlier version)
Differential Revision: https://reviews.freebsd.org/D49391
This commit is contained in:
parent
ff11f1c8c7
commit
07297aee35
2 changed files with 51 additions and 40 deletions
|
|
@ -1983,7 +1983,10 @@ vm_page_iter_rename(struct pctrie_iter *old_pages, vm_page_t m,
|
|||
* intends to allocate
|
||||
* VM_ALLOC_NOBUSY do not exclusive busy the page
|
||||
* VM_ALLOC_NODUMP do not include the page in a kernel core dump
|
||||
* VM_ALLOC_NOFREE page will never be freed
|
||||
* VM_ALLOC_NOWAIT ignored (default behavior)
|
||||
* VM_ALLOC_SBUSY shared busy the allocated page
|
||||
* VM_ALLOC_WAITFAIL in case of failure, sleep before returning
|
||||
* VM_ALLOC_WIRED wire the allocated page
|
||||
* VM_ALLOC_ZERO prefer a zeroed page
|
||||
*/
|
||||
|
|
@ -2081,11 +2084,12 @@ vm_page_alloc_domain_iter(vm_object_t object, vm_pindex_t pindex, int domain,
|
|||
vm_page_t m;
|
||||
int flags;
|
||||
|
||||
#define VPA_FLAGS (VM_ALLOC_CLASS_MASK | VM_ALLOC_WAITFAIL | \
|
||||
VM_ALLOC_NOWAIT | VM_ALLOC_NOBUSY | \
|
||||
VM_ALLOC_SBUSY | VM_ALLOC_WIRED | \
|
||||
VM_ALLOC_NODUMP | VM_ALLOC_ZERO | \
|
||||
VM_ALLOC_NOFREE | VM_ALLOC_COUNT_MASK)
|
||||
#define VM_ALLOC_COMMON (VM_ALLOC_CLASS_MASK | VM_ALLOC_NODUMP | \
|
||||
VM_ALLOC_NOWAIT | VM_ALLOC_WAITFAIL | \
|
||||
VM_ALLOC_WIRED | VM_ALLOC_ZERO)
|
||||
#define VPA_FLAGS (VM_ALLOC_COMMON | VM_ALLOC_COUNT_MASK | \
|
||||
VM_ALLOC_NOBUSY | VM_ALLOC_NOFREE | \
|
||||
VM_ALLOC_SBUSY)
|
||||
KASSERT((req & ~VPA_FLAGS) == 0,
|
||||
("invalid request %#x", req));
|
||||
KASSERT(((req & (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)) !=
|
||||
|
|
@ -2234,15 +2238,18 @@ found:
|
|||
*
|
||||
* allocation classes:
|
||||
* VM_ALLOC_NORMAL normal process request
|
||||
* VM_ALLOC_SYSTEM system *really* needs a page
|
||||
* VM_ALLOC_SYSTEM system *really* needs the pages
|
||||
* VM_ALLOC_INTERRUPT interrupt time request
|
||||
*
|
||||
* optional allocation flags:
|
||||
* VM_ALLOC_NOBUSY do not exclusive busy the page
|
||||
* VM_ALLOC_NODUMP do not include the page in a kernel core dump
|
||||
* VM_ALLOC_SBUSY shared busy the allocated page
|
||||
* VM_ALLOC_WIRED wire the allocated page
|
||||
* VM_ALLOC_ZERO prefer a zeroed page
|
||||
* VM_ALLOC_NOBUSY do not exclusive busy the pages
|
||||
* VM_ALLOC_NODUMP do not include the pages in a kernel core dump
|
||||
* VM_ALLOC_NORECLAIM do not reclaim after initial failure
|
||||
* VM_ALLOC_NOWAIT ignored (default behavior)
|
||||
* VM_ALLOC_SBUSY shared busy the allocated pages
|
||||
* VM_ALLOC_WAITFAIL in case of failure, sleep before returning
|
||||
* VM_ALLOC_WIRED wire the allocated pages
|
||||
* VM_ALLOC_ZERO prefer zeroed pages
|
||||
*/
|
||||
vm_page_t
|
||||
vm_page_alloc_contig(vm_object_t object, vm_pindex_t pindex, int req,
|
||||
|
|
@ -2321,7 +2328,9 @@ vm_page_alloc_contig_domain(vm_object_t object, vm_pindex_t pindex, int domain,
|
|||
vm_page_t m, m_ret, mpred;
|
||||
u_int busy_lock, flags, oflags;
|
||||
|
||||
#define VPAC_FLAGS (VPA_FLAGS | VM_ALLOC_NORECLAIM)
|
||||
#define VPAC_FLAGS (VM_ALLOC_COMMON | VM_ALLOC_COUNT_MASK | \
|
||||
VM_ALLOC_NOBUSY | VM_ALLOC_NORECLAIM | \
|
||||
VM_ALLOC_SBUSY)
|
||||
KASSERT((req & ~VPAC_FLAGS) == 0,
|
||||
("invalid request %#x", req));
|
||||
KASSERT(((req & (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)) !=
|
||||
|
|
@ -2422,11 +2431,8 @@ vm_page_alloc_noobj_domain(int domain, int req)
|
|||
vm_page_t m;
|
||||
int flags;
|
||||
|
||||
#define VPAN_FLAGS (VM_ALLOC_CLASS_MASK | VM_ALLOC_WAITFAIL | \
|
||||
VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | \
|
||||
VM_ALLOC_NOBUSY | VM_ALLOC_WIRED | \
|
||||
VM_ALLOC_NODUMP | VM_ALLOC_ZERO | \
|
||||
VM_ALLOC_NOFREE | VM_ALLOC_COUNT_MASK)
|
||||
#define VPAN_FLAGS (VM_ALLOC_COMMON | VM_ALLOC_COUNT_MASK | \
|
||||
VM_ALLOC_NOFREE | VM_ALLOC_WAITOK)
|
||||
KASSERT((req & ~VPAN_FLAGS) == 0,
|
||||
("invalid request %#x", req));
|
||||
|
||||
|
|
@ -2624,15 +2630,13 @@ vm_page_alloc_noobj_contig_domain(int domain, int req, u_long npages,
|
|||
vm_page_t m, m_ret;
|
||||
u_int flags;
|
||||
|
||||
#define VPANC_FLAGS (VPAN_FLAGS | VM_ALLOC_NORECLAIM)
|
||||
#define VPANC_FLAGS (VM_ALLOC_COMMON | VM_ALLOC_COUNT_MASK | \
|
||||
VM_ALLOC_NORECLAIM | VM_ALLOC_WAITOK)
|
||||
KASSERT((req & ~VPANC_FLAGS) == 0,
|
||||
("invalid request %#x", req));
|
||||
KASSERT((req & (VM_ALLOC_WAITOK | VM_ALLOC_NORECLAIM)) !=
|
||||
(VM_ALLOC_WAITOK | VM_ALLOC_NORECLAIM),
|
||||
("invalid request %#x", req));
|
||||
KASSERT(((req & (VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)) !=
|
||||
(VM_ALLOC_NOBUSY | VM_ALLOC_SBUSY)),
|
||||
("invalid request %#x", req));
|
||||
KASSERT(npages > 0, ("vm_page_alloc_contig: npages is zero"));
|
||||
|
||||
while ((m_ret = vm_page_find_contig_domain(domain, req, npages,
|
||||
|
|
@ -5141,15 +5145,20 @@ vm_page_grab_valid_unlocked(vm_page_t *mp, vm_object_t object,
|
|||
* allocation classes:
|
||||
* VM_ALLOC_NORMAL normal process request
|
||||
* VM_ALLOC_SYSTEM system *really* needs the pages
|
||||
* VM_ALLOC_INTERRUPT interrupt time request
|
||||
*
|
||||
* The caller must always specify that the pages are to be busied and/or
|
||||
* wired.
|
||||
*
|
||||
* optional allocation flags:
|
||||
* VM_ALLOC_IGN_SBUSY do not sleep on soft busy pages
|
||||
* VM_ALLOC_NOBUSY do not exclusive busy the page
|
||||
* VM_ALLOC_NOBUSY do not exclusive busy the pages
|
||||
* VM_ALLOC_NODUMP do not include the pages in a kernel core dump
|
||||
* VM_ALLOC_NOFREE pages will never be freed
|
||||
* VM_ALLOC_NOWAIT do not sleep
|
||||
* VM_ALLOC_SBUSY set page to sbusy state
|
||||
* VM_ALLOC_SBUSY set pages to sbusy state
|
||||
* VM_ALLOC_WAITFAIL in case of failure, sleep before returning
|
||||
* VM_ALLOC_WAITOK ignored (default behavior)
|
||||
* VM_ALLOC_WIRED wire the pages
|
||||
* VM_ALLOC_ZERO zero and validate any invalid pages
|
||||
*
|
||||
|
|
|
|||
|
|
@ -462,13 +462,15 @@ extern long first_page; /* first physical page number */
|
|||
vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa);
|
||||
|
||||
/*
|
||||
* Page allocation parameters for vm_page for the functions
|
||||
* vm_page_alloc(), vm_page_grab(), vm_page_alloc_contig() and
|
||||
* vm_page_alloc_freelist(). Some functions support only a subset
|
||||
* of the flags, and ignore others, see the flags legend.
|
||||
* vm_page allocation arguments for the functions vm_page_alloc(),
|
||||
* vm_page_alloc_contig(), vm_page_alloc_noobj(), vm_page_grab(), and
|
||||
* vm_page_grab_pages(). Each function supports only a subset of the flags.
|
||||
* See the flags legend.
|
||||
*
|
||||
* The meaning of VM_ALLOC_ZERO differs slightly between the vm_page_alloc*()
|
||||
* and the vm_page_grab*() functions. See these functions for details.
|
||||
* The meaning of VM_ALLOC_ZERO varies: vm_page_alloc_noobj(), vm_page_grab(),
|
||||
* and vm_page_grab_pages() guarantee that the returned pages are zeroed; in
|
||||
* contrast vm_page_alloc() and vm_page_alloc_contig() do not, leaving it to
|
||||
* the caller to test the page's flags for PG_ZERO.
|
||||
*
|
||||
* Bits 0 - 1 define class.
|
||||
* Bits 2 - 15 dedicated for flags.
|
||||
|
|
@ -476,7 +478,7 @@ vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa);
|
|||
* (a) - vm_page_alloc() supports the flag.
|
||||
* (c) - vm_page_alloc_contig() supports the flag.
|
||||
* (g) - vm_page_grab() supports the flag.
|
||||
* (n) - vm_page_alloc_noobj() and vm_page_alloc_freelist() support the flag.
|
||||
* (n) - vm_page_alloc_noobj() supports the flag.
|
||||
* (p) - vm_page_grab_pages() supports the flag.
|
||||
* Bits above 15 define the count of additional pages that the caller
|
||||
* intends to allocate.
|
||||
|
|
@ -485,26 +487,26 @@ vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa);
|
|||
#define VM_ALLOC_INTERRUPT 1
|
||||
#define VM_ALLOC_SYSTEM 2
|
||||
#define VM_ALLOC_CLASS_MASK 3
|
||||
#define VM_ALLOC_WAITOK 0x0008 /* (acn) Sleep and retry */
|
||||
#define VM_ALLOC_WAITFAIL 0x0010 /* (acn) Sleep and return error */
|
||||
#define VM_ALLOC_WAITOK 0x0008 /* (gnp) Sleep and retry */
|
||||
#define VM_ALLOC_WAITFAIL 0x0010 /* (acgnp) Sleep and return error */
|
||||
#define VM_ALLOC_WIRED 0x0020 /* (acgnp) Allocate a wired page */
|
||||
#define VM_ALLOC_ZERO 0x0040 /* (acgnp) Allocate a zeroed page */
|
||||
#define VM_ALLOC_NORECLAIM 0x0080 /* (c) Do not reclaim after failure */
|
||||
#define VM_ALLOC_NOFREE 0x0100 /* (an) Page will never be released */
|
||||
#define VM_ALLOC_NOFREE 0x0100 /* (agnp) Page will never be freed */
|
||||
#define VM_ALLOC_NOBUSY 0x0200 /* (acgp) Do not excl busy the page */
|
||||
#define VM_ALLOC_NOCREAT 0x0400 /* (gp) Don't create a page */
|
||||
#define VM_ALLOC_NOCREAT 0x0400 /* (gp) Do not allocate a page */
|
||||
#define VM_ALLOC_AVAIL1 0x0800
|
||||
#define VM_ALLOC_IGN_SBUSY 0x1000 /* (gp) Ignore shared busy flag */
|
||||
#define VM_ALLOC_NODUMP 0x2000 /* (ag) don't include in dump */
|
||||
#define VM_ALLOC_IGN_SBUSY 0x1000 /* (gp) Ignore shared busy state */
|
||||
#define VM_ALLOC_NODUMP 0x2000 /* (acgnp) Do not include in dump */
|
||||
#define VM_ALLOC_SBUSY 0x4000 /* (acgp) Shared busy the page */
|
||||
#define VM_ALLOC_NOWAIT 0x8000 /* (acgnp) Do not sleep */
|
||||
#define VM_ALLOC_COUNT_MAX 0xffff
|
||||
#define VM_ALLOC_COUNT_SHIFT 16
|
||||
#define VM_ALLOC_COUNT_MASK (VM_ALLOC_COUNT(VM_ALLOC_COUNT_MAX))
|
||||
#define VM_ALLOC_COUNT(count) ({ \
|
||||
KASSERT((count) <= VM_ALLOC_COUNT_MAX, \
|
||||
("%s: invalid VM_ALLOC_COUNT value", __func__)); \
|
||||
(count) << VM_ALLOC_COUNT_SHIFT; \
|
||||
#define VM_ALLOC_COUNT(count) ({ /* (acgn) Additional pages */ \
|
||||
KASSERT((count) <= VM_ALLOC_COUNT_MAX, \
|
||||
("%s: invalid VM_ALLOC_COUNT value", __func__)); \
|
||||
(count) << VM_ALLOC_COUNT_SHIFT; \
|
||||
})
|
||||
|
||||
#ifdef M_NOWAIT
|
||||
|
|
|
|||
Loading…
Reference in a new issue