diff options
Diffstat (limited to 'arch/x86/kernel/cpu')
| -rw-r--r-- | arch/x86/kernel/cpu/amd.c | 14 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_amd.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mcheck/mce_intel.c | 31 | 
3 files changed, 33 insertions, 14 deletions
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c index f7e98a2c0d1..1b7d1656a04 100644 --- a/arch/x86/kernel/cpu/amd.c +++ b/arch/x86/kernel/cpu/amd.c @@ -631,6 +631,20 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)  		}  	} +	/* +	 * The way access filter has a performance penalty on some workloads. +	 * Disable it on the affected CPUs. +	 */ +	if ((c->x86 == 0x15) && +	    (c->x86_model >= 0x02) && (c->x86_model < 0x20)) { +		u64 val; + +		if (!rdmsrl_safe(0xc0011021, &val) && !(val & 0x1E)) { +			val |= 0x1E; +			wrmsrl_safe(0xc0011021, val); +		} +	} +  	cpu_detect_cache_sizes(c);  	/* Multi core CPU? */ diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c index 698b6ec12e0..1ac581f38df 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_amd.c +++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c @@ -6,7 +6,7 @@   *   *  Written by Jacob Shin - AMD, Inc.   * - *  Support: borislav.petkov@amd.com + *  Maintained by: Borislav Petkov <bp@alien8.de>   *   *  April 2006   *     - added support for AMD Family 0x10 processors diff --git a/arch/x86/kernel/cpu/mcheck/mce_intel.c b/arch/x86/kernel/cpu/mcheck/mce_intel.c index 5f88abf07e9..4f9a3cbfc4a 100644 --- a/arch/x86/kernel/cpu/mcheck/mce_intel.c +++ b/arch/x86/kernel/cpu/mcheck/mce_intel.c @@ -285,34 +285,39 @@ void cmci_clear(void)  	raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);  } +static long cmci_rediscover_work_func(void *arg) +{ +	int banks; + +	/* Recheck banks in case CPUs don't all have the same */ +	if (cmci_supported(&banks)) +		cmci_discover(banks); + +	return 0; +} +  /*   * After a CPU went down cycle through all the others and rediscover   * Must run in process context.   */  void cmci_rediscover(int dying)  { -	int banks; -	int cpu; -	cpumask_var_t old; +	int cpu, banks;  	if (!cmci_supported(&banks))  		return; -	if (!alloc_cpumask_var(&old, GFP_KERNEL)) -		return; -	cpumask_copy(old, ¤t->cpus_allowed);  	for_each_online_cpu(cpu) {  		if (cpu == dying)  			continue; -		if (set_cpus_allowed_ptr(current, cpumask_of(cpu))) + +		if (cpu == smp_processor_id()) { +			cmci_rediscover_work_func(NULL);  			continue; -		/* Recheck banks in case CPUs don't all have the same */ -		if (cmci_supported(&banks)) -			cmci_discover(banks); -	} +		} -	set_cpus_allowed_ptr(current, old); -	free_cpumask_var(old); +		work_on_cpu(cpu, cmci_rediscover_work_func, NULL); +	}  }  /*  |