37#include <sys/bitset.h>
38#include <sys/domainset.h>
42#include <sys/malloc.h>
43#include <sys/rwlock.h>
44#include <sys/vmmeter.h>
60static int vm_domainset_default_stride = 64;
67 int *iter,
struct vm_object *obj, vm_pindex_t pindex)
73 if (di->
di_policy == DOMAINSET_POLICY_INTERLEAVE) {
74#if VM_NRESERVLEVEL > 0
81 pindex >>= VM_LEVEL_0_ORDER;
84 pindex /= vm_domainset_default_stride;
90 pindex += (((uintptr_t)obj) /
sizeof(*obj));
131 KASSERT(di->
di_n > 0,
132 (
"vm_domainset_iter_first: Invalid n %d", di->
di_n));
134 case DOMAINSET_POLICY_FIRSTTOUCH:
140 case DOMAINSET_POLICY_INTERLEAVE:
142 case DOMAINSET_POLICY_ROUNDROBIN:
143 vm_domainset_iter_rr(di, domain);
145 case DOMAINSET_POLICY_PREFER:
146 vm_domainset_iter_prefer(di, domain);
149 panic(
"vm_domainset_iter_first: Unknown policy %d",
153 (
"vm_domainset_iter_next: Invalid domain %d", *domain));
161 case DOMAINSET_POLICY_FIRSTTOUCH:
162 *domain = PCPU_GET(domain);
163 if (DOMAINSET_ISSET(*domain, &di->
di_domain->ds_mask)) {
176 case DOMAINSET_POLICY_ROUNDROBIN:
178 vm_domainset_iter_rr(di, domain);
180 case DOMAINSET_POLICY_PREFER:
184 case DOMAINSET_POLICY_INTERLEAVE:
185 vm_domainset_iter_interleave(di, domain);
189 panic(
"vm_domainset_iter_first: Unknown policy %d",
192 KASSERT(di->
di_n > 0,
193 (
"vm_domainset_iter_first: Invalid n %d", di->
di_n));
195 (
"vm_domainset_iter_first: Invalid domain %d", *domain));
200 vm_pindex_t pindex,
int *domain,
int *req)
202 struct domainset_ref *dr;
209 if (obj != NULL && obj->
domain.dr_policy != NULL)
212 dr = &curthread->td_domain;
213 vm_domainset_iter_init(di, dr->dr_policy, &dr->dr_iter, obj, pindex);
217 vm_domainset_iter_first(di, domain);
218 if (vm_page_count_min_domain(*domain))
228 while (--di->
di_n != 0) {
229 vm_domainset_iter_next(di, domain);
230 if (!di->
di_minskip || !vm_page_count_min_domain(*domain))
237 vm_domainset_iter_first(di, domain);
255 vm_domainset_iter_first(di, domain);
266 *flags = (di->
di_flags & ~M_WAITOK) | M_NOWAIT;
267 vm_domainset_iter_first(di, domain);
268 if (vm_page_count_min_domain(*domain))
274 struct domainset *ds,
int *domain,
int *flags)
277 vm_domainset_iter_init(di, ds, &curthread->td_domain.dr_iter, NULL, 0);
278 _vm_domainset_iter_policy_init(di, domain, flags);
283 struct domainset_ref *dr,
int *domain,
int *flags)
286 vm_domainset_iter_init(di, dr->dr_policy, &dr->dr_iter, NULL, 0);
287 _vm_domainset_iter_policy_init(di, domain, flags);
295 while (--di->
di_n != 0) {
296 vm_domainset_iter_next(di, domain);
297 if (!di->
di_minskip || !vm_page_count_min_domain(*domain))
304 vm_domainset_iter_first(di, domain);
316 vm_domainset_iter_first(di, domain);
328 return (EJUSTRETURN);
333 vm_pindex_t pindex,
int *domain,
int *flags)
343 return (EJUSTRETURN);
348 struct domainset *ds,
int *domain,
int *flags)
356 struct domainset_ref *dr,
int *domain,
int *flags)
struct domainset * di_domain
struct domainset_ref domain
int vm_domainset_iter_page(struct vm_domainset_iter *di, struct vm_object *obj, int *domain)
void vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *di, struct domainset_ref *dr, int *domain, int *flags)
void vm_domainset_iter_page_init(struct vm_domainset_iter *di, struct vm_object *obj, vm_pindex_t pindex, int *domain, int *flags)
void vm_domainset_iter_policy_init(struct vm_domainset_iter *di, struct domainset *ds, int *domain, int *flags)
int vm_domainset_iter_policy(struct vm_domainset_iter *di, int *domain)
int vm_wait_doms(const domainset_t *, int mflags)
#define VM_OBJECT_WLOCK(object)
#define VM_OBJECT_WUNLOCK(object)
static __inline bool vm_object_reserv(vm_object_t object)
#define VM_ALLOC_WAITFAIL