Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 138644
b: refs/heads/master
c: ee031c3
h: refs/heads/master
v: v3
  • Loading branch information
Andi Kleen authored and H. Peter Anvin committed Feb 24, 2009
1 parent 34fe7f8 commit b17d25c
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 7 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: 8457c84d68678cbfd4167a9073b89da58e48c037
refs/heads/master: ee031c31d6381d004bfd386c2e45821211507499
5 changes: 4 additions & 1 deletion trunk/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 trunk/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 trunk/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 b17d25c

Please sign in to comment.