Date: Tue, 8 Oct 2002 22:46:05 +0200 From: Stefan Farfeleder <e0026813@stud3.tuwien.ac.at> To: Terry Lambert <tlambert2@mindspring.com> Cc: John Baldwin <jhb@FreeBSD.ORG>, Juli Mallett <jmallett@FreeBSD.ORG>, current@FreeBSD.ORG Subject: Re: [PATCH] Re: Junior Kernel Hacker page updated... Message-ID: <20021008204605.GA252@frog.fafoe> In-Reply-To: <3DA1668D.E8153F43@mindspring.com> References: <20021004132203.A78223@FreeBSD.org> <XFMail.20021004163317.jhb@FreeBSD.org> <20021005135504.GA254@frog.fafoe> <3D9F39BB.66126C35@mindspring.com> <3DA12642.28BB8E1@mindspring.com> <20021007095024.GA252@frog.fafoe> <3DA1668D.E8153F43@mindspring.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--h31gzZEtNLTqOjlF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, Oct 07, 2002 at 03:48:45AM -0700, Terry Lambert wrote: > > *** OK, it's very hard to believe you didn't break into the > *** debugger and manually call "pnaic" to get this to happen. You're right, this is exactly what I did. > I can't personally repeat the problem, so you're elected to do > the legwork on this one. 8-(. Following the advice from the spl* man page I turned the spl* calls to a mutex and was surprised to see it working. My SMP -current survived a 'make -j16 buildworld' with make using kqueue() (which it did not a single time out of >30 times before). Further testings will follow tomorrow. However, WITNESS complains (only once) about this: lock order reversal 1st 0xc662140c kqueue mutex (kqueue mutex) @ /freebsd/current/src/sys/kern/kern_event.c:714 2nd 0xc6727d00 pipe mutex (pipe mutex) @ /freebsd/current/src/sys/kern/sys_pipe.c:1478 Regards, Stefan Farfeleder --h31gzZEtNLTqOjlF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="kqueue.diff" Index: sys/eventvar.h =================================================================== RCS file: /home/ncvs/src/sys/sys/eventvar.h,v retrieving revision 1.4 diff -u -r1.4 eventvar.h --- sys/eventvar.h 18 Jul 2000 19:31:48 -0000 1.4 +++ sys/eventvar.h 8 Oct 2002 16:06:46 -0000 @@ -35,6 +35,7 @@ struct kqueue { TAILQ_HEAD(kqlist, knote) kq_head; /* list of pending event */ int kq_count; /* number of pending events */ + struct mtx kq_mtx; /* protect kq_head */ struct selinfo kq_sel; struct filedesc *kq_fdp; int kq_state; Index: kern/kern_event.c =================================================================== RCS file: /home/ncvs/src/sys/kern/kern_event.c,v retrieving revision 1.46 diff -u -r1.46 kern_event.c --- kern/kern_event.c 3 Oct 2002 06:03:26 -0000 1.46 +++ kern/kern_event.c 8 Oct 2002 19:22:27 -0000 @@ -375,7 +375,7 @@ if (error) goto done2; kq = malloc(sizeof(struct kqueue), M_KQUEUE, M_WAITOK | M_ZERO); - TAILQ_INIT(&kq->kq_head); + mtx_init(&kq->kq_mtx, "kqueue mutex", NULL, MTX_DEF); FILE_LOCK(fp); fp->f_flag = FREAD | FWRITE; fp->f_type = DTYPE_KQUEUE; @@ -709,13 +709,15 @@ error = 0; goto done; } + splx(s); + mtx_lock(&kq->kq_mtx); TAILQ_INSERT_TAIL(&kq->kq_head, &marker, kn_tqe); while (count) { kn = TAILQ_FIRST(&kq->kq_head); TAILQ_REMOVE(&kq->kq_head, kn, kn_tqe); if (kn == &marker) { - splx(s); + mtx_unlock(&kq->kq_mtx); if (count == maxevents) goto retry; goto done; @@ -737,10 +739,10 @@ if (kn->kn_flags & EV_ONESHOT) { kn->kn_status &= ~KN_QUEUED; kq->kq_count--; - splx(s); + mtx_unlock(&kq->kq_mtx); kn->kn_fop->f_detach(kn); knote_drop(kn, td); - s = splhigh(); + mtx_lock(&kq->kq_mtx); } else if (kn->kn_flags & EV_CLEAR) { kn->kn_data = 0; kn->kn_fflags = 0; @@ -751,19 +753,19 @@ } count--; if (nkev == KQ_NEVENTS) { - splx(s); + mtx_unlock(&kq->kq_mtx); error = copyout(&kq->kq_kev, ulistp, sizeof(struct kevent) * nkev); ulistp += nkev; nkev = 0; kevp = kq->kq_kev; - s = splhigh(); + mtx_lock(&kq->kq_mtx); if (error) break; } } TAILQ_REMOVE(&kq->kq_head, &marker, kn_tqe); - splx(s); + mtx_unlock(&kq->kq_mtx); done: if (nkev != 0) error = copyout(&kq->kq_kev, ulistp, @@ -887,6 +889,7 @@ } } FILEDESC_UNLOCK(fdp); + mtx_destroy(&kq->kq_mtx); free(kq, M_KQUEUE); fp->f_data = NULL; @@ -1051,14 +1054,14 @@ knote_enqueue(struct knote *kn) { struct kqueue *kq = kn->kn_kq; - int s = splhigh(); KASSERT((kn->kn_status & KN_QUEUED) == 0, ("knote already queued")); + mtx_lock(&kq->kq_mtx); TAILQ_INSERT_TAIL(&kq->kq_head, kn, kn_tqe); kn->kn_status |= KN_QUEUED; kq->kq_count++; - splx(s); + mtx_unlock(&kq->kq_mtx); kqueue_wakeup(kq); } @@ -1066,14 +1069,14 @@ knote_dequeue(struct knote *kn) { struct kqueue *kq = kn->kn_kq; - int s = splhigh(); KASSERT(kn->kn_status & KN_QUEUED, ("knote not queued")); + mtx_lock(&kq->kq_mtx); TAILQ_REMOVE(&kq->kq_head, kn, kn_tqe); kn->kn_status &= ~KN_QUEUED; kq->kq_count--; - splx(s); + mtx_unlock(&kq->kq_mtx); } static void --h31gzZEtNLTqOjlF-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021008204605.GA252>