Re: [PATCH v2 1/1] Drivers: hv: vmbus: Skip VMBus module cleanup for non-nested root partition

[email protected] Wed, 05 Aug 2026 15:12:39 +0000
Newsgroups org.kernel.vger.linux-hyperv
Message-ID <[email protected]>
Thank you for your contribution! Sashiko AI review found 1 potential issue(=
s) to consider:

Pre-existing issues:
- [High] Backwards teardown in `vmbus_exit()` causes failure to free IRQ ac=
tion, leading to reload failure and potential Use-After-Free of unmapped IR=
Q handler.
--

--- Patch [1]: [PATCH v2 1/1] Drivers: hv: vmbus: Skip VMBus module cleanup=
 for non-nested root partition ---
commit d186708fbf26f95dce2f00a8fed8b7ac79496439
Author: Michael Kelley <[email protected]>

Drivers: hv: vmbus: Skip VMBus module cleanup for non-nested root partition

This commit updates the VMBus module exit function to skip cleanup when
running in a non-nested root partition, matching the behavior of the
initialization function. This prevents memory faults and kernel panics
caused by attempting to clean up uninitialized resources during module
unload.

Closes: https://lore.kernel.org/linux-hyperv/20260721154943.A09BD1F00A3D@sm=
tp.kernel.org/

> diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
> index 6824bd7cb3c4f..88fc6add26860 100644
> --- a/drivers/hv/vmbus_drv.c
> +++ b/drivers/hv/vmbus_drv.c
> @@ -3030,6 +3030,9 @@ static void __exit vmbus_exit(void)
>  {
>  	int cpu;
> =20
> +	if (hv_root_partition() && !hv_nested)
> +		return;
> +
>  	unregister_syscore(&hv_synic_syscore);
> =20
>  	hv_remove_kexec_handler();

[ ... ]

>  	vmbus_disconnect();
>  	if (vmbus_irq =3D=3D -1)
>  		hv_remove_vmbus_handler();
>  	else
>  		free_percpu_irq(vmbus_irq, &vmbus_evt);

[Severity: High]
This is a pre-existing issue, but does calling free_percpu_irq() here abort=
=20
and leak the irqaction?

It appears the CPUs have not yet disabled the interrupt, as=20
cpuhp_remove_state() is called much later in this function. Because=20
cpuhp_remove_state() is what triggers hv_synic_cleanup() to disable the=20
percpu IRQ on each CPU, the IRQ is still locally enabled here.

This sequence typically trips the structural safety check in=20
__free_percpu_irq() causing the free operation to abort and return NULL.=20
If the IRQ line fires after the module is unloaded, could the kernel execut=
e=20
an unmapped function pointer?

[ ... ]

>  	bus_unregister(&hv_bus);
> =20
>  	cpuhp_remove_state(hyperv_cpuhp_online);

[Severity: High]
This is related to the pre-existing issue above. Is this execution of=20
cpuhp_remove_state() too late in the teardown sequence?

This step triggers the offline callback hv_synic_cleanup() which calls=20
disable_percpu_irq(vmbus_irq). Because it runs after free_percpu_irq(),=20
the IRQ action is permanently leaked and subsequent attempts to reload the=
=20
module might fail.

--=20
Sashiko AI review =C2=B7 https://sashiko.dev/#/patchset/20260805142421.1047=
[email protected]?part=3D1