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