Author: markj
Date: Fri Dec  6 18:51:16 2019
New Revision: 355458
URL: https://svnweb.freebsd.org/changeset/base/355458

Log:
  MFC r355003:
  Update the checks in vm_page_zone_import().

Modified:
  stable/12/sys/vm/vm_page.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/vm/vm_page.c
==============================================================================
--- stable/12/sys/vm/vm_page.c  Fri Dec  6 18:39:05 2019        (r355457)
+++ stable/12/sys/vm/vm_page.c  Fri Dec  6 18:51:16 2019        (r355458)
@@ -1755,21 +1755,14 @@ vm_page_alloc_after(vm_object_t object, vm_pindex_t pi
  * Returns true if the number of free pages exceeds the minimum
  * for the request class and false otherwise.
  */
-int
-vm_domain_allocate(struct vm_domain *vmd, int req, int npages)
+static int
+_vm_domain_allocate(struct vm_domain *vmd, int req_class, int npages)
 {
        u_int limit, old, new;
 
-       req = req & VM_ALLOC_CLASS_MASK;
-
-       /*
-        * The page daemon is allowed to dig deeper into the free page list.
-        */
-       if (curproc == pageproc && req != VM_ALLOC_INTERRUPT)
-               req = VM_ALLOC_SYSTEM;
-       if (req == VM_ALLOC_INTERRUPT)
+       if (req_class == VM_ALLOC_INTERRUPT)
                limit = 0;
-       else if (req == VM_ALLOC_SYSTEM)
+       else if (req_class == VM_ALLOC_SYSTEM)
                limit = vmd->vmd_interrupt_free_min;
        else
                limit = vmd->vmd_free_reserved;
@@ -1797,6 +1790,20 @@ vm_domain_allocate(struct vm_domain *vmd, int req, int
        return (1);
 }
 
+int
+vm_domain_allocate(struct vm_domain *vmd, int req, int npages)
+{
+       int req_class;
+
+       /*
+        * The page daemon is allowed to dig deeper into the free page list.
+        */
+       req_class = req & VM_ALLOC_CLASS_MASK;
+       if (curproc == pageproc && req_class != VM_ALLOC_INTERRUPT)
+               req_class = VM_ALLOC_SYSTEM;
+       return (_vm_domain_allocate(vmd, req_class, npages));
+}
+
 vm_page_t
 vm_page_alloc_domain_after(vm_object_t object, vm_pindex_t pindex, int domain,
     int req, vm_page_t mpred)
@@ -2244,8 +2251,13 @@ vm_page_zone_import(void *arg, void **store, int cnt, 
 
        pgcache = arg;
        vmd = VM_DOMAIN(pgcache->domain);
-       /* Only import if we can bring in a full bucket. */
-       if (cnt == 1 || !vm_domain_allocate(vmd, VM_ALLOC_NORMAL, cnt))
+
+       /*
+        * The page daemon should avoid creating extra memory pressure since its
+        * main purpose is to replenish the store of free pages.
+        */
+       if (vmd->vmd_severeset || curproc == pageproc ||
+           !_vm_domain_allocate(vmd, VM_ALLOC_NORMAL, cnt))
                return (0);
        domain = vmd->vmd_domain;
        vm_domain_free_lock(vmd);
_______________________________________________
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