aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-11-11 20:46:43 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-11-11 20:46:43 -0500
commit6df1e7f2e96721dfdbfd8a034e52bc81916f978c (patch)
tree8567e8dd37a2ebdc5f7670c88e82f2e9d9e725be
parentd96d8aa261708ecb1536d2733081800e7e15e8f4 (diff)
parentb53b5eda8194214928c8243d711a75dbf51809fc (diff)
Merge branch 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 cpu changes from Ingo Molnar: "The biggest change that stands out is the increase of the CONFIG_NR_CPUS range from 4096 to 8192 - as real hardware out there already went beyond 4k CPUs ... We only allow more than 512 CPUs if offstack cpumasks are enabled. CONFIG_MAXSMP=y remains to be the 'you are nuts!' extreme testcase, which now means a max of 8192 CPUs" * 'x86-cpu-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/cpu: Increase max CPU count to 8192 x86/cpu: Allow higher NR_CPUS values x86/cpu: Always print SMP information in /proc/cpuinfo x86/cpu: Track legacy CPU model data only on 32-bit kernels
-rw-r--r--arch/x86/Kconfig8
-rw-r--r--arch/x86/kernel/cpu/amd.c6
-rw-r--r--arch/x86/kernel/cpu/centaur.c8
-rw-r--r--arch/x86/kernel/cpu/common.c12
-rw-r--r--arch/x86/kernel/cpu/cpu.h20
-rw-r--r--arch/x86/kernel/cpu/intel.c12
-rw-r--r--arch/x86/kernel/cpu/proc.c15
-rw-r--r--arch/x86/kernel/cpu/umc.c4
8 files changed, 45 insertions, 40 deletions
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 5cd6eea9b7b3..e6dde05e7eb0 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -826,14 +826,16 @@ config MAXSMP
826config NR_CPUS 826config NR_CPUS
827 int "Maximum number of CPUs" if SMP && !MAXSMP 827 int "Maximum number of CPUs" if SMP && !MAXSMP
828 range 2 8 if SMP && X86_32 && !X86_BIGSMP 828 range 2 8 if SMP && X86_32 && !X86_BIGSMP
829 range 2 512 if SMP && !MAXSMP 829 range 2 512 if SMP && !MAXSMP && !CPUMASK_OFFSTACK
830 range 2 8192 if SMP && !MAXSMP && CPUMASK_OFFSTACK && X86_64
830 default "1" if !SMP 831 default "1" if !SMP
831 default "4096" if MAXSMP 832 default "8192" if MAXSMP
832 default "32" if SMP && (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000) 833 default "32" if SMP && (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000)
833 default "8" if SMP 834 default "8" if SMP
834 ---help--- 835 ---help---
835 This allows you to specify the maximum number of CPUs which this 836 This allows you to specify the maximum number of CPUs which this
836 kernel will support. The maximum supported value is 512 and the 837 kernel will support. If CPUMASK_OFFSTACK is enabled, the maximum
838 supported value is 4096, otherwise the maximum value is 512. The
837 minimum value which makes sense is 2. 839 minimum value which makes sense is 2.
838 840
839 This is purely to save memory - each supported CPU adds 841 This is purely to save memory - each supported CPU adds
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index 903a264af981..3daece79a142 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -823,8 +823,8 @@ static const struct cpu_dev amd_cpu_dev = {
823 .c_vendor = "AMD", 823 .c_vendor = "AMD",
824 .c_ident = { "AuthenticAMD" }, 824 .c_ident = { "AuthenticAMD" },
825#ifdef CONFIG_X86_32 825#ifdef CONFIG_X86_32
826 .c_models = { 826 .legacy_models = {
827 { .vendor = X86_VENDOR_AMD, .family = 4, .model_names = 827 { .family = 4, .model_names =
828 { 828 {
829 [3] = "486 DX/2", 829 [3] = "486 DX/2",
830 [7] = "486 DX/2-WB", 830 [7] = "486 DX/2-WB",
@@ -835,7 +835,7 @@ static const struct cpu_dev amd_cpu_dev = {
835 } 835 }
836 }, 836 },
837 }, 837 },
838 .c_size_cache = amd_size_cache, 838 .legacy_cache_size = amd_size_cache,
839#endif 839#endif
840 .c_early_init = early_init_amd, 840 .c_early_init = early_init_amd,
841 .c_detect_tlb = cpu_detect_tlb_amd, 841 .c_detect_tlb = cpu_detect_tlb_amd,
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c
index fbf6c3bc2400..8d5652dc99dd 100644
--- a/arch/x86/kernel/cpu/centaur.c
+++ b/arch/x86/kernel/cpu/centaur.c
@@ -468,10 +468,10 @@ static void init_centaur(struct cpuinfo_x86 *c)
468#endif 468#endif
469} 469}
470 470
471#ifdef CONFIG_X86_32
471static unsigned int 472static unsigned int
472centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size) 473centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size)
473{ 474{
474#ifdef CONFIG_X86_32
475 /* VIA C3 CPUs (670-68F) need further shifting. */ 475 /* VIA C3 CPUs (670-68F) need further shifting. */
476 if ((c->x86 == 6) && ((c->x86_model == 7) || (c->x86_model == 8))) 476 if ((c->x86 == 6) && ((c->x86_model == 7) || (c->x86_model == 8)))
477 size >>= 8; 477 size >>= 8;
@@ -484,16 +484,18 @@ centaur_size_cache(struct cpuinfo_x86 *c, unsigned int size)
484 if ((c->x86 == 6) && (c->x86_model == 9) && 484 if ((c->x86 == 6) && (c->x86_model == 9) &&
485 (c->x86_mask == 1) && (size == 65)) 485 (c->x86_mask == 1) && (size == 65))
486 size -= 1; 486 size -= 1;
487#endif
488 return size; 487 return size;
489} 488}
489#endif
490 490
491static const struct cpu_dev centaur_cpu_dev = { 491static const struct cpu_dev centaur_cpu_dev = {
492 .c_vendor = "Centaur", 492 .c_vendor = "Centaur",
493 .c_ident = { "CentaurHauls" }, 493 .c_ident = { "CentaurHauls" },
494 .c_early_init = early_init_centaur, 494 .c_early_init = early_init_centaur,
495 .c_init = init_centaur, 495 .c_init = init_centaur,
496 .c_size_cache = centaur_size_cache, 496#ifdef CONFIG_X86_32
497 .legacy_cache_size = centaur_size_cache,
498#endif
497 .c_x86_vendor = X86_VENDOR_CENTAUR, 499 .c_x86_vendor = X86_VENDOR_CENTAUR,
498}; 500};
499 501
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 5223fe6dec7b..6abc172b8258 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -346,7 +346,8 @@ static void filter_cpuid_features(struct cpuinfo_x86 *c, bool warn)
346/* Look up CPU names by table lookup. */ 346/* Look up CPU names by table lookup. */
347static const char *table_lookup_model(struct cpuinfo_x86 *c) 347static const char *table_lookup_model(struct cpuinfo_x86 *c)
348{ 348{
349 const struct cpu_model_info *info; 349#ifdef CONFIG_X86_32
350 const struct legacy_cpu_model_info *info;
350 351
351 if (c->x86_model >= 16) 352 if (c->x86_model >= 16)
352 return NULL; /* Range check */ 353 return NULL; /* Range check */
@@ -354,13 +355,14 @@ static const char *table_lookup_model(struct cpuinfo_x86 *c)
354 if (!this_cpu) 355 if (!this_cpu)
355 return NULL; 356 return NULL;
356 357
357 info = this_cpu->c_models; 358 info = this_cpu->legacy_models;
358 359
359 while (info && info->family) { 360 while (info->family) {
360 if (info->family == c->x86) 361 if (info->family == c->x86)
361 return info->model_names[c->x86_model]; 362 return info->model_names[c->x86_model];
362 info++; 363 info++;
363 } 364 }
365#endif
364 return NULL; /* Not found */ 366 return NULL; /* Not found */
365} 367}
366 368
@@ -450,8 +452,8 @@ void cpu_detect_cache_sizes(struct cpuinfo_x86 *c)
450 c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff); 452 c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff);
451#else 453#else
452 /* do processor-specific cache resizing */ 454 /* do processor-specific cache resizing */
453 if (this_cpu->c_size_cache) 455 if (this_cpu->legacy_cache_size)
454 l2size = this_cpu->c_size_cache(c, l2size); 456 l2size = this_cpu->legacy_cache_size(c, l2size);
455 457
456 /* Allow user to override all this if necessary. */ 458 /* Allow user to override all this if necessary. */
457 if (cachesize_override != -1) 459 if (cachesize_override != -1)
diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h
index 4041c24ae7db..c37dc37e8317 100644
--- a/arch/x86/kernel/cpu/cpu.h
+++ b/arch/x86/kernel/cpu/cpu.h
@@ -1,12 +1,6 @@
1#ifndef ARCH_X86_CPU_H 1#ifndef ARCH_X86_CPU_H
2#define ARCH_X86_CPU_H 2#define ARCH_X86_CPU_H
3 3
4struct cpu_model_info {
5 int vendor;
6 int family;
7 const char *model_names[16];
8};
9
10/* attempt to consolidate cpu attributes */ 4/* attempt to consolidate cpu attributes */
11struct cpu_dev { 5struct cpu_dev {
12 const char *c_vendor; 6 const char *c_vendor;
@@ -14,15 +8,23 @@ struct cpu_dev {
14 /* some have two possibilities for cpuid string */ 8 /* some have two possibilities for cpuid string */
15 const char *c_ident[2]; 9 const char *c_ident[2];
16 10
17 struct cpu_model_info c_models[4];
18
19 void (*c_early_init)(struct cpuinfo_x86 *); 11 void (*c_early_init)(struct cpuinfo_x86 *);
20 void (*c_bsp_init)(struct cpuinfo_x86 *); 12 void (*c_bsp_init)(struct cpuinfo_x86 *);
21 void (*c_init)(struct cpuinfo_x86 *); 13 void (*c_init)(struct cpuinfo_x86 *);
22 void (*c_identify)(struct cpuinfo_x86 *); 14 void (*c_identify)(struct cpuinfo_x86 *);
23 void (*c_detect_tlb)(struct cpuinfo_x86 *); 15 void (*c_detect_tlb)(struct cpuinfo_x86 *);
24 unsigned int (*c_size_cache)(struct cpuinfo_x86 *, unsigned int);
25 int c_x86_vendor; 16 int c_x86_vendor;
17#ifdef CONFIG_X86_32
18 /* Optional vendor specific routine to obtain the cache size. */
19 unsigned int (*legacy_cache_size)(struct cpuinfo_x86 *,
20 unsigned int);
21
22 /* Family/stepping-based lookup table for model names. */
23 struct legacy_cpu_model_info {
24 int family;
25 const char *model_names[16];
26 } legacy_models[5];
27#endif
26}; 28};
27 29
28struct _tlb_table { 30struct _tlb_table {
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index ec7299566f79..dc1ec0dff939 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -665,8 +665,8 @@ static const struct cpu_dev intel_cpu_dev = {
665 .c_vendor = "Intel", 665 .c_vendor = "Intel",
666 .c_ident = { "GenuineIntel" }, 666 .c_ident = { "GenuineIntel" },
667#ifdef CONFIG_X86_32 667#ifdef CONFIG_X86_32
668 .c_models = { 668 .legacy_models = {
669 { .vendor = X86_VENDOR_INTEL, .family = 4, .model_names = 669 { .family = 4, .model_names =
670 { 670 {
671 [0] = "486 DX-25/33", 671 [0] = "486 DX-25/33",
672 [1] = "486 DX-50", 672 [1] = "486 DX-50",
@@ -679,7 +679,7 @@ static const struct cpu_dev intel_cpu_dev = {
679 [9] = "486 DX/4-WB" 679 [9] = "486 DX/4-WB"
680 } 680 }
681 }, 681 },
682 { .vendor = X86_VENDOR_INTEL, .family = 5, .model_names = 682 { .family = 5, .model_names =
683 { 683 {
684 [0] = "Pentium 60/66 A-step", 684 [0] = "Pentium 60/66 A-step",
685 [1] = "Pentium 60/66", 685 [1] = "Pentium 60/66",
@@ -690,7 +690,7 @@ static const struct cpu_dev intel_cpu_dev = {
690 [8] = "Mobile Pentium MMX" 690 [8] = "Mobile Pentium MMX"
691 } 691 }
692 }, 692 },
693 { .vendor = X86_VENDOR_INTEL, .family = 6, .model_names = 693 { .family = 6, .model_names =
694 { 694 {
695 [0] = "Pentium Pro A-step", 695 [0] = "Pentium Pro A-step",
696 [1] = "Pentium Pro", 696 [1] = "Pentium Pro",
@@ -704,7 +704,7 @@ static const struct cpu_dev intel_cpu_dev = {
704 [11] = "Pentium III (Tualatin)", 704 [11] = "Pentium III (Tualatin)",
705 } 705 }
706 }, 706 },
707 { .vendor = X86_VENDOR_INTEL, .family = 15, .model_names = 707 { .family = 15, .model_names =
708 { 708 {
709 [0] = "Pentium 4 (Unknown)", 709 [0] = "Pentium 4 (Unknown)",
710 [1] = "Pentium 4 (Willamette)", 710 [1] = "Pentium 4 (Willamette)",
@@ -714,7 +714,7 @@ static const struct cpu_dev intel_cpu_dev = {
714 } 714 }
715 }, 715 },
716 }, 716 },
717 .c_size_cache = intel_size_cache, 717 .legacy_cache_size = intel_size_cache,
718#endif 718#endif
719 .c_detect_tlb = intel_detect_tlb, 719 .c_detect_tlb = intel_detect_tlb,
720 .c_early_init = early_init_intel, 720 .c_early_init = early_init_intel,
diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c
index aee6317b902f..06fe3ed8b851 100644
--- a/arch/x86/kernel/cpu/proc.c
+++ b/arch/x86/kernel/cpu/proc.c
@@ -11,15 +11,12 @@ static void show_cpuinfo_core(struct seq_file *m, struct cpuinfo_x86 *c,
11 unsigned int cpu) 11 unsigned int cpu)
12{ 12{
13#ifdef CONFIG_SMP 13#ifdef CONFIG_SMP
14 if (c->x86_max_cores * smp_num_siblings > 1) { 14 seq_printf(m, "physical id\t: %d\n", c->phys_proc_id);
15 seq_printf(m, "physical id\t: %d\n", c->phys_proc_id); 15 seq_printf(m, "siblings\t: %d\n", cpumask_weight(cpu_core_mask(cpu)));
16 seq_printf(m, "siblings\t: %d\n", 16 seq_printf(m, "core id\t\t: %d\n", c->cpu_core_id);
17 cpumask_weight(cpu_core_mask(cpu))); 17 seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
18 seq_printf(m, "core id\t\t: %d\n", c->cpu_core_id); 18 seq_printf(m, "apicid\t\t: %d\n", c->apicid);
19 seq_printf(m, "cpu cores\t: %d\n", c->booted_cores); 19 seq_printf(m, "initial apicid\t: %d\n", c->initial_apicid);
20 seq_printf(m, "apicid\t\t: %d\n", c->apicid);
21 seq_printf(m, "initial apicid\t: %d\n", c->initial_apicid);
22 }
23#endif 20#endif
24} 21}
25 22
diff --git a/arch/x86/kernel/cpu/umc.c b/arch/x86/kernel/cpu/umc.c
index 202759a14121..75c5ad5d35cc 100644
--- a/arch/x86/kernel/cpu/umc.c
+++ b/arch/x86/kernel/cpu/umc.c
@@ -11,8 +11,8 @@
11static const struct cpu_dev umc_cpu_dev = { 11static const struct cpu_dev umc_cpu_dev = {
12 .c_vendor = "UMC", 12 .c_vendor = "UMC",
13 .c_ident = { "UMC UMC UMC" }, 13 .c_ident = { "UMC UMC UMC" },
14 .c_models = { 14 .legacy_models = {
15 { .vendor = X86_VENDOR_UMC, .family = 4, .model_names = 15 { .family = 4, .model_names =
16 { 16 {
17 [1] = "U5D", 17 [1] = "U5D",
18 [2] = "U5S", 18 [2] = "U5S",