Skip to content

Commit

Permalink
x86, mce, cmci: use polled banks bitmap in machine check poller
Browse files Browse the repository at this point in the history
Define a per cpu bitmap that contains the banks polled by the machine
check poller. This is needed for the CMCI code in the next patches
to be able to disable polling on specific banks.

The bank by default contains all banks, so there is no behaviour
change. Only future code will remove some banks from the polling
set.

Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
  • Loading branch information
Andi Kleen authored and H. Peter Anvin committed Feb 24, 2009
1 parent 8457c84 commit ee031c3
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 6 deletions.
5 changes: 4 additions & 1 deletion arch/x86/include/asm/mce.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,11 +119,14 @@ extern atomic_t mce_entry;

extern void do_machine_check(struct pt_regs *, long);

typedef DECLARE_BITMAP(mce_banks_t, MAX_NR_BANKS);
DECLARE_PER_CPU(mce_banks_t, mce_poll_banks);

enum mcp_flags {
MCP_TIMESTAMP = (1 << 0), /* log time stamp */
MCP_UC = (1 << 1), /* log uncorrected errors */
};
extern void machine_check_poll(enum mcp_flags flags);
extern void machine_check_poll(enum mcp_flags flags, mce_banks_t *b);

extern int mce_notify_user(void);

Expand Down
16 changes: 12 additions & 4 deletions arch/x86/kernel/cpu/mcheck/mce_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ static char *trigger_argv[2] = { trigger, NULL };

static DECLARE_WAIT_QUEUE_HEAD(mce_wait);

/* MCA banks polled by the period polling timer for corrected events */
DEFINE_PER_CPU(mce_banks_t, mce_poll_banks) = {
[0 ... BITS_TO_LONGS(MAX_NR_BANKS)-1] = ~0UL
};

/* Do initial initialization of a struct mce */
void mce_setup(struct mce *m)
{
Expand Down Expand Up @@ -191,7 +196,7 @@ static inline void mce_get_rip(struct mce *m, struct pt_regs *regs)
*
* This is executed in standard interrupt context.
*/
void machine_check_poll(enum mcp_flags flags)
void machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
{
struct mce m;
int i;
Expand All @@ -200,7 +205,7 @@ void machine_check_poll(enum mcp_flags flags)

rdmsrl(MSR_IA32_MCG_STATUS, m.mcgstatus);
for (i = 0; i < banks; i++) {
if (!bank[i])
if (!bank[i] || !test_bit(i, *b))
continue;

m.misc = 0;
Expand Down Expand Up @@ -458,7 +463,8 @@ static void mcheck_timer(unsigned long data)
WARN_ON(smp_processor_id() != data);

if (mce_available(&current_cpu_data))
machine_check_poll(MCP_TIMESTAMP);
machine_check_poll(MCP_TIMESTAMP,
&__get_cpu_var(mce_poll_banks));

/*
* Alert userspace if needed. If we logged an MCE, reduce the
Expand Down Expand Up @@ -572,11 +578,13 @@ static void mce_init(void *dummy)
{
u64 cap;
int i;
mce_banks_t all_banks;

/*
* Log the machine checks left over from the previous reset.
*/
machine_check_poll(MCP_UC);
bitmap_fill(all_banks, MAX_NR_BANKS);
machine_check_poll(MCP_UC, &all_banks);

set_in_cr4(X86_CR4_MCE);

Expand Down
3 changes: 2 additions & 1 deletion arch/x86/kernel/cpu/mcheck/mce_amd_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,8 @@ static void amd_threshold_interrupt(void)

/* Log the machine check that caused the threshold
event. */
machine_check_poll(MCP_TIMESTAMP);
machine_check_poll(MCP_TIMESTAMP,
&__get_cpu_var(mce_poll_banks));

if (high & MASK_OVERFLOW_HI) {
rdmsrl(address, m.misc);
Expand Down

0 comments on commit ee031c3

Please sign in to comment.