| From ef9eda25498a34b16ea425d9991b0b7b7b1e3e19 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 15 Mar 2022 17:35:35 -0300 |
| Subject: Drivers: hv: vmbus: Fix potential crash on module unload |
| |
| From: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| |
| [ Upstream commit 792f232d57ff28bbd5f9c4abe0466b23d5879dc8 ] |
| |
| The vmbus driver relies on the panic notifier infrastructure to perform |
| some operations when a panic event is detected. Since vmbus can be built |
| as module, it is required that the driver handles both registering and |
| unregistering such panic notifier callback. |
| |
| After commit 74347a99e73a ("x86/Hyper-V: Unload vmbus channel in hv panic callback") |
| though, the panic notifier registration is done unconditionally in the module |
| initialization routine whereas the unregistering procedure is conditionally |
| guarded and executes only if HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE capability |
| is set. |
| |
| This patch fixes that by unconditionally unregistering the panic notifier |
| in the module's exit routine as well. |
| |
| Fixes: 74347a99e73a ("x86/Hyper-V: Unload vmbus channel in hv panic callback") |
| Signed-off-by: Guilherme G. Piccoli <gpiccoli@igalia.com> |
| Reviewed-by: Michael Kelley <mikelley@microsoft.com> |
| Link: https://lore.kernel.org/r/20220315203535.682306-1-gpiccoli@igalia.com |
| Signed-off-by: Wei Liu <wei.liu@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/hv/vmbus_drv.c | 9 +++++++-- |
| 1 file changed, 7 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c |
| index 44bd0b6ff505..a939ca1a8d54 100644 |
| --- a/drivers/hv/vmbus_drv.c |
| +++ b/drivers/hv/vmbus_drv.c |
| @@ -2776,10 +2776,15 @@ static void __exit vmbus_exit(void) |
| if (ms_hyperv.misc_features & HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE) { |
| kmsg_dump_unregister(&hv_kmsg_dumper); |
| unregister_die_notifier(&hyperv_die_block); |
| - atomic_notifier_chain_unregister(&panic_notifier_list, |
| - &hyperv_panic_block); |
| } |
| |
| + /* |
| + * The panic notifier is always registered, hence we should |
| + * also unconditionally unregister it here as well. |
| + */ |
| + atomic_notifier_chain_unregister(&panic_notifier_list, |
| + &hyperv_panic_block); |
| + |
| free_page((unsigned long)hv_panic_page); |
| unregister_sysctl_table(hv_ctl_table_hdr); |
| hv_ctl_table_hdr = NULL; |
| -- |
| 2.35.1 |
| |