Drivers: hv: Fix bad ref to hv_synic_eventring_tail when CPU goes offline
authorMichael Kelley <mhklinux@outlook.com>
Mon, 21 Apr 2025 16:31:34 +0000 (09:31 -0700)
committerWei Liu <wei.liu@kernel.org>
Fri, 25 Apr 2025 21:13:53 +0000 (21:13 +0000)
When a CPU goes offline, hv_common_cpu_die() frees the
hv_synic_eventring_tail memory for the CPU. But in a normal VM (i.e., not
running in the root partition) the per-CPU memory has not been allocated,
resulting in a bad memory reference and oops when computing the argument
to kfree().

Fix this by freeing the memory only when running in the root partition.

Fixes: 04df7ac39943 ("Drivers: hv: Introduce per-cpu event ring tail")
Signed-off-by: Michael Kelley <mhklinux@outlook.com>
Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
Link: https://lore.kernel.org/r/20250421163134.2024-1-mhklinux@outlook.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Message-ID: <20250421163134.2024-1-mhklinux@outlook.com>

drivers/hv/hv_common.c

index a7d7494feaca13aefab22910c83f2a683aad1880..59792e00cecf38d672629cb0492618961df89125 100644 (file)
@@ -566,9 +566,11 @@ int hv_common_cpu_die(unsigned int cpu)
         * originally allocated memory is reused in hv_common_cpu_init().
         */
 
-       synic_eventring_tail = this_cpu_ptr(hv_synic_eventring_tail);
-       kfree(*synic_eventring_tail);
-       *synic_eventring_tail = NULL;
+       if (hv_root_partition()) {
+               synic_eventring_tail = this_cpu_ptr(hv_synic_eventring_tail);
+               kfree(*synic_eventring_tail);
+               *synic_eventring_tail = NULL;
+       }
 
        return 0;
 }