Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 6 Sep 2004 04:22:55 GMT
From:      Julian Elischer <julian@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 61076 for review
Message-ID:  <200409060422.i864MtKc059168@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=61076

Change 61076 by julian@julian_ref on 2004/09/06 04:22:52

	Very simplistic code to allow a sleeping thread to nominate
	a thread to replace it.

Affected files ...

.. //depot/projects/nsched/sys/kern/kern_switch.c#11 edit
.. //depot/projects/nsched/sys/kern/kern_synch.c#12 edit
.. //depot/projects/nsched/sys/kern/sched_4bsd.c#38 edit
.. //depot/projects/nsched/sys/kern/sched_ule.c#24 edit
.. //depot/projects/nsched/sys/sys/sched.h#14 edit

Differences ...

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

@@ -192,7 +192,7 @@
  *  sched_thread_exit()  (local)
  *  sched_switch()  (local)
  *  sched_thread_exit()  (local)
- *  remrunqueue()  (local) (commented out)
+ *  remrunqueue()  (local) 
  */
 static void
 slot_fill(struct ksegrp *kg)
@@ -224,7 +224,7 @@
 	}
 }
 
-#if 0
+#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
@@ -248,7 +248,7 @@
 	 * If it is not a threaded process, take the shortcut.
 	 */
 	if ((td->td_proc->p_flag & P_HADTHREADS) == 0) {
-		/* Bring its kse with it, leave the thread attached */
+		/* remve from sys run queue and free up a slot */
 		sched_rem(td);
 		kg->kg_avail_opennings++;
 		ke->ke_state = KES_THREAD; 
@@ -259,7 +259,7 @@
 	kg->kg_runnable--;
 	if (ke->ke_state == KES_ONRUNQ) {
 		/*
-		 * This thread has been assigned to a KSE.
+		 * This thread has been assigned to the system run queue.
 		 * We need to dissociate it and try assign the
 		 * KSE to the next available thread. Then, we should
 		 * see if we need to move the KSE in the run queues.
@@ -271,7 +271,7 @@
 		KASSERT((td2 != NULL), ("last assigned has wrong value"));
 		if (td2 == td) 
 			kg->kg_last_assigned = td3;
-		slot_fill(kg);
+		/* slot_fill(kg); */ /* will replace it with another */
 	}
 }
 #endif

==== //depot/projects/nsched/sys/kern/kern_synch.c#12 (text+ko) ====

@@ -337,7 +337,7 @@
 	    (void *)td, td->td_sched, (long)p->p_pid, p->p_comm);
 	if (td->td_proc->p_flag & P_SA)
 		newtd = thread_switchout(td, flags, newtd);
-	sched_switch(td, newtd);
+	sched_switch(td, newtd, flags);
 
 	CTR4(KTR_PROC, "mi_switch: new thread %p (kse %p, pid %ld, %s)",
 	    (void *)td, td->td_sched, (long)p->p_pid, p->p_comm);

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

@@ -733,10 +733,13 @@
 	td->td_base_pri = td->td_priority;
 }
 
+static void remrunqueue(struct thread *td);
+
 void
-sched_switch(struct thread *td, struct thread *newtd)
+sched_switch(struct thread *td, struct thread *newtd, int flags)
 {
 	struct kse *ke;
+	struct ksegrp *kg;
 	struct proc *p;
 
 	ke = td->td_kse;
@@ -746,8 +749,28 @@
 
 	if ((p->p_flag & P_NOLOAD) == 0)
 		sched_tdcnt--;
-	if (newtd != NULL && (newtd->td_proc->p_flag & P_NOLOAD) == 0)
-		sched_tdcnt++;
+
+	/* 
+	 * We are volunteering to switch out so we get to nominate
+	 * a successor for the rest of our quantum
+	 * First try another thread in our ksegrp, and then look for 
+	 * other ksegrps in our process.
+	 */
+	if ((p->p_flag & P_HADTHREADS) && (flags & SW_VOL) && newtd == NULL) {
+		/* lets schedule another thread from this process */
+		 kg = td->td_ksegrp;
+		 if ((newtd = TAILQ_FIRST(&kg->kg_runq))) {
+			remrunqueue(newtd);
+		 } else {
+			FOREACH_KSEGRP_IN_PROC(p, kg) {
+				if ((newtd = TAILQ_FIRST(&kg->kg_runq))) {
+					remrunqueue(newtd);
+					break;
+				}
+			}
+		}
+	}
+
 	/* 
 	 * The thread we are about to run needs to be counted as if it had been 
 	 * added to the run queue and selected.
@@ -756,6 +779,9 @@
 		newtd->td_ksegrp->kg_avail_opennings--;
 		newtd->td_kse->ke_flags |= KEF_DIDRUN;
         	TD_SET_RUNNING(newtd);
+		if ((newtd->td_proc->p_flag & P_NOLOAD) == 0)
+			sched_tdcnt++;
+
 	}
 	td->td_lastcpu = td->td_oncpu;
 	td->td_flags &= ~TDF_NEEDRESCHED;

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

@@ -1225,7 +1225,7 @@
 }
 
 void
-sched_switch(struct thread *td, struct thread *newtd)
+sched_switch(struct thread *td, struct thread *newtd, int flags)
 {
 	struct kse *ke;
 

==== //depot/projects/nsched/sys/sys/sched.h#14 (text+ko) ====

@@ -66,7 +66,7 @@
 fixpt_t	sched_pctcpu(struct thread *td);
 void	sched_prio(struct thread *td, u_char prio);
 void	sched_sleep(struct thread *td);
-void	sched_switch(struct thread *td, struct thread *newtd);
+void	sched_switch(struct thread *td, struct thread *newtd, int flags);
 void	sched_userret(struct thread *td);
 void	sched_wakeup(struct thread *td);
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200409060422.i864MtKc059168>