diff options
| -rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 43ea612d3e9d..fb7f946cb65e 100644 --- a/arch/x86/kernel/cpu/intel_cacheinfo.c +++ b/arch/x86/kernel/cpu/intel_cacheinfo.c | |||
| @@ -534,31 +534,16 @@ static void __cpuinit free_cache_attributes(unsigned int cpu) | |||
| 534 | per_cpu(cpuid4_info, cpu) = NULL; | 534 | per_cpu(cpuid4_info, cpu) = NULL; |
| 535 | } | 535 | } |
| 536 | 536 | ||
| 537 | static int __cpuinit detect_cache_attributes(unsigned int cpu) | 537 | static void get_cpu_leaves(void *_retval) |
| 538 | { | 538 | { |
| 539 | struct _cpuid4_info *this_leaf; | 539 | int j, *retval = _retval, cpu = smp_processor_id(); |
| 540 | unsigned long j; | ||
| 541 | int retval; | ||
| 542 | cpumask_t oldmask; | ||
| 543 | |||
| 544 | if (num_cache_leaves == 0) | ||
| 545 | return -ENOENT; | ||
| 546 | |||
| 547 | per_cpu(cpuid4_info, cpu) = kzalloc( | ||
| 548 | sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL); | ||
| 549 | if (per_cpu(cpuid4_info, cpu) == NULL) | ||
| 550 | return -ENOMEM; | ||
| 551 | |||
| 552 | oldmask = current->cpus_allowed; | ||
| 553 | retval = set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu)); | ||
| 554 | if (retval) | ||
| 555 | goto out; | ||
| 556 | 540 | ||
| 557 | /* Do cpuid and store the results */ | 541 | /* Do cpuid and store the results */ |
| 558 | for (j = 0; j < num_cache_leaves; j++) { | 542 | for (j = 0; j < num_cache_leaves; j++) { |
| 543 | struct _cpuid4_info *this_leaf; | ||
| 559 | this_leaf = CPUID4_INFO_IDX(cpu, j); | 544 | this_leaf = CPUID4_INFO_IDX(cpu, j); |
| 560 | retval = cpuid4_cache_lookup(j, this_leaf); | 545 | *retval = cpuid4_cache_lookup(j, this_leaf); |
| 561 | if (unlikely(retval < 0)) { | 546 | if (unlikely(*retval < 0)) { |
| 562 | int i; | 547 | int i; |
| 563 | 548 | ||
| 564 | for (i = 0; i < j; i++) | 549 | for (i = 0; i < j; i++) |
| @@ -567,9 +552,21 @@ static int __cpuinit detect_cache_attributes(unsigned int cpu) | |||
| 567 | } | 552 | } |
| 568 | cache_shared_cpu_map_setup(cpu, j); | 553 | cache_shared_cpu_map_setup(cpu, j); |
| 569 | } | 554 | } |
| 570 | set_cpus_allowed_ptr(current, &oldmask); | 555 | } |
| 556 | |||
| 557 | static int __cpuinit detect_cache_attributes(unsigned int cpu) | ||
| 558 | { | ||
| 559 | int retval; | ||
| 560 | |||
| 561 | if (num_cache_leaves == 0) | ||
| 562 | return -ENOENT; | ||
| 563 | |||
| 564 | per_cpu(cpuid4_info, cpu) = kzalloc( | ||
| 565 | sizeof(struct _cpuid4_info) * num_cache_leaves, GFP_KERNEL); | ||
| 566 | if (per_cpu(cpuid4_info, cpu) == NULL) | ||
| 567 | return -ENOMEM; | ||
| 571 | 568 | ||
| 572 | out: | 569 | smp_call_function_single(cpu, get_cpu_leaves, &retval, true); |
| 573 | if (retval) { | 570 | if (retval) { |
| 574 | kfree(per_cpu(cpuid4_info, cpu)); | 571 | kfree(per_cpu(cpuid4_info, cpu)); |
| 575 | per_cpu(cpuid4_info, cpu) = NULL; | 572 | per_cpu(cpuid4_info, cpu) = NULL; |
