diff options
Diffstat (limited to 'drivers/edac/edac_mc.c')
-rw-r--r-- | drivers/edac/edac_mc.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/drivers/edac/edac_mc.c b/drivers/edac/edac_mc.c index 1d805604907..d69144a0904 100644 --- a/drivers/edac/edac_mc.c +++ b/drivers/edac/edac_mc.c | |||
@@ -447,20 +447,16 @@ fail1: | |||
447 | return 1; | 447 | return 1; |
448 | } | 448 | } |
449 | 449 | ||
450 | static void complete_mc_list_del(struct rcu_head *head) | ||
451 | { | ||
452 | struct mem_ctl_info *mci; | ||
453 | |||
454 | mci = container_of(head, struct mem_ctl_info, rcu); | ||
455 | INIT_LIST_HEAD(&mci->link); | ||
456 | } | ||
457 | |||
458 | static void del_mc_from_global_list(struct mem_ctl_info *mci) | 450 | static void del_mc_from_global_list(struct mem_ctl_info *mci) |
459 | { | 451 | { |
460 | atomic_dec(&edac_handlers); | 452 | atomic_dec(&edac_handlers); |
461 | list_del_rcu(&mci->link); | 453 | list_del_rcu(&mci->link); |
462 | call_rcu(&mci->rcu, complete_mc_list_del); | 454 | |
463 | rcu_barrier(); | 455 | /* these are for safe removal of devices from global list while |
456 | * NMI handlers may be traversing list | ||
457 | */ | ||
458 | synchronize_rcu(); | ||
459 | INIT_LIST_HEAD(&mci->link); | ||
464 | } | 460 | } |
465 | 461 | ||
466 | /** | 462 | /** |