diff options
Diffstat (limited to 'arch/x86/kernel/cpu/intel_cacheinfo.c')
| -rw-r--r-- | arch/x86/kernel/cpu/intel_cacheinfo.c | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/arch/x86/kernel/cpu/intel_cacheinfo.c b/arch/x86/kernel/cpu/intel_cacheinfo.c index 68b5d8681cbb..48533d77be78 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 __cpuinit 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; |
| @@ -626,8 +623,8 @@ static ssize_t show_shared_cpu_map_func(struct _cpuid4_info *this_leaf, | |||
| 626 | cpumask_t *mask = &this_leaf->shared_cpu_map; | 623 | cpumask_t *mask = &this_leaf->shared_cpu_map; |
| 627 | 624 | ||
| 628 | n = type? | 625 | n = type? |
| 629 | cpulist_scnprintf(buf, len-2, *mask): | 626 | cpulist_scnprintf(buf, len-2, mask) : |
| 630 | cpumask_scnprintf(buf, len-2, *mask); | 627 | cpumask_scnprintf(buf, len-2, mask); |
| 631 | buf[n++] = '\n'; | 628 | buf[n++] = '\n'; |
| 632 | buf[n] = '\0'; | 629 | buf[n] = '\0'; |
| 633 | } | 630 | } |
