Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Jul 2013 09:45:32 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r253604 - in head/sys: gdb kern ofed/include/linux sys vm
Message-ID:  <201307240945.r6O9jWkR002132@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Wed Jul 24 09:45:31 2013
New Revision: 253604
URL: http://svnweb.freebsd.org/changeset/base/253604

Log:
  rename scheduler->swapper and SI_SUB_RUN_SCHEDULER->SI_SUB_LAST
  
  Also directly call swapper() at the end of mi_startup instead of
  relying on swapper being the last thing in sysinits order.
  
  Rationale:
  
  - "RUN_SCHEDULER" was misleading, scheduling already takes place at that stage
  - "scheduler" was misleading, the function swaps in the swapped out processes
  - another SYSINIT(SI_SUB_RUN_SCHEDULER, SI_ORDER_ANY) could never be
    invoked depending on its relative order with scheduler; this was not obvious
    and the bug actually used to exist
  
  Reviewed by:	kib (ealier version)
  MFC after:	14 days

Modified:
  head/sys/gdb/gdb_cons.c
  head/sys/kern/init_main.c
  head/sys/kern/kern_ntptime.c
  head/sys/kern/sched_4bsd.c
  head/sys/ofed/include/linux/module.h
  head/sys/sys/kernel.h
  head/sys/sys/sched.h
  head/sys/vm/vm.h
  head/sys/vm/vm_glue.c

Modified: head/sys/gdb/gdb_cons.c
==============================================================================
--- head/sys/gdb/gdb_cons.c	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/gdb/gdb_cons.c	Wed Jul 24 09:45:31 2013	(r253604)
@@ -136,7 +136,7 @@ oktousecallout(void *data __unused)
 {
 	calloutok = 1;
 }
-SYSINIT(gdbhack, SI_SUB_RUN_SCHEDULER, SI_ORDER_MIDDLE, oktousecallout, NULL);
+SYSINIT(gdbhack, SI_SUB_LAST, SI_ORDER_MIDDLE, oktousecallout, NULL);
 
 static void
 gdb_cnputc(struct consdev *cp, int c)

Modified: head/sys/kern/init_main.c
==============================================================================
--- head/sys/kern/init_main.c	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/kern/init_main.c	Wed Jul 24 09:45:31 2013	(r253604)
@@ -243,9 +243,6 @@ restart:
 	/*
 	 * Traverse the (now) ordered list of system initialization tasks.
 	 * Perform each task, and continue on to the next task.
-	 *
-	 * The last item on the list is expected to be the scheduler,
-	 * which will not return.
 	 */
 	for (sipp = sysinit; sipp < sysinit_end; sipp++) {
 
@@ -303,7 +300,13 @@ restart:
 		}
 	}
 
-	panic("Shouldn't get here!");
+	mtx_assert(&Giant, MA_OWNED | MA_NOTRECURSED);
+	mtx_unlock(&Giant);
+
+	/*
+	 * Now hand over this thread to swapper.
+	 */
+	swapper();
 	/* NOTREACHED*/
 }
 
@@ -346,7 +349,7 @@ static char wit_warn[] =
      "WARNING: WITNESS option enabled, expect reduced performance.\n";
 SYSINIT(witwarn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 1,
    print_caddr_t, wit_warn);
-SYSINIT(witwarn2, SI_SUB_RUN_SCHEDULER, SI_ORDER_THIRD + 1,
+SYSINIT(witwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 1,
    print_caddr_t, wit_warn);
 #endif
 
@@ -355,7 +358,7 @@ static char diag_warn[] =
      "WARNING: DIAGNOSTIC option enabled, expect reduced performance.\n";
 SYSINIT(diagwarn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 2,
     print_caddr_t, diag_warn);
-SYSINIT(diagwarn2, SI_SUB_RUN_SCHEDULER, SI_ORDER_THIRD + 2,
+SYSINIT(diagwarn2, SI_SUB_LAST, SI_ORDER_THIRD + 2,
     print_caddr_t, diag_warn);
 #endif
 

Modified: head/sys/kern/kern_ntptime.c
==============================================================================
--- head/sys/kern/kern_ntptime.c	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/kern/kern_ntptime.c	Wed Jul 24 09:45:31 2013	(r253604)
@@ -1051,5 +1051,5 @@ start_periodic_resettodr(void *arg __unu
 	    periodic_resettodr, NULL);
 }
 
-SYSINIT(periodic_resettodr, SI_SUB_RUN_SCHEDULER, SI_ORDER_MIDDLE,
+SYSINIT(periodic_resettodr, SI_SUB_LAST, SI_ORDER_MIDDLE,
 	start_periodic_resettodr, NULL);

Modified: head/sys/kern/sched_4bsd.c
==============================================================================
--- head/sys/kern/sched_4bsd.c	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/kern/sched_4bsd.c	Wed Jul 24 09:45:31 2013	(r253604)
@@ -143,7 +143,7 @@ static struct kproc_desc sched_kp = {
         schedcpu_thread,
         NULL
 };
-SYSINIT(schedcpu, SI_SUB_RUN_SCHEDULER, SI_ORDER_FIRST, kproc_start,
+SYSINIT(schedcpu, SI_SUB_LAST, SI_ORDER_FIRST, kproc_start,
     &sched_kp);
 SYSINIT(sched_setup, SI_SUB_RUN_QUEUE, SI_ORDER_FIRST, sched_setup, NULL);
 

Modified: head/sys/ofed/include/linux/module.h
==============================================================================
--- head/sys/ofed/include/linux/module.h	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/ofed/include/linux/module.h	Wed Jul 24 09:45:31 2013	(r253604)
@@ -68,17 +68,17 @@ _module_run(void *arg)
 }
 
 #define	module_init(fn)							\
-	SYSINIT(fn, SI_SUB_RUN_SCHEDULER, SI_ORDER_FIRST, _module_run, (fn))
+	SYSINIT(fn, SI_SUB_LAST, SI_ORDER_FIRST, _module_run, (fn))
 
 /*
  * XXX This is a freebsdism designed to work around not having a module
  * load order resolver built in.
  */
 #define	module_init_order(fn, order)					\
-	SYSINIT(fn, SI_SUB_RUN_SCHEDULER, (order), _module_run, (fn))
+	SYSINIT(fn, SI_SUB_LAST, (order), _module_run, (fn))
 
 #define	module_exit(fn)						\
-	SYSUNINIT(fn, SI_SUB_RUN_SCHEDULER, SI_ORDER_FIRST, _module_run, (fn))
+	SYSUNINIT(fn, SI_SUB_LAST, SI_ORDER_FIRST, _module_run, (fn))
 
 #define	module_get(module)
 #define	module_put(module)

Modified: head/sys/sys/kernel.h
==============================================================================
--- head/sys/sys/kernel.h	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/sys/kernel.h	Wed Jul 24 09:45:31 2013	(r253604)
@@ -79,7 +79,7 @@ extern volatile int ticks;
  * enumeration values are explicit rather than implicit to provide
  * for binary compatibility with inserted elements.
  *
- * The SI_SUB_RUN_SCHEDULER value must have the highest lexical value.
+ * The SI_SUB_LAST value must have the highest lexical value.
  *
  * The SI_SUB_SWAP values represent a value used by
  * the BSD 4.4Lite but not by FreeBSD; it is maintained in dependent
@@ -165,7 +165,7 @@ enum sysinit_sub_id {
 	SI_SUB_KTHREAD_IDLE	= 0xee00000,	/* idle procs*/
 	SI_SUB_SMP		= 0xf000000,	/* start the APs*/
 	SI_SUB_RACCTD		= 0xf100000,	/* start raccd*/
-	SI_SUB_RUN_SCHEDULER	= 0xfffffff	/* scheduler*/
+	SI_SUB_LAST		= 0xfffffff	/* final initialization */
 };
 
 

Modified: head/sys/sys/sched.h
==============================================================================
--- head/sys/sys/sched.h	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/sys/sched.h	Wed Jul 24 09:45:31 2013	(r253604)
@@ -182,7 +182,7 @@ static void name ## _add_proc(void *dumm
 	    #name, CTLTYPE_LONG|CTLFLAG_RD|CTLFLAG_MPSAFE,		\
 	    ptr, 0, sysctl_dpcpu_long, "LU", descr);			\
 }									\
-SYSINIT(name, SI_SUB_RUN_SCHEDULER, SI_ORDER_MIDDLE, name ## _add_proc, NULL);
+SYSINIT(name, SI_SUB_LAST, SI_ORDER_MIDDLE, name ## _add_proc, NULL);
 
 #define	SCHED_STAT_DEFINE(name, descr)					\
     DPCPU_DEFINE(unsigned long, name);					\

Modified: head/sys/vm/vm.h
==============================================================================
--- head/sys/vm/vm.h	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/vm/vm.h	Wed Jul 24 09:45:31 2013	(r253604)
@@ -147,6 +147,7 @@ int swap_reserve_by_cred(vm_ooffset_t in
 void swap_reserve_force(vm_ooffset_t incr);
 void swap_release(vm_ooffset_t decr);
 void swap_release_by_cred(vm_ooffset_t decr, struct ucred *cred);
+void swapper(void);
 
 #endif				/* VM_H */
 

Modified: head/sys/vm/vm_glue.c
==============================================================================
--- head/sys/vm/vm_glue.c	Wed Jul 24 09:15:59 2013	(r253603)
+++ head/sys/vm/vm_glue.c	Wed Jul 24 09:45:31 2013	(r253604)
@@ -96,16 +96,6 @@ __FBSDID("$FreeBSD$");
 #include <vm/vm_pager.h>
 #include <vm/swap_pager.h>
 
-/*
- * System initialization
- *
- * THIS MUST BE THE LAST INITIALIZATION ITEM!!!
- *
- * Note: run scheduling should be divorced from the vm system.
- */
-static void scheduler(void *);
-SYSINIT(scheduler, SI_SUB_RUN_SCHEDULER, SI_ORDER_ANY, scheduler, NULL);
-
 #ifndef NO_SWAPPING
 static int swapout(struct proc *);
 static void swapclear(struct proc *);
@@ -695,10 +685,8 @@ faultin(p)
  *
  * Giant is held on entry.
  */
-/* ARGSUSED*/
-static void
-scheduler(dummy)
-	void *dummy;
+void
+swapper(void)
 {
 	struct proc *p;
 	struct thread *td;
@@ -708,9 +696,6 @@ scheduler(dummy)
 	int ppri;
 	int pri;
 
-	mtx_assert(&Giant, MA_OWNED | MA_NOTRECURSED);
-	mtx_unlock(&Giant);
-
 loop:
 	if (vm_page_count_min()) {
 		VM_WAIT;
@@ -761,7 +746,7 @@ loop:
 	 * Nothing to do, back to sleep.
 	 */
 	if ((p = pp) == NULL) {
-		tsleep(&proc0, PVM, "sched", MAXSLP * hz / 2);
+		tsleep(&proc0, PVM, "swapin", MAXSLP * hz / 2);
 		goto loop;
 	}
 	PROC_LOCK(p);



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