PERFORCE change 61446 for review

Julian Elischer julian at FreeBSD.org
Mon Sep 13 13:17:25 PDT 2004


http://perforce.freebsd.org/chv.cgi?CH=61446

Change 61446 by julian at julian_ref on 2004/09/13 20:17:09

	remove hack solution and add a slightly nicer one
	for preemption problem.

Affected files ...

.. //depot/projects/nsched/sys/kern/kern_switch.c#23 edit
.. //depot/projects/nsched/sys/kern/sched_4bsd.c#50 edit
.. //depot/projects/nsched/sys/kern/sched_ule.c#32 edit
.. //depot/projects/nsched/sys/sys/proc.h#31 edit

Differences ...

==== //depot/projects/nsched/sys/kern/kern_switch.c#23 (text+ko) ====

@@ -226,7 +226,7 @@
  *  sched_thread_exit()  (local)
  *  sched_switch()  (local)
  *  sched_thread_exit()  (local)
- *  remrunqueue()  (local) 
+ *  remrunqueue()  (local)  (not at the moment)
  */
 static void
 slot_fill(struct ksegrp *kg)
@@ -258,7 +258,6 @@
 	}
 }
 
-#ifdef SCHED_4BSD
 /*
  * Remove a thread from its KSEGRP's run queue.
  * This in turn may remove it from a KSE if it was already assigned
@@ -310,7 +309,6 @@
 	}
 	CHECKRUNQ(kg, NULL)
 }
-#endif
 
 /*
  * Change the priority of a thread that is on the run queue.
@@ -396,10 +394,6 @@
 		return;
 	}
 
-	if (((flags & (SRQ_YIELDING|SRQ_OURSELF|SRQ_NOPREEMPT)) == 0) &&
-	    maybe_preempt(td))
-		return;
-
 	CHECKRUNQ(kg, td)
 	tda = kg->kg_last_assigned;
 	if ((kg->kg_avail_opennings <= 0) &&
@@ -457,7 +451,7 @@
 			kg->kg_last_assigned = td2;
 		}
 		kg->kg_avail_opennings--;
-		sched_add(td2, flags|SRQ_NOPREEMPT);
+		sched_add(td2, flags);
 	} else {
 		CTR3(KTR_RUNQ, "setrunqueue: held: td%p kg%p pid%d",
 			td, td->td_ksegrp, td->td_proc->p_pid);
@@ -568,8 +562,18 @@
 	/*
 	 * Our thread state says that we are already on a run queue, so
 	 * update our state as if we had been dequeued by choosethread().
+	 * However we must not actually be on the system run queue yet.
 	 */
 	MPASS(TD_ON_RUNQ(td));
+	MPASS(td->td_sched->ke_state != KES_ONRUNQ);
+	if (td->td_proc->p_flag & P_HADTHREADS) {
+		/*
+		 * If this is a threaded process we actually ARE on the
+		 * ksegrp run queue so take it off that first.
+		 */
+		remrunqueue(td); /* maybe use a simpler version */
+	}
+		
 	TD_SET_RUNNING(td);
 	CTR3(KTR_PROC, "preempting to thread %p (pid %d, %s)\n", td,
 	    td->td_proc->p_pid, td->td_proc->p_comm);

==== //depot/projects/nsched/sys/kern/sched_4bsd.c#50 (text+ko) ====

@@ -1018,8 +1018,7 @@
 #endif
 
 		{
-			if (((flags & SRQ_NOPREEMPT) == 0) &&
-			    maybe_preempt(td))
+			if (maybe_preempt(td))
 				return;
 		}
 	}

==== //depot/projects/nsched/sys/kern/sched_ule.c#32 (text+ko) ====

@@ -1662,13 +1662,13 @@
 
 	/* let jeff work out how to map the flags better */
 	/* I'm open to suggestions */
-	if (flags & (SRQ_YIELDING|SRQ_NOPREEMPT)) {
+	if (flags & SRQ_YIELDING)
 		/*
 		 * Preempting during switching can be bad JUJU
 		 * especially for KSE processes
 		 */
 		sched_add_internal(td, 0);
-	} else 
+	else
 		sched_add_internal(td, 1);
 }
 

==== //depot/projects/nsched/sys/sys/proc.h#31 (text+ko) ====

@@ -658,7 +658,6 @@
 #define SRQ_YIELDING	0x0001		/* we are yielding (from mi_switch) */
 #define SRQ_OURSELF	0x0002		/* it is ourself (from mi_switch) */
 #define SRQ_INTR	0x0004		/* it is probably urgent */
-#define SRQ_NOPREEMPT	0x0008		/* Just don't ok? */
 
 /* How values for thread_single(). */
 #define	SINGLE_NO_EXIT	0


More information about the p4-projects mailing list