Config option to "disable" SMT/hyperthreading
authorBarret Rhoden <brho@cs.berkeley.edu>
Mon, 26 Apr 2010 19:10:19 +0000 (12:10 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:45 +0000 (17:35 -0700)
It just adds all odd cores to the idle core map.  The other, non-zero
cores will remain halted.  This assumes you're okay with running the
manager, monitor, and NIC code on core 0.  You can run them on the other
cores, but those cores will still be given out to _Ms.

Makeconfig
Makelocal.template
kern/src/process.c

index 6a94074..694c7f1 100644 (file)
@@ -25,6 +25,7 @@ CONFIG_E1000_ON_S142:=             -DE1000_MMIO_ADDR=0xfbee0000
 CONFIG_DISABLE_MPTABLES:=          -D__CONFIG_DISABLE_MPTABLES__
 CONFIG_EXPER_TRADPROC:=            -D__CONFIG_EXPER_TRADPROC__
 CONFIG_MONITOR_ON_INT:=            -D__CONFIG_MONITOR_ON_INT__
+CONFIG_DISABLE_SMT:=               -D__CONFIG_DISABLE_SMT__
 
 # Userspace configuration parameters
 # By default, each of these options will be turned off
index 43d273e..f70aee2 100644 (file)
@@ -21,6 +21,8 @@
 #KERN_CFLAGS += $(CONFIG_DISABLE_MPTABLES)
 #KERN_CFLAGS += $(CONFIG_EXPER_TRADPROC)
 #KERN_CFLAGS += $(CONFIG_MONITOR_ON_INT)
+#KERN_CFLAGS += $(CONFIG_DISABLE_SMT)
+
 #KERN_CFLAGS += -DDEVELOPER_NAME=waterman
 #KERN_CFLAGS += -DDEVELOPER_NAME=brho
 
index baced15..c699d57 100644 (file)
@@ -192,6 +192,15 @@ void proc_init(void)
        schedule_init();
        /* Init idle cores. Core 0 is the management core. */
        spin_lock(&idle_lock);
+#ifdef __CONFIG_DISABLE_SMT__
+       /* assumes core0 is the only management core (NIC and monitor functionality
+        * are run there too.  it just adds the odd cores to the idlecoremap */
+       assert(!(num_cpus & 0x1));
+       // TODO: consider checking x86 for machines that actually hyperthread
+       num_idlecores = num_cpus / 2;
+       for (int i = 0; i < num_idlecores; i++)
+               idlecoremap[i] = (i * 2) + 1;
+#else
        #ifdef __CONFIG_NETWORKING__
        num_mgmtcores++; // Next core is dedicated to the NIC
        assert(num_cpus >= num_mgmtcores);
@@ -207,6 +216,7 @@ void proc_init(void)
        num_idlecores = num_cpus - num_mgmtcores;
        for (int i = 0; i < num_idlecores; i++)
                idlecoremap[i] = i + num_mgmtcores;
+#endif /* __CONFIG_DISABLE_SMT__ */
        spin_unlock(&idle_lock);
        atomic_init(&num_envs, 0);
 }