hv_netvsc: Remove second mapping of send and recv buffers
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>
This commit is contained in:
parent
bb862397f4
commit
25727aaed6
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in New Issue