Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F157327773
D50392.id155608.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D50392.id155608.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D50392: vm_page: reset iterator after domainset drops lock
Attached
Detach File
Event Timeline
Log In to Comment