diff options
-rw-r--r-- | arch/powerpc/include/asm/eeh_event.h | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/eeh_event.c | 37 |
2 files changed, 38 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/eeh_event.h b/arch/powerpc/include/asm/eeh_event.h index de92c86221e7..89d5670b2eeb 100644 --- a/arch/powerpc/include/asm/eeh_event.h +++ b/arch/powerpc/include/asm/eeh_event.h | |||
@@ -33,6 +33,7 @@ struct eeh_event { | |||
33 | 33 | ||
34 | int eeh_event_init(void); | 34 | int eeh_event_init(void); |
35 | int eeh_send_failure_event(struct eeh_pe *pe); | 35 | int eeh_send_failure_event(struct eeh_pe *pe); |
36 | void eeh_remove_event(struct eeh_pe *pe); | ||
36 | void eeh_handle_event(struct eeh_pe *pe); | 37 | void eeh_handle_event(struct eeh_pe *pe); |
37 | 38 | ||
38 | #endif /* __KERNEL__ */ | 39 | #endif /* __KERNEL__ */ |
diff --git a/arch/powerpc/kernel/eeh_event.c b/arch/powerpc/kernel/eeh_event.c index 62e532ddfb68..39bcd81e7f5d 100644 --- a/arch/powerpc/kernel/eeh_event.c +++ b/arch/powerpc/kernel/eeh_event.c | |||
@@ -142,3 +142,40 @@ int eeh_send_failure_event(struct eeh_pe *pe) | |||
142 | 142 | ||
143 | return 0; | 143 | return 0; |
144 | } | 144 | } |
145 | |||
146 | /** | ||
147 | * eeh_remove_event - Remove EEH event from the queue | ||
148 | * @pe: Event binding to the PE | ||
149 | * | ||
150 | * On PowerNV platform, we might have subsequent coming events | ||
151 | * is part of the former one. For that case, those subsequent | ||
152 | * coming events are totally duplicated and unnecessary, thus | ||
153 | * they should be removed. | ||
154 | */ | ||
155 | void eeh_remove_event(struct eeh_pe *pe) | ||
156 | { | ||
157 | unsigned long flags; | ||
158 | struct eeh_event *event, *tmp; | ||
159 | |||
160 | spin_lock_irqsave(&eeh_eventlist_lock, flags); | ||
161 | list_for_each_entry_safe(event, tmp, &eeh_eventlist, list) { | ||
162 | /* | ||
163 | * If we don't have valid PE passed in, that means | ||
164 | * we already have event corresponding to dead IOC | ||
165 | * and all events should be purged. | ||
166 | */ | ||
167 | if (!pe) { | ||
168 | list_del(&event->list); | ||
169 | kfree(event); | ||
170 | } else if (pe->type & EEH_PE_PHB) { | ||
171 | if (event->pe && event->pe->phb == pe->phb) { | ||
172 | list_del(&event->list); | ||
173 | kfree(event); | ||
174 | } | ||
175 | } else if (event->pe == pe) { | ||
176 | list_del(&event->list); | ||
177 | kfree(event); | ||
178 | } | ||
179 | } | ||
180 | spin_unlock_irqrestore(&eeh_eventlist_lock, flags); | ||
181 | } | ||