PERFORCE change 61309 for review
John Baldwin
jhb at FreeBSD.org
Fri Sep 10 14:10:39 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=61309
Change 61309 by jhb at jhb_slimer on 2004/09/10 21:09:59
IFC @61307.
Affected files ...
.. //depot/projects/smpng/sys/kern/kern_switch.c#45 integrate
.. //depot/projects/smpng/sys/kern/kern_synch.c#80 integrate
.. //depot/projects/smpng/sys/kern/sched_4bsd.c#37 integrate
.. //depot/projects/smpng/sys/kern/sched_ule.c#41 integrate
.. //depot/projects/smpng/sys/sys/sched.h#15 integrate
Differences ...
==== //depot/projects/smpng/sys/kern/kern_switch.c#45 (text+ko) ====
@@ -86,7 +86,7 @@
***/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_switch.c,v 1.88 2004/09/07 06:38:22 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_switch.c,v 1.89 2004/09/10 21:04:38 julian Exp $");
#include "opt_sched.h"
@@ -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/smpng/sys/kern/kern_synch.c#80 (text+ko) ====
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/kern_synch.c,v 1.259 2004/09/05 02:09:53 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/kern_synch.c,v 1.260 2004/09/10 21:04:38 julian Exp $");
#include "opt_ktrace.h"
@@ -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/smpng/sys/kern/sched_4bsd.c#37 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.60 2004/09/06 07:23:14 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_4bsd.c,v 1.61 2004/09/10 21:04:38 julian Exp $");
#define kse td_sched
@@ -247,8 +247,23 @@
SYSCTL_INT(_kern_sched_ipiwakeup, OID_AUTO, htt2, CTLFLAG_RW,
&forward_wakeup_use_htt, 0,
"account for htt");
+
#endif
+static int sched_followon = 0;
+SYSCTL_INT(_kern_sched, OID_AUTO, followon, CTLFLAG_RW,
+ &sched_followon, 0,
+ "allow threads to share a quantum");
+static int sched_pfollowons = 0;
+SYSCTL_INT(_kern_sched, OID_AUTO, pfollowons, CTLFLAG_RD,
+ &sched_pfollowons, 0,
+ "number of followons done to a different ksegrp");
+
+static int sched_kgfollowons = 0;
+SYSCTL_INT(_kern_sched, OID_AUTO, kgfollowons, CTLFLAG_RD,
+ &sched_kgfollowons, 0,
+ "number of followons done in a ksegrp");
+
/*
* Arrange to reschedule if necessary, taking the priorities and
* schedulers into account.
@@ -733,10 +748,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,6 +764,33 @@
if ((p->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 (sched_followon &&
+ (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);
+ sched_kgfollowons++;
+ } else {
+ FOREACH_KSEGRP_IN_PROC(p, kg) {
+ if ((newtd = TAILQ_FIRST(&kg->kg_runq))) {
+ sched_pfollowons++;
+ 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.
@@ -757,6 +802,7 @@
if ((newtd->td_proc->p_flag & P_NOLOAD) == 0)
sched_tdcnt++;
}
+
td->td_lastcpu = td->td_oncpu;
td->td_flags &= ~TDF_NEEDRESCHED;
td->td_pflags &= ~TDP_OWEPREEMPT;
==== //depot/projects/smpng/sys/kern/sched_ule.c#41 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.125 2004/09/05 02:09:53 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/kern/sched_ule.c,v 1.126 2004/09/10 21:04:38 julian Exp $");
#include <opt_sched.h>
@@ -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/smpng/sys/sys/sched.h#15 (text+ko) ====
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/sys/sched.h,v 1.16 2004/09/05 02:09:54 julian Exp $
+ * $FreeBSD: src/sys/sys/sched.h,v 1.17 2004/09/10 21:04:37 julian Exp $
*/
#ifndef _SYS_SCHED_H_
@@ -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);
More information about the p4-projects
mailing list