]> xenbits.xensource.com Git - xen.git/commitdiff
x86: clear per cpu stub page information in cpu_smpboot_free()
authorJuergen Gross <jgross@suse.com>
Thu, 5 Mar 2020 10:13:21 +0000 (11:13 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 5 Mar 2020 10:13:21 +0000 (11:13 +0100)
cpu_smpboot_free() removes the stubs for the cpu going offline, but it
isn't clearing the related percpu variables. This will result in
crashes when a stub page is released due to all related cpus gone
offline and one of those cpus going online later.

Fix that by clearing stubs.addr and stubs.mfn in order to allocate a
new stub page when needed, irrespective of whether the CPU gets parked
or removed.

Fixes: 2e6c8f182c9c50 ("x86: distinguish CPU offlining from CPU removal")
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Wei Liu <wl@xen.org>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Tao Xu <tao3.xu@intel.com>
master commit: 774901788c5614798931a1cb2e20dd8b885f97ab
master date: 2020-01-09 11:07:38 +0100

xen/arch/x86/smpboot.c

index 0f5c549898e16e3f2b0ddc9f3a67530ba2f57ee1..699e21bfb7a395175b57f4133c793db48b2be5ef 100644 (file)
@@ -953,6 +953,8 @@ static void cpu_smpboot_free(unsigned int cpu, bool remove)
         unmap_domain_page(stub_page);
         destroy_xen_mappings(per_cpu(stubs.addr, cpu) & PAGE_MASK,
                              (per_cpu(stubs.addr, cpu) | ~PAGE_MASK) + 1);
+        per_cpu(stubs.addr, cpu) = 0;
+        per_cpu(stubs.mfn, cpu) = 0;
         if ( i == STUBS_PER_PAGE )
             free_domheap_page(mfn_to_page(mfn));
     }