i386: Fix AP count after LAPIC enumeration
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 15 May 2011 06:29:02 +0000 (14:29 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sun, 15 May 2011 06:29:02 +0000 (14:29 +0800)
sys/platform/pc32/apic/lapic.c
sys/platform/pc32/i386/mptable.c

index 597c037..b40542f 100644 (file)
@@ -638,7 +638,7 @@ int
 lapic_config(void)
 {
        struct lapic_enumerator *e;
-       int error, i, enable;
+       int error, i, enable, ap_max;
 
        for (i = 0; i < NAPICID; ++i)
                APICID_TO_CPUID(i) = -1;
@@ -661,6 +661,19 @@ lapic_config(void)
        }
 
        e->lapic_enumerate(e);
+
+       ap_max = MAXCPU - 1;
+       TUNABLE_INT_FETCH("hw.ap_max", &ap_max);
+       if (ap_max > MAXCPU - 1)
+               ap_max = MAXCPU - 1;
+
+       if (mp_naps > ap_max) {
+               kprintf("LAPIC: Warning use only %d out of %d "
+                       "available APs\n",
+                       ap_max, mp_naps);
+               mp_naps = ap_max;
+       }
+
        return 0;
 }
 
index b197877..a2009df 100644 (file)
@@ -778,16 +778,7 @@ mptable_lapic_enumerate(struct lapic_enumerator *e)
                if (logical_cpus != 0)
                        arg1.cpu_count *= logical_cpus;
        }
-       mp_naps = arg1.cpu_count;
-
-       /* Qualify the numbers again, after possible HT fixup */
-       if (mp_naps > MAXCPU) {
-               kprintf("Warning: only using %d of %d available CPUs!\n",
-                       MAXCPU, mp_naps);
-               mp_naps = MAXCPU;
-       }
-
-       --mp_naps;      /* subtract the BSP */
+       mp_naps = arg1.cpu_count - 1;   /* subtract the BSP */
 
        /*
         * Link logical CPU id to local apic id