Skip to content

Commit

Permalink
powerpc/eeh: Make EEH handler PE sensitive
Browse files Browse the repository at this point in the history
Once eeh error is found, eeh event will be created and put it into
the global linked list. At the mean while, kernel thread will be
started to process it. The handler for the kernel thread originally
was eeh device sensitive.

The patch reworks the handler of the kernel thread so that it's PE
sensitive.

Signed-off-by: Gavin Shan <shangw@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Gavin Shan authored and Benjamin Herrenschmidt committed Sep 9, 2012
1 parent c270a24 commit 120dc49
Showing 1 changed file with 10 additions and 15 deletions.
25 changes: 10 additions & 15 deletions arch/powerpc/platforms/pseries/eeh_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ static int eeh_event_handler(void * dummy)
{
unsigned long flags;
struct eeh_event *event;
struct eeh_dev *edev;
struct eeh_pe *pe;

set_task_comm(current, "eehd");

Expand All @@ -76,28 +76,23 @@ static int eeh_event_handler(void * dummy)

/* Serialize processing of EEH events */
mutex_lock(&eeh_event_mutex);
edev = event->edev;
eeh_mark_slot(eeh_dev_to_of_node(edev), EEH_MODE_RECOVERING);

printk(KERN_INFO "EEH: Detected PCI bus error on device %s\n",
eeh_pci_name(edev->pdev));
pe = event->pe;
eeh_pe_state_mark(pe, EEH_PE_RECOVERING);
pr_info("EEH: Detected PCI bus error on PHB#%d-PE#%x\n",
pe->phb->global_number, pe->addr);

set_current_state(TASK_INTERRUPTIBLE); /* Don't add to load average */
edev = handle_eeh_events(event);

if (edev) {
eeh_clear_slot(eeh_dev_to_of_node(edev), EEH_MODE_RECOVERING);
pci_dev_put(edev->pdev);
}
handle_eeh_events(event);
eeh_pe_state_clear(pe, EEH_PE_RECOVERING);

kfree(event);
mutex_unlock(&eeh_event_mutex);

/* If there are no new errors after an hour, clear the counter. */
if (edev && edev->freeze_count>0) {
if (pe && pe->freeze_count > 0) {
msleep_interruptible(3600*1000);
if (edev->freeze_count>0)
edev->freeze_count--;
if (pe->freeze_count > 0)
pe->freeze_count--;

}

Expand Down

0 comments on commit 120dc49

Please sign in to comment.