kernel - limit allproc_scan() to snapshot
authorMatthew Dillon <dillon@apollo.backplane.com>
Wed, 26 Oct 2011 18:15:47 +0000 (11:15 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Wed, 26 Oct 2011 18:15:47 +0000 (11:15 -0700)
* Limit the allproc_scan() to (roughly) a snapshot of nprocs processes.
  If we don't do this it is possible for the scan to race fork/exec'ing
  programs and essentially run forever.

sys/kern/kern_proc.c

index cb067f0..a2efb1e 100644 (file)
@@ -672,14 +672,21 @@ proc_remove_zombie(struct proc *p)
  * Scan all processes on the allproc list.  The process is automatically
  * held for the callback.  A return value of -1 terminates the loop.
  *
- * No requirements.
  * The callback is made with the process held and proc_token held.
+ *
+ * We limit the scan to the number of processes as-of the start of
+ * the scan so as not to get caught up in an endless loop if new processes
+ * are created more quickly than we can scan the old ones.  Add a little
+ * slop to try to catch edge cases since nprocs can race.
+ *
+ * No requirements.
  */
 void
 allproc_scan(int (*callback)(struct proc *, void *), void *data)
 {
        struct proc *p;
        int r;
+       int limit = nprocs + ncpus;
 
        lwkt_gettoken(&proc_token);
        LIST_FOREACH(p, &allproc, p_list) {
@@ -688,6 +695,8 @@ allproc_scan(int (*callback)(struct proc *, void *), void *data)
                PRELE(p);
                if (r < 0)
                        break;
+               if (--limit < 0)
+                       break;
        }
        lwkt_reltoken(&proc_token);
 }