Re: [PATCH hyperv-next v3 13/15] Drivers: hv: Support confidential VMBus channels

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 04-06-2025 06:13, Roman Kisel wrote:
To run a confidential VMBus channels, one has to initialize the
co_ring_buffers and co_external_memory fields of the channel
structure.

Advertise support upon negoatiating the version and compute
values for those fields and initialize them.

Signed-off-by: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx>
---
  drivers/hv/channel_mgmt.c | 19 +++++++++++++++++++
  drivers/hv/connection.c   |  3 +++
  2 files changed, 22 insertions(+)

diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index ca2fe10c110a..33bc29e826bd 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -1021,6 +1021,7 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
  	struct vmbus_channel_offer_channel *offer;
  	struct vmbus_channel *oldchannel, *newchannel;
  	size_t offer_sz;
+	bool co_ring_buffer, co_external_memory;
offer = (struct vmbus_channel_offer_channel *)hdr; @@ -1033,6 +1034,22 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
  		return;
  	}
+ co_ring_buffer = is_co_ring_buffer(offer);
+	if (co_ring_buffer) {
+		if (vmbus_proto_version < VERSION_WIN10_V6_0 || !vmbus_is_confidential()) {
+			atomic_dec(&vmbus_connection.offer_in_progress);
+			return;
+		}
+	}
+
+	co_external_memory = is_co_external_memory(offer);
+	if (is_co_external_memory(offer)) {

 Redundant call for is_co_external_memory()
 if(co_external_memory)

+		if (vmbus_proto_version < VERSION_WIN10_V6_0 || !vmbus_is_confidential()) {
+			atomic_dec(&vmbus_connection.offer_in_progress);
+			return;
+		}
+	}
+
  	oldchannel = find_primary_channel_by_offer(offer);
if (oldchannel != NULL) {
@@ -1111,6 +1128,8 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)
  		pr_err("Unable to allocate channel object\n");
  		return;
  	}
+	newchannel->co_ring_buffer = co_ring_buffer;
+	newchannel->co_external_memory = co_external_memory;
vmbus_setup_channel_state(newchannel, offer); diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c
index be490c598785..eeb472019d69 100644
--- a/drivers/hv/connection.c
+++ b/drivers/hv/connection.c
@@ -105,6 +105,9 @@ int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, u32 version)
  		vmbus_connection.msg_conn_id = VMBUS_MESSAGE_CONNECTION_ID;
  	}
+ if (vmbus_is_confidential() && version >= VERSION_WIN10_V6_0)
+		msg->feature_flags = VMBUS_FEATURE_FLAG_CONFIDENTIAL_CHANNELS;
+
  	/*
  	 * shared_gpa_boundary is zero in non-SNP VMs, so it's safe to always
  	 * bitwise OR it


Thanks,
Alok




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux