Commit 25727aae authored by Michael Kelley's avatar Michael Kelley Committed by Wei Liu
Browse files

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: default avatarMichael Kelley <mikelley@microsoft.com>
Reviewed-by: default avatarTianyu Lan <Tianyu.Lan@microsoft.com>
Link: https://lore.kernel.org/r/1679838727-87310-11-git-send-email-mikelley@microsoft.com


Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent bb862397
Loading
Loading
Loading
Loading
+0 −28
Original line number Diff line number Diff line
@@ -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))
+0 −1
Original line number Diff line number Diff line
@@ -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
+0 −11
Original line number Diff line number Diff line
@@ -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);
+0 −2
Original line number Diff line number Diff line
@@ -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;
+2 −46
Original line number Diff line number Diff line
@@ -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);

	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 @@ 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);
Loading