Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2cac789 authored by Andi Kleen's avatar Andi Kleen Committed by Linus Torvalds
Browse files

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



Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b6a68a16
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -128,7 +128,7 @@ static int __devinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_le
	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_attributes(unsigned int cpu)
	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_attributes(unsigned int cpu)
	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:
out:
	if (retval)
		free_cache_attributes(cpu);
	return -ENOMEM;
	return retval;
}

#ifdef CONFIG_SYSFS