2.4.19-pre8 get_pid() hang fix again

2.4.19-pre8 get_pid() hang fix again

Post by Paul Larso » Fri, 24 May 2002 07:00:06



Marcelo, I originally submitted this patch against 2.4.18-rc2 and I
noticed that it has not been picked up yet.  I've repatched it against
2.4.19-pre8 and retested it.  This is to fix the problem where if you
run out of available pids, get_pid will cause a hang as it loops forever
through the tasks to try to find an available pid that doesn't exist.

Thanks,
Paul Larson

--- linux-2.4.19-pre8/kernel/fork.c     Mon May 20 10:55:14 2002

 #include <linux/completion.h>
 #include <linux/namespace.h>
 #include <linux/personality.h>
+#include <linux/compiler.h>

 #include <asm/pgtable.h>

 {
        static int next_safe = PID_MAX;
        struct task_struct *p;
-       int pid;
+       int pid, beginpid;

        if (flags & CLONE_PID)
                return current->pid;

        spin_lock(&lastpid_lock);
+       beginpid = last_pid;
        if((++last_pid) & 0xffff8000) {
                last_pid = 300;         /* Skip daemons etc. */

                                                last_pid = 300;
                                        next_safe = PID_MAX;
                                }
+                               if(unlikely(last_pid == beginpid))
+                                       goto nomorepids;
                                goto repeat;
                        }
                        if(p->pid > last_pid && next_safe > p->pid)
                                next_safe = p->pid;
                        if(p->pgrp > last_pid && next_safe > p->pgrp)
                                next_safe = p->pgrp;
+                       if(p->tgid > last_pid && next_safe > p->tgid)
+                               next_safe = p->tgid;
                        if(p->session > last_pid && next_safe > p->session)
                                next_safe = p->session;

        spin_unlock(&lastpid_lock);

        return pid;
+
+nomorepids:
+       read_unlock(&tasklist_lock);
+       spin_unlock(&lastpid_lock);
+       return 0;
 }


        copy_flags(clone_flags, p);
        p->pid = get_pid(clone_flags);
+       if (p->pid == 0 && current->pid != 0)
+               goto bad_fork_cleanup;

        p->run_list.next = NULL;
        p->run_list.prev = NULL;

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in

More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

 
 
 

2.4.19-pre8 get_pid() hang fix again

Post by Marcelo Tosatt » Sat, 25 May 2002 07:20:08


Applied... thanks.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in

More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/