[PATCH] Drivers: hv: vmbus: Fix potential crash on module unload

Michael Kelley (LINUX) mikelley at microsoft.com
Sat Mar 19 08:30:16 PDT 2022


From: Guilherme G. Piccoli <gpiccoli at igalia.com> Sent: Tuesday, March 15, 2022 1:36 PM
> 
> 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 at igalia.com>
> ---
> 
> 
> Hi folks, thanks in advance for any reviews! This was build-tested
> with Debian config, on 5.17-rc7.
> 
> This patch is a result of code analysis - I didn't experience this
> issue but seems a valid/feasible case.
> 
> Also, this is part of an ongoing effort of clearing/refactoring the panic
> notifiers, more will be done soon, but I prefer to send the simple bug
> fixes quickly, or else it might take a while since the next steps are more
> complex and subject to many iterations I expect.
> 
> Cheers,
> 
> Guilherme
> 
> 
>  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 12a2b37e87f3..12585324cc4a 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -2780,10 +2780,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

Reviewed-by: Michael Kelley <mikelley at microsoft.com>




More information about the kexec mailing list