diff options
Diffstat (limited to 'drivers/edac')
-rw-r--r-- | drivers/edac/i7core_edac.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c index 477b62a74dbf..59ec44175560 100644 --- a/drivers/edac/i7core_edac.c +++ b/drivers/edac/i7core_edac.c | |||
@@ -1678,6 +1678,8 @@ static void i7core_check_error(struct mem_ctl_info *mci) | |||
1678 | * This routine simply queues mcelog errors, and | 1678 | * This routine simply queues mcelog errors, and |
1679 | * return. The error itself should be handled later | 1679 | * return. The error itself should be handled later |
1680 | * by i7core_check_error. | 1680 | * by i7core_check_error. |
1681 | * WARNING: As this routine should be called at NMI time, extra care should | ||
1682 | * be taken to avoid deadlocks, and to be as fast as possible. | ||
1681 | */ | 1683 | */ |
1682 | static int i7core_mce_check_error(void *priv, struct mce *mce) | 1684 | static int i7core_mce_check_error(void *priv, struct mce *mce) |
1683 | { | 1685 | { |
@@ -1696,13 +1698,8 @@ static int i7core_mce_check_error(void *priv, struct mce *mce) | |||
1696 | return 0; | 1698 | return 0; |
1697 | 1699 | ||
1698 | /* Only handle if it is the right mc controller */ | 1700 | /* Only handle if it is the right mc controller */ |
1699 | if (cpu_data(mce->cpu).phys_proc_id != pvt->i7core_dev->socket) { | 1701 | if (cpu_data(mce->cpu).phys_proc_id != pvt->i7core_dev->socket) |
1700 | debugf0("mc%d: ignoring mce log for socket %d. " | ||
1701 | "Another mc should get it.\n", | ||
1702 | pvt->i7core_dev->socket, | ||
1703 | cpu_data(mce->cpu).phys_proc_id); | ||
1704 | return 0; | 1702 | return 0; |
1705 | } | ||
1706 | 1703 | ||
1707 | smp_rmb(); | 1704 | smp_rmb(); |
1708 | if ((pvt->mce_out + 1) % sizeof(mce_entry) == pvt->mce_in) { | 1705 | if ((pvt->mce_out + 1) % sizeof(mce_entry) == pvt->mce_in) { |
@@ -1710,9 +1707,11 @@ static int i7core_mce_check_error(void *priv, struct mce *mce) | |||
1710 | pvt->mce_overrun++; | 1707 | pvt->mce_overrun++; |
1711 | return 0; | 1708 | return 0; |
1712 | } | 1709 | } |
1710 | |||
1711 | /* Copy memory error at the ringbuffer */ | ||
1712 | memcpy(&pvt->mce_entry[pvt->mce_out], mce, sizeof(*mce)); | ||
1713 | smp_wmb(); | 1713 | smp_wmb(); |
1714 | pvt->mce_out = (pvt->mce_out + 1) % sizeof(mce_entry); | 1714 | pvt->mce_out = (pvt->mce_out + 1) % sizeof(mce_entry); |
1715 | memcpy(&pvt->mce_entry[pvt->mce_out], mce, sizeof(*mce)); | ||
1716 | 1715 | ||
1717 | /* Handle fatal errors immediately */ | 1716 | /* Handle fatal errors immediately */ |
1718 | if (mce->mcgstatus & 1) | 1717 | if (mce->mcgstatus & 1) |