diff options
author | Vitaly Kuznetsov <vkuznets@redhat.com> | 2015-04-22 21:31:29 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-05-24 12:18:23 -0700 |
commit | 096c605feb3d85b309e95db2afc01584b967cc23 (patch) | |
tree | 629d155ca8d1d94daff6a26eddedd8ecbca1aee5 /drivers/hv | |
parent | e4ecb41cf96f4468202498593cc08e3e9dd3df58 (diff) | |
download | linux-096c605feb3d85b309e95db2afc01584b967cc23.tar.bz2 |
Drivers: hv: vmbus: unregister panic notifier on module unload
Commit 96c1d0581d00f7abe033350edb021a9d947d8d81 ("Drivers: hv: vmbus: Add
support for VMBus panic notifier handler") introduced
atomic_notifier_chain_register() call on module load. We also need to call
atomic_notifier_chain_unregister() on module unload as otherwise the following
crash is observed when we bring hv_vmbus back:
[ 39.788877] BUG: unable to handle kernel paging request at ffffffffa00078a8
[ 39.788877] IP: [<ffffffff8109d63f>] notifier_call_chain+0x3f/0x80
...
[ 39.788877] Call Trace:
[ 39.788877] [<ffffffff8109de7d>] __atomic_notifier_call_chain+0x5d/0x90
...
[ 39.788877] [<ffffffff8109d788>] ? atomic_notifier_chain_register+0x38/0x70
[ 39.788877] [<ffffffff8109d767>] ? atomic_notifier_chain_register+0x17/0x70
[ 39.788877] [<ffffffffa002814f>] hv_acpi_init+0x14f/0x1000 [hv_vmbus]
[ 39.788877] [<ffffffff81002144>] do_one_initcall+0xd4/0x210
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/hv')
-rw-r--r-- | drivers/hv/vmbus_drv.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index 0d8d1d79408c..7870a906365e 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1108,6 +1108,10 @@ static void __exit vmbus_exit(void) hv_synic_clockevents_cleanup(); hv_remove_vmbus_irq(); vmbus_free_channels(); + if (ms_hyperv.features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) { + atomic_notifier_chain_unregister(&panic_notifier_list, + &hyperv_panic_block); + } bus_unregister(&hv_bus); hv_cleanup(); for_each_online_cpu(cpu) |