(set|rem)runqueue and splhigh

Peter Kadau peter.kadau at tuebingen.mpg.de
Wed Dec 31 06:49:33 PST 2003


Hi !

Is it still true that (set|rem)runqueue have to be called with splhigh ?
If yes, I have a short fix, since there are paths where they may be
called with other masks set.
I just bracket them in acquire_curproc and resetpriority thusly avoiding
to chase each and every caller.
I'm not sure what to do with the "broken out from setrunqueue" stuff in
acquire_curproc either.
Cheers and
Happy New Year
Peter
--
<peter.kadau at xxxxxxxxxxxxxxxx>
Campus der Max-Planck-Institute Tübingen
Netzwerk- und Systemadministration
Tel: +49 7071 601 598
Fax: +49 7071 601 616
Index: kern/kern_switch.c
===================================================================
RCS file: /local/dragonfly/src/sys/kern/kern_switch.c,v
retrieving revision 1.16
diff -u -r1.16 kern_switch.c
--- kern/kern_switch.c	30 Dec 2003 03:19:02 -0000	1.16
+++ kern/kern_switch.c	30 Dec 2003 19:54:29 -0000
@@ -524,6 +524,7 @@
 {
 	int cpuid;
 	struct proc *np;
+	int s;
 
 	/*
 	 * Short cut, we've already acquired the designation or we never
@@ -588,7 +589,9 @@
 		}
 		lwkt_deschedule_self();
 		p->p_flag &= ~P_CP_RELEASED;
+		s = splhigh();
 		setrunqueue(p);
+		splx(s);
 		lwkt_switch();	/* CPU CAN CHANGE DUE TO SETRUNQUEUE() */
 		KASSERT((p->p_flag & (P_ONRUNQ|P_CURPROC|P_CP_RELEASED)) == P_CURPROC, ("unexpected p_flag %08x acquiring P_CURPROC\n", p->p_flag));
 	}
Index: kern/kern_synch.c
===================================================================
RCS file: /local/dragonfly/src/sys/kern/kern_synch.c,v
retrieving revision 1.25
diff -u -r1.25 kern_synch.c
--- kern/kern_synch.c	17 Oct 2003 07:30:42 -0000	1.25
+++ kern/kern_synch.c	30 Dec 2003 19:43:15 -0000
@@ -763,6 +763,7 @@
 	unsigned int newpriority;
 	int opq;
 	int npq;
+	int s;
 
 	/*
 	 * Set p_priority for general process comparisons
@@ -795,9 +796,11 @@
 		/*
 		 * We have to move the process to another queue
 		 */
+		s = splhigh();
 		remrunqueue(p);
 		p->p_priority = PRIBASE_NORMAL + newpriority;
 		setrunqueue(p);
+		splx(s);
 	} else {
 		/*
 		 * We can just adjust the priority and it will be picked




More information about the Submit mailing list