x86/hyperv: Remove BUG_ON() for kmap_local_page()
authorZhao Liu <zhao1.liu@intel.com>
Thu, 20 Oct 2022 08:38:20 +0000 (16:38 +0800)
committerWei Liu <wei.liu@kernel.org>
Thu, 27 Oct 2022 10:58:04 +0000 (10:58 +0000)
The commit 154fb14df7a3c ("x86/hyperv: Replace kmap() with
kmap_local_page()") keeps the BUG_ON() to check if kmap_local_page()
fails.

But in fact, kmap_local_page() always returns a valid kernel address
and won't return NULL here. It will BUG on its own if it fails. [1]

So directly use memcpy_to_page() which creates local mapping to copy.

[1]: https://lore.kernel.org/lkml/YztFEyUA48et0yTt@iweiny-mobl/

Suggested-by: Fabio M. De Francesco <fmdefrancesco@gmail.com>
Suggested-by: Ira Weiny <ira.weiny@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Zhao Liu <zhao1.liu@intel.com>
Link: https://lore.kernel.org/r/20221020083820.2341088-1-zhao1.liu@linux.intel.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
arch/x86/hyperv/hv_init.c

index 2977412..d46f705 100644 (file)
@@ -444,7 +444,7 @@ void __init hyperv_init(void)
 
        if (hv_root_partition) {
                struct page *pg;
-               void *src, *dst;
+               void *src;
 
                /*
                 * For the root partition, the hypervisor will set up its
@@ -459,13 +459,11 @@ void __init hyperv_init(void)
                wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
 
                pg = vmalloc_to_page(hv_hypercall_pg);
-               dst = kmap_local_page(pg);
                src = memremap(hypercall_msr.guest_physical_address << PAGE_SHIFT, PAGE_SIZE,
                                MEMREMAP_WB);
-               BUG_ON(!(src && dst));
-               memcpy(dst, src, HV_HYP_PAGE_SIZE);
+               BUG_ON(!src);
+               memcpy_to_page(pg, 0, src, HV_HYP_PAGE_SIZE);
                memunmap(src);
-               kunmap_local(dst);
        } else {
                hypercall_msr.guest_physical_address = vmalloc_to_pfn(hv_hypercall_pg);
                wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);