This patch updates the handling of the smt-enabled=X boot option to handle
settings on systems with more than two threads per core.  This change involves
moving all of the handling of the boot option to the check_smt_enabled()
routine and the calling of this routine in setup_system() until after the
smp_setup_cpu_maps() call.  This is done so that we can use the
threads_per_core variable when validating the smt boot option specified.

Signed-off-by: Nathan Fontenot<nf...@austin.ibm.com>
---
 arch/powerpc/kernel/setup_64.c       |   61 ++++++++++++++++++++---------------
 arch/powerpc/platforms/pseries/smp.c |   11 ++++--
 2 files changed, 42 insertions(+), 30 deletions(-)

Index: powerpc/arch/powerpc/kernel/setup_64.c
===================================================================
--- powerpc.orig/arch/powerpc/kernel/setup_64.c 2010-05-12 08:33:38.000000000 
-0500
+++ powerpc/arch/powerpc/kernel/setup_64.c      2010-05-12 08:48:10.000000000 
-0500
@@ -95,7 +95,7 @@

 #ifdef CONFIG_SMP

-static int smt_enabled_cmdline;
+static char *smt_enabled_cmdline;

 /* Look for ibm,smt-enabled OF option */
 static void check_smt_enabled(void)
@@ -103,37 +103,46 @@
        struct device_node *dn;
        const char *smt_option;

-       /* Allow the command line to overrule the OF option */
-       if (smt_enabled_cmdline)
-               return;
-
-       dn = of_find_node_by_path("/options");
+       /* Default to enabling all threads */
+       smt_enabled_at_boot = threads_per_core;

-       if (dn) {
-               smt_option = of_get_property(dn, "ibm,smt-enabled", NULL);
+       /* Allow the command line to overrule the OF option */
+       if (smt_enabled_cmdline) {
+               if (!strcmp(smt_enabled_cmdline, "on"))
+                       smt_enabled_at_boot = threads_per_core;
+               else if (!strcmp(smt_enabled_cmdline, "off"))
+                       smt_enabled_at_boot = 0;
+               else {
+                       long smt;
+                       int rc;
+
+                       rc = strict_strtol(smt_enabled_cmdline, 10,&smt);
+                       if (!rc)
+                               smt_enabled_at_boot =
+                                       min(threads_per_core, (int)smt);
+               }
+       } else {
+               dn = of_find_node_by_path("/options");
+               if (dn) {
+                       smt_option = of_get_property(dn, "ibm,smt-enabled",
+                                                    NULL);
+
+                       if (smt_option) {
+                               if (!strcmp(smt_option, "on"))
+                                       smt_enabled_at_boot = threads_per_core;
+                               else if (!strcmp(smt_option, "off"))
+                                       smt_enabled_at_boot = 0;
+                       }

-                if (smt_option) {
-                       if (!strcmp(smt_option, "on"))
-                               smt_enabled_at_boot = 1;
-                       else if (!strcmp(smt_option, "off"))
-                               smt_enabled_at_boot = 0;
-                }
-        }
+                       of_node_put(dn);
+               }
+       }
 }

 /* Look for smt-enabled= cmdline option */
 static int __init early_smt_enabled(char *p)
 {
-       smt_enabled_cmdline = 1;
-
-       if (!p)
-               return 0;
-
-       if (!strcmp(p, "on") || !strcmp(p, "1"))
-               smt_enabled_at_boot = 1;
-       else if (!strcmp(p, "off") || !strcmp(p, "0"))
-               smt_enabled_at_boot = 0;
-
+       smt_enabled_cmdline = p;
        return 0;
 }
 early_param("smt-enabled", early_smt_enabled);
@@ -390,8 +399,8 @@
         */
        xmon_setup();

-       check_smt_enabled();
        smp_setup_cpu_maps();
+       check_smt_enabled();

 #ifdef CONFIG_SMP
        /* Release secondary cpus out of their spinloops at 0x60 now that
Index: powerpc/arch/powerpc/platforms/pseries/smp.c
===================================================================
--- powerpc.orig/arch/powerpc/platforms/pseries/smp.c   2010-05-12 
08:33:38.000000000 -0500
+++ powerpc/arch/powerpc/platforms/pseries/smp.c        2010-05-12 
08:36:09.000000000 -0500
@@ -154,10 +154,13 @@
        /* Special case - we inhibit secondary thread startup
         * during boot if the user requests it.
         */
-       if (system_state<  SYSTEM_RUNNING&&
-           cpu_has_feature(CPU_FTR_SMT)&&
-           !smt_enabled_at_boot&&  cpu_thread_in_core(nr) != 0)
-               return 0;
+       if (system_state<  SYSTEM_RUNNING&&  cpu_has_feature(CPU_FTR_SMT)) {
+               if (!smt_enabled_at_boot&&  cpu_thread_in_core(nr) != 0)
+                       return 0;
+               if (smt_enabled_at_boot
+               &&  cpu_thread_in_core(nr)>= smt_enabled_at_boot)
+                       return 0;
+       }

        return 1;
 }


_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to