From: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> Sent: Monday, July 14, 2025 3:16 PM > > To make use of Confidential VMBus channels, initialize the > co_ring_buffers and co_external_memory fields of the channel > structure. > > Advertise support upon negotiating the version and compute > values for those fields and initialize them. > > Signed-off-by: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> Reviewed-by: Michael Kelley <mhklinux@xxxxxxxxxxx> > --- > 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..6ae44eab1626 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); > + co_external_memory = is_co_external_memory(offer); > + if (!co_ring_buffer && co_external_memory) { > + pr_err("Invalid offer relid=%d: the ring buffer isn't encrypted\n", > + offer->child_relid); > + return; > + } > + if (co_ring_buffer || co_external_memory) { > + if (vmbus_proto_version < VERSION_WIN10_V6_0 || !vmbus_is_confidential()) { > + pr_err("Invalid offer relid=%d: no support for confidential VMBus\n", > + offer->child_relid); > + 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 > -- > 2.43.0