tree 1a32474c6a7a27a3b143c52d3864eb635453078e
parent b6a68a16dc15c65fe76acb7502a806ae415cd3e4
author Andi Kleen <[EMAIL PROTECTED]> Fri, 29 Jul 2005 11:15:46 -0700
committer Linus Torvalds <[EMAIL PROTECTED]> Fri, 29 Jul 2005 11:46:01 -0700

[PATCH] x86_64: When running cpuid4 need to run on the correct CPU

Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>

 arch/i386/kernel/cpu/intel_cacheinfo.c |   20 ++++++++++++++------
 1 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/arch/i386/kernel/cpu/intel_cacheinfo.c 
b/arch/i386/kernel/cpu/intel_cacheinfo.c
--- a/arch/i386/kernel/cpu/intel_cacheinfo.c
+++ b/arch/i386/kernel/cpu/intel_cacheinfo.c
@@ -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
-
To unsubscribe from this list: send the line "unsubscribe bk-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to