Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 366267
b: refs/heads/master
c: 5379f8c
h: refs/heads/master
i:
  366265: b2c0fb2
  366263: 209ff84
v: v3
  • Loading branch information
Ingo Molnar committed Apr 19, 2013
1 parent 7c28bf2 commit 878eade
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 39 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 94c1acf2c85b03a59a42d931a94a13a76c123a62
refs/heads/master: 5379f8c0d72cab43bbe6d974ceb3ad84dddc2b8e
4 changes: 2 additions & 2 deletions trunk/arch/x86/include/asm/mce.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,13 +146,13 @@ DECLARE_PER_CPU(struct device *, mce_device);
void mce_intel_feature_init(struct cpuinfo_x86 *c);
void cmci_clear(void);
void cmci_reenable(void);
void cmci_rediscover(int dying);
void cmci_rediscover(void);
void cmci_recheck(void);
#else
static inline void mce_intel_feature_init(struct cpuinfo_x86 *c) { }
static inline void cmci_clear(void) {}
static inline void cmci_reenable(void) {}
static inline void cmci_rediscover(int dying) {}
static inline void cmci_rediscover(void) {}
static inline void cmci_recheck(void) {}
#endif

Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/x86/kernel/cpu/mcheck/mce.c
Original file line number Diff line number Diff line change
Expand Up @@ -2358,7 +2358,7 @@ mce_cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)

if (action == CPU_POST_DEAD) {
/* intentionally ignoring frozen here */
cmci_rediscover(cpu);
cmci_rediscover();
}

return NOTIFY_OK;
Expand Down
39 changes: 24 additions & 15 deletions trunk/arch/x86/kernel/cpu/mcheck/mce_amd.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
#include <asm/mce.h>
#include <asm/msr.h>

#define NR_BANKS 6
#define NR_BLOCKS 9
#define THRESHOLD_MAX 0xFFF
#define INT_TYPE_APIC 0x00020000
Expand All @@ -57,12 +56,7 @@ static const char * const th_names[] = {
"execution_unit",
};

static DEFINE_PER_CPU(struct threshold_bank * [NR_BANKS], threshold_banks);

static unsigned char shared_bank[NR_BANKS] = {
0, 0, 0, 0, 1
};

static DEFINE_PER_CPU(struct threshold_bank **, threshold_banks);
static DEFINE_PER_CPU(unsigned char, bank_map); /* see which banks are on */

static void amd_threshold_interrupt(void);
Expand All @@ -79,6 +73,12 @@ struct thresh_restart {
u16 old_limit;
};

static inline bool is_shared_bank(int bank)
{
/* Bank 4 is for northbridge reporting and is thus shared */
return (bank == 4);
}

static const char * const bank4_names(struct threshold_block *b)
{
switch (b->address) {
Expand Down Expand Up @@ -214,7 +214,7 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c)
unsigned int bank, block;
int offset = -1;

for (bank = 0; bank < NR_BANKS; ++bank) {
for (bank = 0; bank < mca_cfg.banks; ++bank) {
for (block = 0; block < NR_BLOCKS; ++block) {
if (block == 0)
address = MSR_IA32_MC0_MISC + bank * 4;
Expand Down Expand Up @@ -276,7 +276,7 @@ static void amd_threshold_interrupt(void)
mce_setup(&m);

/* assume first bank caused it */
for (bank = 0; bank < NR_BANKS; ++bank) {
for (bank = 0; bank < mca_cfg.banks; ++bank) {
if (!(per_cpu(bank_map, m.cpu) & (1 << bank)))
continue;
for (block = 0; block < NR_BLOCKS; ++block) {
Expand Down Expand Up @@ -467,7 +467,7 @@ static __cpuinit int allocate_threshold_blocks(unsigned int cpu,
u32 low, high;
int err;

if ((bank >= NR_BANKS) || (block >= NR_BLOCKS))
if ((bank >= mca_cfg.banks) || (block >= NR_BLOCKS))
return 0;

if (rdmsr_safe_on_cpu(cpu, address, &low, &high))
Expand Down Expand Up @@ -575,7 +575,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
const char *name = th_names[bank];
int err = 0;

if (shared_bank[bank]) {
if (is_shared_bank(bank)) {
nb = node_to_amd_nb(amd_get_nb_id(cpu));

/* threshold descriptor already initialized on this node? */
Expand Down Expand Up @@ -609,7 +609,7 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)

per_cpu(threshold_banks, cpu)[bank] = b;

if (shared_bank[bank]) {
if (is_shared_bank(bank)) {
atomic_set(&b->cpus, 1);

/* nb is already initialized, see above */
Expand All @@ -635,9 +635,17 @@ static __cpuinit int threshold_create_bank(unsigned int cpu, unsigned int bank)
static __cpuinit int threshold_create_device(unsigned int cpu)
{
unsigned int bank;
struct threshold_bank **bp;
int err = 0;

for (bank = 0; bank < NR_BANKS; ++bank) {
bp = kzalloc(sizeof(struct threshold_bank *) * mca_cfg.banks,
GFP_KERNEL);
if (!bp)
return -ENOMEM;

per_cpu(threshold_banks, cpu) = bp;

for (bank = 0; bank < mca_cfg.banks; ++bank) {
if (!(per_cpu(bank_map, cpu) & (1 << bank)))
continue;
err = threshold_create_bank(cpu, bank);
Expand Down Expand Up @@ -691,7 +699,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank)
if (!b->blocks)
goto free_out;

if (shared_bank[bank]) {
if (is_shared_bank(bank)) {
if (!atomic_dec_and_test(&b->cpus)) {
__threshold_remove_blocks(b);
per_cpu(threshold_banks, cpu)[bank] = NULL;
Expand Down Expand Up @@ -719,11 +727,12 @@ static void threshold_remove_device(unsigned int cpu)
{
unsigned int bank;

for (bank = 0; bank < NR_BANKS; ++bank) {
for (bank = 0; bank < mca_cfg.banks; ++bank) {
if (!(per_cpu(bank_map, cpu) & (1 << bank)))
continue;
threshold_remove_bank(cpu, bank);
}
kfree(per_cpu(threshold_banks, cpu));
}

/* get notified when a cpu comes on/off */
Expand Down
25 changes: 5 additions & 20 deletions trunk/arch/x86/kernel/cpu/mcheck/mce_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,39 +285,24 @@ void cmci_clear(void)
raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
}

static long cmci_rediscover_work_func(void *arg)
static void 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)
/* After a CPU went down cycle through all the others and rediscover */
void cmci_rediscover(void)
{
int cpu, banks;
int banks;

if (!cmci_supported(&banks))
return;

for_each_online_cpu(cpu) {
if (cpu == dying)
continue;

if (cpu == smp_processor_id()) {
cmci_rediscover_work_func(NULL);
continue;
}

work_on_cpu(cpu, cmci_rediscover_work_func, NULL);
}
on_each_cpu(cmci_rediscover_work_func, NULL, 1);
}

/*
Expand Down

0 comments on commit 878eade

Please sign in to comment.