Page MenuHomeFreeBSD

D50392.id155608.diff
No OneTemporary

D50392.id155608.diff

Index: sys/vm/vm_domainset.h
===================================================================
--- sys/vm/vm_domainset.h
+++ sys/vm/vm_domainset.h
@@ -40,9 +40,9 @@
};
int vm_domainset_iter_page(struct vm_domainset_iter *, struct vm_object *,
- int *);
+ int *, bool *);
void vm_domainset_iter_page_init(struct vm_domainset_iter *,
- struct vm_object *, vm_pindex_t, int *, int *);
+ struct vm_object *, vm_pindex_t, int *, int *, bool *);
int vm_domainset_iter_policy(struct vm_domainset_iter *, int *);
void vm_domainset_iter_policy_init(struct vm_domainset_iter *,
struct domainset *, int *, int *);
Index: sys/vm/vm_domainset.c
===================================================================
--- sys/vm/vm_domainset.c
+++ sys/vm/vm_domainset.c
@@ -199,7 +199,7 @@
void
vm_domainset_iter_page_init(struct vm_domainset_iter *di, struct vm_object *obj,
- vm_pindex_t pindex, int *domain, int *req)
+ vm_pindex_t pindex, int *domain, int *req, bool *unlocked)
{
struct domainset_ref *dr;
@@ -218,13 +218,15 @@
VM_ALLOC_NOWAIT;
vm_domainset_iter_first(di, domain);
if (vm_page_count_min_domain(*domain))
- vm_domainset_iter_page(di, obj, domain);
+ vm_domainset_iter_page(di, obj, domain, unlocked);
}
int
vm_domainset_iter_page(struct vm_domainset_iter *di, struct vm_object *obj,
- int *domain)
+ int *domain, bool *unlocked)
{
+ if (unlocked != NULL)
+ *unlocked = false;
if (__predict_false(DOMAINSET_EMPTY(&di->di_valid_mask)))
return (ENOMEM);
@@ -248,8 +250,11 @@
return (ENOMEM);
/* Wait for one of the domains to accumulate some free pages. */
- if (obj != NULL)
+ if (obj != NULL) {
VM_OBJECT_WUNLOCK(obj);
+ if (unlocked != NULL)
+ *unlocked = true;
+ }
vm_wait_doms(&di->di_valid_mask, 0);
if (obj != NULL)
VM_OBJECT_WLOCK(obj);
@@ -339,17 +344,21 @@
int
vm_domainset_iter_page(struct vm_domainset_iter *di, struct vm_object *obj,
- int *domain)
+ int *domain, bool *unlocked)
{
+ if (unlocked != NULL)
+ *unlocked = false;
return (EJUSTRETURN);
}
void
vm_domainset_iter_page_init(struct vm_domainset_iter *di, struct vm_object *obj,
- vm_pindex_t pindex, int *domain, int *flags)
+ vm_pindex_t pindex, int *domain, int *flags, bool *unlocked)
{
+ if (unlocked != NULL)
+ *unlocked = false;
*domain = 0;
}
Index: sys/vm/vm_glue.c
===================================================================
--- sys/vm/vm_glue.c
+++ sys/vm/vm_glue.c
@@ -453,7 +453,7 @@
obj = vm_thread_kstack_size_to_obj(pages);
if (vm_ndomains > 1)
obj->domain.dr_policy = ds;
- vm_domainset_iter_page_init(&di, obj, 0, &domain, &req);
+ vm_domainset_iter_page_init(&di, obj, 0, &domain, &req, NULL);
do {
/*
* Get a kernel virtual address for this thread's kstack.
@@ -480,7 +480,7 @@
vm_page_valid(ma[i]);
pmap_qenter(ks, ma, pages);
return (ks);
- } while (vm_domainset_iter_page(&di, obj, &domain) == 0);
+ } while (vm_domainset_iter_page(&di, obj, &domain, NULL) == 0);
return (0);
}
Index: sys/vm/vm_page.c
===================================================================
--- sys/vm/vm_page.c
+++ sys/vm/vm_page.c
@@ -2006,14 +2006,20 @@
struct vm_domainset_iter di;
vm_page_t m;
int domain;
+ bool unlocked;
- vm_domainset_iter_page_init(&di, object, pindex, &domain, &req);
+ vm_domainset_iter_page_init(&di, object, pindex, &domain, &req,
+ &unlocked);
do {
+ if (unlocked)
+ pctrie_iter_reset(pages);
m = vm_page_alloc_domain_iter(object, pindex, domain, req,
pages);
if (m != NULL)
break;
- } while (vm_domainset_iter_page(&di, object, &domain) == 0);
+ } while (vm_domainset_iter_page(&di, object, &domain, &unlocked) == 0);
+ if (unlocked)
+ pctrie_iter_reset(pages);
return (m);
}
@@ -2142,7 +2148,8 @@
* Not allocatable, give up.
*/
(void)vm_domain_alloc_fail(vmd, object, req);
- pctrie_iter_reset(pages);
+ if ((req & VM_ALLOC_WAITFAIL) != 0)
+ pctrie_iter_reset(pages);
return (NULL);
}
@@ -2254,7 +2261,7 @@
start_segind = -1;
- vm_domainset_iter_page_init(&di, object, pindex, &domain, &req);
+ vm_domainset_iter_page_init(&di, object, pindex, &domain, &req, NULL);
do {
m = vm_page_alloc_contig_domain(object, pindex, domain, req,
npages, low, high, alignment, boundary, memattr);
@@ -2266,7 +2273,7 @@
npages, low, high) == -1) {
vm_domainset_iter_ignore(&di, domain);
}
- } while (vm_domainset_iter_page(&di, object, &domain) == 0);
+ } while (vm_domainset_iter_page(&di, object, &domain, NULL) == 0);
return (m);
}
@@ -2576,12 +2583,12 @@
vm_page_t m;
int domain;
- vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req);
+ vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req, NULL);
do {
m = vm_page_alloc_noobj_domain(domain, req);
if (m != NULL)
break;
- } while (vm_domainset_iter_page(&di, NULL, &domain) == 0);
+ } while (vm_domainset_iter_page(&di, NULL, &domain, NULL) == 0);
return (m);
}
@@ -2595,13 +2602,13 @@
vm_page_t m;
int domain;
- vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req);
+ vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req, NULL);
do {
m = vm_page_alloc_noobj_contig_domain(domain, req, npages, low,
high, alignment, boundary, memattr);
if (m != NULL)
break;
- } while (vm_domainset_iter_page(&di, NULL, &domain) == 0);
+ } while (vm_domainset_iter_page(&di, NULL, &domain, NULL) == 0);
return (m);
}
@@ -3316,7 +3323,7 @@
ret = ERANGE;
- vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req);
+ vm_domainset_iter_page_init(&di, NULL, 0, &domain, &req, NULL);
do {
status = vm_page_reclaim_contig_domain(domain, req, npages, low,
high, alignment, boundary);
@@ -3329,7 +3336,7 @@
"from vm_page_reclaim_contig_domain()", status));
ret = ENOMEM;
}
- } while (vm_domainset_iter_page(&di, NULL, &domain) == 0);
+ } while (vm_domainset_iter_page(&di, NULL, &domain, NULL) == 0);
return (ret);
}

File Metadata

Mime Type
text/plain
Expires
Thu, May 21, 9:07 AM (2 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33383364
Default Alt Text
D50392.id155608.diff (5 KB)

Event Timeline