Author: kib
Date: Sat Jan 31 11:02:20 2015
New Revision: 277965
URL: https://svnweb.freebsd.org/changeset/base/277965

Log:
  MFC r277646:
  Avoid calling vmspace_free() while owning the process lock.

Modified:
  stable/10/sys/vm/vm_pageout.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/vm/vm_pageout.c
==============================================================================
--- stable/10/sys/vm/vm_pageout.c       Sat Jan 31 08:03:56 2015        
(r277964)
+++ stable/10/sys/vm/vm_pageout.c       Sat Jan 31 11:02:20 2015        
(r277965)
@@ -1526,15 +1526,15 @@ vm_pageout_oom(int shortage)
        FOREACH_PROC_IN_SYSTEM(p) {
                int breakout;
 
-               if (PROC_TRYLOCK(p) == 0)
-                       continue;
+               PROC_LOCK(p);
+
                /*
                 * If this is a system, protected or killed process, skip it.
                 */
-               if (p->p_state != PRS_NORMAL ||
-                   (p->p_flag & (P_INEXEC | P_PROTECTED | P_SYSTEM)) ||
-                   (p->p_pid == 1) || P_KILLED(p) ||
-                   ((p->p_pid < 48) && (swap_pager_avail != 0))) {
+               if (p->p_state != PRS_NORMAL || (p->p_flag & (P_INEXEC |
+                   P_PROTECTED | P_SYSTEM | P_WEXIT)) != 0 ||
+                   p->p_pid == 1 || P_KILLED(p) ||
+                   (p->p_pid < 48 && swap_pager_avail != 0)) {
                        PROC_UNLOCK(p);
                        continue;
                }
@@ -1567,11 +1567,14 @@ vm_pageout_oom(int shortage)
                        PROC_UNLOCK(p);
                        continue;
                }
+               _PHOLD(p);
                if (!vm_map_trylock_read(&vm->vm_map)) {
-                       vmspace_free(vm);
+                       _PRELE(p);
                        PROC_UNLOCK(p);
+                       vmspace_free(vm);
                        continue;
                }
+               PROC_UNLOCK(p);
                size = vmspace_swap_count(vm);
                vm_map_unlock_read(&vm->vm_map);
                if (shortage == VM_OOM_MEM)
@@ -1583,16 +1586,19 @@ vm_pageout_oom(int shortage)
                 */
                if (size > bigsize) {
                        if (bigproc != NULL)
-                               PROC_UNLOCK(bigproc);
+                               PRELE(bigproc);
                        bigproc = p;
                        bigsize = size;
-               } else
-                       PROC_UNLOCK(p);
+               } else {
+                       PRELE(p);
+               }
        }
        sx_sunlock(&allproc_lock);
        if (bigproc != NULL) {
+               PROC_LOCK(bigproc);
                killproc(bigproc, "out of swap space");
                sched_nice(bigproc, PRIO_MIN);
+               _PRELE(bigproc);
                PROC_UNLOCK(bigproc);
                wakeup(&cnt.v_free_count);
        }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "[email protected]"

Reply via email to