lkml.org 
[lkml]   [2022]   [Dec]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[Patch v4 10/13] hv_netvsc: Remove second mapping of send and recv buffers
    Date
    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>
    ---
    arch/x86/hyperv/ivm.c | 28 ------------------------
    drivers/hv/Kconfig | 1 -
    drivers/hv/hv_common.c | 11 ----------
    drivers/net/hyperv/hyperv_net.h | 2 --
    drivers/net/hyperv/netvsc.c | 48 ++---------------------------------------
    include/asm-generic/mshyperv.h | 2 --
    6 files changed, 2 insertions(+), 90 deletions(-)

    diff --git a/arch/x86/hyperv/ivm.c b/arch/x86/hyperv/ivm.c
    index 8e2717d..83b71bd 100644
    --- a/arch/x86/hyperv/ivm.c
    +++ b/arch/x86/hyperv/ivm.c
    @@ -356,34 +356,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_NOENC));
    - 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))
    diff --git a/drivers/hv/Kconfig b/drivers/hv/Kconfig
    index 0747a8f..9a074cb 100644
    --- a/drivers/hv/Kconfig
    +++ b/drivers/hv/Kconfig
    @@ -8,7 +8,6 @@ config HYPERV
    || (ARM64 && !CPU_BIG_ENDIAN))
    select PARAVIRT
    select X86_HV_CALLBACK_VECTOR if X86
    - select VMAP_PFN
    help
    Select this option to run Linux as a Hyper-V client operating
    system.
    diff --git a/drivers/hv/hv_common.c b/drivers/hv/hv_common.c
    index ae68298..566735f 100644
    --- a/drivers/hv/hv_common.c
    +++ b/drivers/hv/hv_common.c
    @@ -308,14 +308,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);
    diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
    index dd5919e..33d51e3 100644
    --- a/drivers/net/hyperv/hyperv_net.h
    +++ b/drivers/net/hyperv/hyperv_net.h
    @@ -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;
    diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
    index 9352dad..661bbe6 100644
    --- a/drivers/net/hyperv/netvsc.c
    +++ b/drivers/net/hyperv/netvsc.c
    @@ -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);
    }
    @@ -1831,12 +1793,6 @@ struct netvsc_device *netvsc_device_add(struct hv_device *device,
    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);
    diff --git a/include/asm-generic/mshyperv.h b/include/asm-generic/mshyperv.h
    index bfb9eb9..6fabc4a 100644
    --- a/include/asm-generic/mshyperv.h
    +++ b/include/asm-generic/mshyperv.h
    @@ -267,8 +267,6 @@ static inline int cpumask_to_vpset_noself(struct hv_vpset *vpset,
    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; }
    --
    1.8.3.1
    \
     
     \ /
      Last update: 2022-12-02 04:35    [W:5.061 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site