Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F153157023
D24652.id76788.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D24652.id76788.diff
View Options
Index: head/sys/vm/uma_core.c
===================================================================
--- head/sys/vm/uma_core.c
+++ head/sys/vm/uma_core.c
@@ -3611,7 +3611,7 @@
break;
if (rr && vm_domainset_iter_policy(&di, &domain) != 0) {
if ((flags & M_WAITOK) != 0) {
- vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask);
+ vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0);
goto restart;
}
break;
@@ -4755,7 +4755,7 @@
break;
}
if (vm_domainset_iter_policy(&di, &domain) != 0)
- vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask);
+ vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0);
}
}
}
Index: head/sys/vm/vm_domainset.h
===================================================================
--- head/sys/vm/vm_domainset.h
+++ head/sys/vm/vm_domainset.h
@@ -50,6 +50,6 @@
void vm_domainset_iter_policy_ref_init(struct vm_domainset_iter *,
struct domainset_ref *, int *, int *);
-void vm_wait_doms(const domainset_t *);
+int vm_wait_doms(const domainset_t *, int mflags);
#endif /* __VM_DOMAINSET_H__ */
Index: head/sys/vm/vm_domainset.c
===================================================================
--- head/sys/vm/vm_domainset.c
+++ head/sys/vm/vm_domainset.c
@@ -245,7 +245,7 @@
/* Wait for one of the domains to accumulate some free pages. */
if (obj != NULL)
VM_OBJECT_WUNLOCK(obj);
- vm_wait_doms(&di->di_domain->ds_mask);
+ vm_wait_doms(&di->di_domain->ds_mask, 0);
if (obj != NULL)
VM_OBJECT_WLOCK(obj);
if ((di->di_flags & VM_ALLOC_WAITFAIL) != 0)
@@ -310,7 +310,7 @@
return (ENOMEM);
/* Wait for one of the domains to accumulate some free pages. */
- vm_wait_doms(&di->di_domain->ds_mask);
+ vm_wait_doms(&di->di_domain->ds_mask, 0);
/* Restart the search. */
vm_domainset_iter_first(di, domain);
Index: head/sys/vm/vm_glue.c
===================================================================
--- head/sys/vm/vm_glue.c
+++ head/sys/vm/vm_glue.c
@@ -565,7 +565,7 @@
}
dset = td2->td_domain.dr_policy;
while (vm_page_count_severe_set(&dset->ds_mask)) {
- vm_wait_doms(&dset->ds_mask);
+ vm_wait_doms(&dset->ds_mask, 0);
}
if ((flags & RFMEM) == 0) {
Index: head/sys/vm/vm_page.c
===================================================================
--- head/sys/vm/vm_page.c
+++ head/sys/vm/vm_page.c
@@ -3147,10 +3147,13 @@
return (vm_severe_waiters + vm_min_waiters + vm_pageproc_waiters);
}
-void
-vm_wait_doms(const domainset_t *wdoms)
+int
+vm_wait_doms(const domainset_t *wdoms, int mflags)
{
+ int error;
+ error = 0;
+
/*
* We use racey wakeup synchronization to avoid expensive global
* locking for the pageproc when sleeping with a non-specific vm_wait.
@@ -3162,8 +3165,8 @@
if (curproc == pageproc) {
mtx_lock(&vm_domainset_lock);
vm_pageproc_waiters++;
- msleep(&vm_pageproc_waiters, &vm_domainset_lock, PVM | PDROP,
- "pageprocwait", 1);
+ error = msleep(&vm_pageproc_waiters, &vm_domainset_lock,
+ PVM | PDROP | mflags, "pageprocwait", 1);
} else {
/*
* XXX Ideally we would wait only until the allocation could
@@ -3173,11 +3176,12 @@
mtx_lock(&vm_domainset_lock);
if (vm_page_count_min_set(wdoms)) {
vm_min_waiters++;
- msleep(&vm_min_domains, &vm_domainset_lock,
- PVM | PDROP, "vmwait", 0);
+ error = msleep(&vm_min_domains, &vm_domainset_lock,
+ PVM | PDROP | mflags, "vmwait", 0);
} else
mtx_unlock(&vm_domainset_lock);
}
+ return (error);
}
/*
@@ -3208,20 +3212,12 @@
panic("vm_wait in early boot");
DOMAINSET_ZERO(&wdom);
DOMAINSET_SET(vmd->vmd_domain, &wdom);
- vm_wait_doms(&wdom);
+ vm_wait_doms(&wdom, 0);
}
}
-/*
- * vm_wait:
- *
- * Sleep until free pages are available for allocation in the
- * affinity domains of the obj. If obj is NULL, the domain set
- * for the calling thread is used.
- * Called in various places after failed memory allocations.
- */
-void
-vm_wait(vm_object_t obj)
+static int
+vm_wait_flags(vm_object_t obj, int mflags)
{
struct domainset *d;
@@ -3236,7 +3232,27 @@
if (d == NULL)
d = curthread->td_domain.dr_policy;
- vm_wait_doms(&d->ds_mask);
+ return (vm_wait_doms(&d->ds_mask, mflags));
+}
+
+/*
+ * vm_wait:
+ *
+ * Sleep until free pages are available for allocation in the
+ * affinity domains of the obj. If obj is NULL, the domain set
+ * for the calling thread is used.
+ * Called in various places after failed memory allocations.
+ */
+void
+vm_wait(vm_object_t obj)
+{
+ (void)vm_wait_flags(obj, 0);
+}
+
+int
+vm_wait_intr(vm_object_t obj)
+{
+ return (vm_wait_flags(obj, PCATCH));
}
/*
Index: head/sys/vm/vm_pageout.h
===================================================================
--- head/sys/vm/vm_pageout.h
+++ head/sys/vm/vm_pageout.h
@@ -97,6 +97,7 @@
*/
void vm_wait(vm_object_t obj);
+int vm_wait_intr(vm_object_t obj);
void vm_waitpfault(struct domainset *, int timo);
void vm_wait_domain(int domain);
void vm_wait_min(void);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Apr 20, 12:46 PM (14 h, 5 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31840338
Default Alt Text
D24652.id76788.diff (4 KB)
Attached To
Mode
D24652: Non-transparent superpages support.
Attached
Detach File
Event Timeline
Log In to Comment