This doesn't look right at all.  It looks like wakeup is not restarting
    properly:

        s = splhigh();
        qp = &slpque[LOOKUP(ident)];
restart:
        TAILQ_FOREACH(p, qp, p_procq) {
                if (p->p_wchan == ident) {
                        TAILQ_REMOVE(qp, p, p_procq);
                        p->p_wchan = 0;
                        if (p->p_stat == SSLEEP) {
                                ...
                                goto restart;
                        }
                        /* XXXXXX goto restart should occur HERE XXXXXX */
                }
        }

    The goto restart condition should occur one level up, as I show in
    the comment.

    Could someone take a look at this and tell me if I am blowing smoke?

                                        -Matt
                                        Matthew Dillon 
                                        <[EMAIL PROTECTED]>

Index: kern_synch.c
===================================================================
RCS file: /home/ncvs/src/sys/kern/kern_synch.c,v
retrieving revision 1.87.2.4
diff -u -r1.87.2.4 kern_synch.c
--- kern_synch.c        14 Nov 2001 17:22:49 -0000      1.87.2.4
+++ kern_synch.c        23 Jun 2002 20:10:37 -0000
@@ -745,8 +745,8 @@
                                        wakeup((caddr_t)&proc0);
                                }
                                /* END INLINE EXPANSION */
-                               goto restart;
                        }
+                       goto restart;
                }
        }
        splx(s);

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to