RE: [PATCH v2 1/2] Drivers: hv: vmbus: add vmbus_establish_gpadl_caller_decrypted()
Michael Kelley <[email protected]> Fri, 31 Jul 2026 15:46:19 +0000
| Newsgroups | org.kernel.vger.linux-hyperv,org.kernel.vger.linux-kernel,org.kernel.vger.netdev |
|---|---|
| Message-ID | <SN6PR02MB4157F701FD4592A34D893E96D4C82@SN6PR02MB4157.namprd02.prod.outlook.com> |
From: Kameron Carr <[email protected]> Sent: Thursday, July 3= 0, 2026 4:34 PM >=20 > Add a new vmbus_establish_gpadl_caller_decrypted() for callers that want = to > decrypt their own buffers. Add a new hv_gpadl_type, > HV_GPADL_BUFFER_DECRYPTED, to communicate the decryption status of the > buffer. >=20 > No functional change for existing callers. >=20 > Signed-off-by: Kameron Carr <[email protected]> Looks good to me. Reviewed-by: Michael Kelley <[email protected]> > --- > drivers/hv/channel.c | 27 +++++++++++++++++++++++++-- > include/linux/hyperv.h | 8 +++++++- > 2 files changed, 32 insertions(+), 3 deletions(-) >=20 > diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c > index 6821f225248b1..4782f5070bba9 100644 > --- a/drivers/hv/channel.c > +++ b/drivers/hv/channel.c > @@ -40,6 +40,7 @@ static inline u32 hv_gpadl_size(enum hv_gpadl_type type= , u32 size) > { > switch (type) { > case HV_GPADL_BUFFER: > + case HV_GPADL_BUFFER_DECRYPTED: > return size; > case HV_GPADL_RING: > /* The size of a ringbuffer must be page-aligned */ > @@ -100,6 +101,7 @@ static inline u64 hv_gpadl_hvpfn(enum hv_gpadl_type t= ype, void *kbuffer, >=20 > switch (type) { > case HV_GPADL_BUFFER: > + case HV_GPADL_BUFFER_DECRYPTED: > break; > case HV_GPADL_RING: > if (i =3D=3D 0) > @@ -460,7 +462,8 @@ static int __vmbus_establish_gpadl(struct vmbus_chann= el *channel, > } >=20 > gpadl->decrypted =3D !((channel->co_external_memory && type =3D=3D HV_G= PADL_BUFFER) || > - (channel->co_ring_buffer && type =3D=3D HV_GPADL_RING)); > + (channel->co_ring_buffer && type =3D=3D HV_GPADL_RING) || > + (type =3D=3D HV_GPADL_BUFFER_DECRYPTED)); > if (gpadl->decrypted) { > /* > * The "decrypted" flag being true assumes that set_memory_decrypted()= succeeds. > @@ -575,7 +578,7 @@ static int __vmbus_establish_gpadl(struct vmbus_chann= el *channel, > * @channel: a channel > * @kbuffer: from kmalloc or vmalloc > * @size: page-size multiple > - * @gpadl_handle: some funky thing > + * @gpadl: output gpadl > */ > int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer, > u32 size, struct vmbus_gpadl *gpadl) > @@ -585,6 +588,26 @@ int vmbus_establish_gpadl(struct vmbus_channel *chan= nel, void *kbuffer, > } > EXPORT_SYMBOL_GPL(vmbus_establish_gpadl); >=20 > +/* > + * vmbus_establish_gpadl_caller_decrypted - Establish a GPADL for a buff= er > + * that has already been decrypted by the caller. > + * > + * @channel: a channel > + * @kbuffer: from kmalloc or vmalloc; must already be decrypted by the c= aller > + * @size: page-size multiple > + * @gpadl: output gpadl > + * > + * The caller is responsible for re-encrypting the buffer before freeing= it. > + */ > +int vmbus_establish_gpadl_caller_decrypted(struct vmbus_channel *channel= , > + void *kbuffer, u32 size, > + struct vmbus_gpadl *gpadl) > +{ > + return __vmbus_establish_gpadl(channel, HV_GPADL_BUFFER_DECRYPTED, > + kbuffer, size, 0U, gpadl); > +} > +EXPORT_SYMBOL_GPL(vmbus_establish_gpadl_caller_decrypted); > + > /** > * request_arr_init - Allocates memory for the requestor array. Each slo= t > * keeps track of the next available slot in the array. Initially, each > diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h > index 964f1be8150c5..1146addbb42c4 100644 > --- a/include/linux/hyperv.h > +++ b/include/linux/hyperv.h > @@ -70,7 +70,8 @@ > */ > enum hv_gpadl_type { > HV_GPADL_BUFFER, > - HV_GPADL_RING > + HV_GPADL_RING, > + HV_GPADL_BUFFER_DECRYPTED > }; >=20 > /* Single-page buffer */ > @@ -1205,6 +1206,11 @@ extern int vmbus_establish_gpadl(struct vmbus_chan= nel *channel, > u32 size, > struct vmbus_gpadl *gpadl); >=20 > +extern int vmbus_establish_gpadl_caller_decrypted(struct vmbus_channel *= channel, > + void *kbuffer, > + u32 size, > + struct vmbus_gpadl *gpadl); > + > extern int vmbus_teardown_gpadl(struct vmbus_channel *channel, > struct vmbus_gpadl *gpadl); >=20 > -- > 2.45.4 >=20