Author: kib
Date: Wed Sep 16 14:14:26 2020
New Revision: 365798
URL: https://svnweb.freebsd.org/changeset/base/365798

Log:
  MFC r365484:
  Add interruptible variant of vm_wait(9), vm_wait_intr(9).

Modified:
  stable/12/sys/vm/uma_core.c
  stable/12/sys/vm/vm_domainset.c
  stable/12/sys/vm/vm_domainset.h
  stable/12/sys/vm/vm_glue.c
  stable/12/sys/vm/vm_page.c
  stable/12/sys/vm/vm_pageout.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/vm/uma_core.c
==============================================================================
--- stable/12/sys/vm/uma_core.c Wed Sep 16 14:12:57 2020        (r365797)
+++ stable/12/sys/vm/uma_core.c Wed Sep 16 14:14:26 2020        (r365798)
@@ -2813,7 +2813,7 @@ restart:
                if (rr && vm_domainset_iter_policy(&di, &domain) != 0) {
                        if ((flags & M_WAITOK) != 0) {
                                KEG_UNLOCK(keg);
-                               vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask);
+                               vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0);
                                KEG_LOCK(keg);
                                goto restart;
                        }
@@ -3718,7 +3718,7 @@ uma_prealloc(uma_zone_t zone, int items)
                        KEG_LOCK(keg);
                        if (vm_domainset_iter_policy(&di, &domain) != 0) {
                                KEG_UNLOCK(keg);
-                               vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask);
+                               vm_wait_doms(&keg->uk_dr.dr_policy->ds_mask, 0);
                                KEG_LOCK(keg);
                        }
                }

Modified: stable/12/sys/vm/vm_domainset.c
==============================================================================
--- stable/12/sys/vm/vm_domainset.c     Wed Sep 16 14:12:57 2020        
(r365797)
+++ stable/12/sys/vm/vm_domainset.c     Wed Sep 16 14:14:26 2020        
(r365798)
@@ -245,7 +245,7 @@ vm_domainset_iter_page(struct vm_domainset_iter *di, s
        /* 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 @@ vm_domainset_iter_policy(struct vm_domainset_iter *di,
                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);

Modified: stable/12/sys/vm/vm_domainset.h
==============================================================================
--- stable/12/sys/vm/vm_domainset.h     Wed Sep 16 14:12:57 2020        
(r365797)
+++ stable/12/sys/vm/vm_domainset.h     Wed Sep 16 14:14:26 2020        
(r365798)
@@ -50,6 +50,6 @@ void  vm_domainset_iter_policy_init(struct vm_domainset
 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__ */

Modified: stable/12/sys/vm/vm_glue.c
==============================================================================
--- stable/12/sys/vm/vm_glue.c  Wed Sep 16 14:12:57 2020        (r365797)
+++ stable/12/sys/vm/vm_glue.c  Wed Sep 16 14:14:26 2020        (r365798)
@@ -560,7 +560,7 @@ vm_forkproc(struct thread *td, struct proc *p2, struct
        }
        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) {

Modified: stable/12/sys/vm/vm_page.c
==============================================================================
--- stable/12/sys/vm/vm_page.c  Wed Sep 16 14:12:57 2020        (r365797)
+++ stable/12/sys/vm/vm_page.c  Wed Sep 16 14:14:26 2020        (r365798)
@@ -2942,10 +2942,13 @@ vm_wait_count(void)
        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.
@@ -2957,8 +2960,8 @@ vm_wait_doms(const domainset_t *wdoms)
        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
@@ -2968,11 +2971,12 @@ vm_wait_doms(const domainset_t *wdoms)
                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);
 }
 
 /*
@@ -3003,20 +3007,12 @@ vm_wait_domain(int domain)
                        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;
 
@@ -3031,7 +3027,27 @@ vm_wait(vm_object_t obj)
        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));
 }
 
 /*

Modified: stable/12/sys/vm/vm_pageout.h
==============================================================================
--- stable/12/sys/vm/vm_pageout.h       Wed Sep 16 14:12:57 2020        
(r365797)
+++ stable/12/sys/vm/vm_pageout.h       Wed Sep 16 14:14:26 2020        
(r365798)
@@ -97,6 +97,7 @@ extern int vm_pageout_page_count;
  */
 
 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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to