Skip to content

Commit

Permalink
i7core_edac: First store, then increment
Browse files Browse the repository at this point in the history
Fix ringbuffer store logic.

While here, add a few comments to the code and remove the undesired
printk that could otherwise be called during NMI time.

Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
Mauro Carvalho Chehab committed May 10, 2010
1 parent 4f87fad commit 6e103be
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions drivers/edac/i7core_edac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1678,6 +1678,8 @@ static void i7core_check_error(struct mem_ctl_info *mci)
* This routine simply queues mcelog errors, and
* return. The error itself should be handled later
* by i7core_check_error.
* WARNING: As this routine should be called at NMI time, extra care should
* be taken to avoid deadlocks, and to be as fast as possible.
*/
static int i7core_mce_check_error(void *priv, struct mce *mce)
{
Expand All @@ -1696,23 +1698,20 @@ static int i7core_mce_check_error(void *priv, struct mce *mce)
return 0;

/* Only handle if it is the right mc controller */
if (cpu_data(mce->cpu).phys_proc_id != pvt->i7core_dev->socket) {
debugf0("mc%d: ignoring mce log for socket %d. "
"Another mc should get it.\n",
pvt->i7core_dev->socket,
cpu_data(mce->cpu).phys_proc_id);
if (cpu_data(mce->cpu).phys_proc_id != pvt->i7core_dev->socket)
return 0;
}

smp_rmb();
if ((pvt->mce_out + 1) % sizeof(mce_entry) == pvt->mce_in) {
smp_wmb();
pvt->mce_overrun++;
return 0;
}

/* Copy memory error at the ringbuffer */
memcpy(&pvt->mce_entry[pvt->mce_out], mce, sizeof(*mce));
smp_wmb();
pvt->mce_out = (pvt->mce_out + 1) % sizeof(mce_entry);
memcpy(&pvt->mce_entry[pvt->mce_out], mce, sizeof(*mce));

/* Handle fatal errors immediately */
if (mce->mcgstatus & 1)
Expand Down

0 comments on commit 6e103be

Please sign in to comment.