aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/eeh_driver.c
diff options
context:
space:
mode:
authorGavin Shan <gwshan@linux.vnet.ibm.com>2014-06-04 03:31:52 -0400
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2014-06-11 03:04:33 -0400
commit5c7a35e3e25232aef8d7aee484436f8cbe3b9b94 (patch)
tree7bf01ffd5b9e4057089c2c2383fbcf492694fca9 /arch/powerpc/kernel/eeh_driver.c
parent6e0fdf9af216887e0032c19d276889aad41cad00 (diff)
powerpc/powernv: Fix killed EEH event
On PowerNV platform, EEH errors are reported by IO accessors or poller driven by interrupt. After the PE is isolated, we won't produce EEH event for the PE. The current implementation has possibility of EEH event lost in this way: The interrupt handler queues one "special" event, which drives the poller. EEH thread doesn't pick the special event yet. IO accessors kicks in, the frozen PE is marked as "isolated" and EEH event is queued to the list. EEH thread runs because of special event and purge all existing EEH events. However, we never produce an other EEH event for the frozen PE. Eventually, the PE is marked as "isolated" and we don't have EEH event to recover it. The patch fixes the issue to keep EEH events for PEs that have been marked as "isolated" with the help of additional "force" help to eeh_remove_event(). Reported-by: Rolf Brudeseth <rolfb@us.ibm.com> Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/eeh_driver.c')
-rw-r--r--arch/powerpc/kernel/eeh_driver.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 8bb40e7cdeb6..420da61d4ce0 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -770,7 +770,7 @@ static void eeh_handle_special_event(void)
770 eeh_serialize_lock(&flags); 770 eeh_serialize_lock(&flags);
771 771
772 /* Purge all events */ 772 /* Purge all events */
773 eeh_remove_event(NULL); 773 eeh_remove_event(NULL, true);
774 774
775 list_for_each_entry(hose, &hose_list, list_node) { 775 list_for_each_entry(hose, &hose_list, list_node) {
776 phb_pe = eeh_phb_pe_get(hose); 776 phb_pe = eeh_phb_pe_get(hose);
@@ -789,7 +789,7 @@ static void eeh_handle_special_event(void)
789 eeh_serialize_lock(&flags); 789 eeh_serialize_lock(&flags);
790 790
791 /* Purge all events of the PHB */ 791 /* Purge all events of the PHB */
792 eeh_remove_event(pe); 792 eeh_remove_event(pe, true);
793 793
794 if (rc == EEH_NEXT_ERR_DEAD_PHB) 794 if (rc == EEH_NEXT_ERR_DEAD_PHB)
795 eeh_pe_state_mark(pe, EEH_PE_ISOLATED); 795 eeh_pe_state_mark(pe, EEH_PE_ISOLATED);