Skip site navigation (1)Skip section navigation (2)
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>