From: "Andi Kleen" Signed-off-by: Andi Kleen Signed-off-by: Andrew Morton --- arch/i386/kernel/cpu/intel_cacheinfo.c | 20 ++++++++++++++------ 1 files changed, 14 insertions(+), 6 deletions(-) diff -puN arch/i386/kernel/cpu/intel_cacheinfo.c~x86_64-when-running-cpuid4-need-to-run-on-the-correct arch/i386/kernel/cpu/intel_cacheinfo.c --- devel/arch/i386/kernel/cpu/intel_cacheinfo.c~x86_64-when-running-cpuid4-need-to-run-on-the-correct 2005-07-27 12:36:45.000000000 -0700 +++ devel-akpm/arch/i386/kernel/cpu/intel_cacheinfo.c 2005-07-27 12:36:45.000000000 -0700 @@ -128,7 +128,7 @@ static int __devinit cpuid4_cache_lookup cpuid_count(4, index, &eax, &ebx, &ecx, &edx); cache_eax.full = eax; if (cache_eax.split.type == CACHE_TYPE_NULL) - return -1; + return -EIO; /* better error ? */ this_leaf->eax.full = eax; this_leaf->ebx.full = ebx; @@ -334,6 +334,7 @@ static int __devinit detect_cache_attrib struct _cpuid4_info *this_leaf; unsigned long j; int retval; + cpumask_t oldmask; if (num_cache_leaves == 0) return -ENOENT; @@ -345,19 +346,26 @@ static int __devinit detect_cache_attrib memset(cpuid4_info[cpu], 0, sizeof(struct _cpuid4_info) * num_cache_leaves); + oldmask = current->cpus_allowed; + retval = set_cpus_allowed(current, cpumask_of_cpu(cpu)); + if (retval) + goto out; + /* Do cpuid and store the results */ + retval = 0; for (j = 0; j < num_cache_leaves; j++) { this_leaf = CPUID4_INFO_IDX(cpu, j); retval = cpuid4_cache_lookup(j, this_leaf); if (unlikely(retval < 0)) - goto err_out; + break; cache_shared_cpu_map_setup(cpu, j); } - return 0; + set_cpus_allowed(current, oldmask); -err_out: - free_cache_attributes(cpu); - return -ENOMEM; +out: + if (retval) + free_cache_attributes(cpu); + return retval; } #ifdef CONFIG_SYSFS _