hv_netvsc: Remove second mapping of send and recv buffers
authorMichael Kelley <mikelley@microsoft.com>
Sun, 26 Mar 2023 13:52:05 +0000 (06:52 -0700)
committerWei Liu <wei.liu@kernel.org>
Mon, 17 Apr 2023 19:19:04 +0000 (19:19 +0000)
With changes to how Hyper-V guest VMs flip memory between private
(encrypted) and shared (decrypted), creating a second kernel virtual
mapping for shared memory is no longer necessary.  Everything needed
for the transition to shared is handled by set_memory_decrypted().

As such, remove the code to create and manage the second
mapping for the pre-allocated send and recv buffers.  This mapping
is the last user of hv_map_memory()/hv_unmap_memory(), so delete
these functions as well.  Finally, hv_map_memory() is the last
user of vmap_pfn() in Hyper-V guest code, so remove the Kconfig
selection of VMAP_PFN.

Signed-off-by: Michael Kelley <mikelley@microsoft.com>
Reviewed-by: Tianyu Lan <Tianyu.Lan@microsoft.com>
Link: https://lore.kernel.org/r/1679838727-87310-11-git-send-email-mikelley@microsoft.com
Signed-off-by: Wei Liu <wei.liu@kernel.org>
arch/x86/hyperv/ivm.c
drivers/hv/Kconfig
drivers/hv/hv_common.c
drivers/net/hyperv/hyperv_net.h
drivers/net/hyperv/netvsc.c
include/asm-generic/mshyperv.h

index f6a020cb1a249b2c3ef9241b14ba8d348baf07bf..127d5b7b63de18aba892964240376fd3f1b9082a 100644 (file)
@@ -376,34 +376,6 @@ void __init hv_vtom_init(void)
 
 #endif /* CONFIG_AMD_MEM_ENCRYPT */
 
-/*
- * hv_map_memory - map memory to extra space in the AMD SEV-SNP Isolation VM.
- */
-void *hv_map_memory(void *addr, unsigned long size)
-{
-       unsigned long *pfns = kcalloc(size / PAGE_SIZE,
-                                     sizeof(unsigned long), GFP_KERNEL);
-       void *vaddr;
-       int i;
-
-       if (!pfns)
-               return NULL;
-
-       for (i = 0; i < size / PAGE_SIZE; i++)
-               pfns[i] = vmalloc_to_pfn(addr + i * PAGE_SIZE) +
-                       (ms_hyperv.shared_gpa_boundary >> PAGE_SHIFT);
-
-       vaddr = vmap_pfn(pfns, size / PAGE_SIZE, pgprot_decrypted(PAGE_KERNEL));
-       kfree(pfns);
-
-       return vaddr;
-}
-
-void hv_unmap_memory(void *addr)
-{
-       vunmap(addr);
-}
-
 enum hv_isolation_type hv_get_isolation_type(void)
 {
        if (!(ms_hyperv.priv_high & HV_ISOLATION))
index 47132b30b7ee6fcc6a9e5cf56f1c96b11181a39e..94982f08b661047fb712927cbde09eb15ec22216 100644 (file)
@@ -8,7 +8,6 @@ config HYPERV
                || (ACPI && ARM64 && !CPU_BIG_ENDIAN)
        select PARAVIRT
        select X86_HV_CALLBACK_VECTOR if X86
-       select VMAP_PFN
        select OF_EARLY_FLATTREE if OF
        help
          Select this option to run Linux as a Hyper-V client operating
index 52a6f89ccdbd48dd85e981c3bc74e9f9cdffd47d..6d40b6c7b23b9048a44d3f72d82138f642986a66 100644 (file)
@@ -311,14 +311,3 @@ u64 __weak hv_ghcb_hypercall(u64 control, void *input, void *output, u32 input_s
        return HV_STATUS_INVALID_PARAMETER;
 }
 EXPORT_SYMBOL_GPL(hv_ghcb_hypercall);
-
-void __weak *hv_map_memory(void *addr, unsigned long size)
-{
-       return NULL;
-}
-EXPORT_SYMBOL_GPL(hv_map_memory);
-
-void __weak hv_unmap_memory(void *addr)
-{
-}
-EXPORT_SYMBOL_GPL(hv_unmap_memory);
index dd5919ec408bf6ec9f37d44727c9e4d19416f5d0..33d51e363913961eeb377a5cb65bbd339966da77 100644 (file)
@@ -1139,7 +1139,6 @@ struct netvsc_device {
 
        /* Receive buffer allocated by us but manages by NetVSP */
        void *recv_buf;
-       void *recv_original_buf;
        u32 recv_buf_size; /* allocated bytes */
        struct vmbus_gpadl recv_buf_gpadl_handle;
        u32 recv_section_cnt;
@@ -1148,7 +1147,6 @@ struct netvsc_device {
 
        /* Send buffer allocated by us */
        void *send_buf;
-       void *send_original_buf;
        u32 send_buf_size;
        struct vmbus_gpadl send_buf_gpadl_handle;
        u32 send_section_cnt;
index da737d959e81c034a97c6fa99ffcb565d6aeb67e..82e9796c8f5e5f9f8574cfed7bfbcefb35828172 100644 (file)
@@ -154,17 +154,8 @@ static void free_netvsc_device(struct rcu_head *head)
        int i;
 
        kfree(nvdev->extension);
-
-       if (nvdev->recv_original_buf)
-               vfree(nvdev->recv_original_buf);
-       else
-               vfree(nvdev->recv_buf);
-
-       if (nvdev->send_original_buf)
-               vfree(nvdev->send_original_buf);
-       else
-               vfree(nvdev->send_buf);
-
+       vfree(nvdev->recv_buf);
+       vfree(nvdev->send_buf);
        bitmap_free(nvdev->send_section_map);
 
        for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
@@ -347,7 +338,6 @@ static int netvsc_init_buf(struct hv_device *device,
        struct nvsp_message *init_packet;
        unsigned int buf_size;
        int i, ret = 0;
-       void *vaddr;
 
        /* Get receive buffer area. */
        buf_size = device_info->recv_sections * device_info->recv_section_size;
@@ -383,17 +373,6 @@ static int netvsc_init_buf(struct hv_device *device,
                goto cleanup;
        }
 
-       if (hv_isolation_type_snp()) {
-               vaddr = hv_map_memory(net_device->recv_buf, buf_size);
-               if (!vaddr) {
-                       ret = -ENOMEM;
-                       goto cleanup;
-               }
-
-               net_device->recv_original_buf = net_device->recv_buf;
-               net_device->recv_buf = vaddr;
-       }
-
        /* Notify the NetVsp of the gpadl handle */
        init_packet = &net_device->channel_init_pkt;
        memset(init_packet, 0, sizeof(struct nvsp_message));
@@ -497,17 +476,6 @@ static int netvsc_init_buf(struct hv_device *device,
                goto cleanup;
        }
 
-       if (hv_isolation_type_snp()) {
-               vaddr = hv_map_memory(net_device->send_buf, buf_size);
-               if (!vaddr) {
-                       ret = -ENOMEM;
-                       goto cleanup;
-               }
-
-               net_device->send_original_buf = net_device->send_buf;
-               net_device->send_buf = vaddr;
-       }
-
        /* Notify the NetVsp of the gpadl handle */
        init_packet = &net_device->channel_init_pkt;
        memset(init_packet, 0, sizeof(struct nvsp_message));
@@ -762,12 +730,6 @@ void netvsc_device_remove(struct hv_device *device)
                netvsc_teardown_send_gpadl(device, net_device, ndev);
        }
 
-       if (net_device->recv_original_buf)
-               hv_unmap_memory(net_device->recv_buf);
-
-       if (net_device->send_original_buf)
-               hv_unmap_memory(net_device->send_buf);
-
        /* Release all resources */
        free_netvsc_device_rcu(net_device);
 }
@@ -1844,12 +1806,6 @@ cleanup:
        netif_napi_del(&net_device->chan_table[0].napi);
 
 cleanup2:
-       if (net_device->recv_original_buf)
-               hv_unmap_memory(net_device->recv_buf);
-
-       if (net_device->send_original_buf)
-               hv_unmap_memory(net_device->send_buf);
-
        free_netvsc_device(&net_device->rcu);
 
        return ERR_PTR(ret);
index 90d7f68ed39d6ec11648d3169f3244c3999597f5..afcd9ae9588cbbf5039c80a81da293fb4c569b15 100644 (file)
@@ -271,8 +271,6 @@ u64 hv_ghcb_hypercall(u64 control, void *input, void *output, u32 input_size);
 void hyperv_cleanup(void);
 bool hv_query_ext_cap(u64 cap_query);
 void hv_setup_dma_ops(struct device *dev, bool coherent);
-void *hv_map_memory(void *addr, unsigned long size);
-void hv_unmap_memory(void *addr);
 #else /* CONFIG_HYPERV */
 static inline bool hv_is_hyperv_initialized(void) { return false; }
 static inline bool hv_is_hibernation_supported(void) { return false; }