RE: [PATCH v2 1/2] Drivers: hv: vmbus: add vmbus_establish_gpadl_caller_decrypted()

From: Michael Kelley

Date: Fri Jul 31 2026 - 11:48:14 EST


From: Kameron Carr <kameroncarr@xxxxxxxxxxxxxxxxxxx> Sent: Thursday, July 30, 2026 4:34 PM
>
> 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.
>
> No functional change for existing callers.
>
> Signed-off-by: Kameron Carr <kameroncarr@xxxxxxxxxxxxxxxxxxx>

Looks good to me.

Reviewed-by: Michael Kelley <mhklinux@xxxxxxxxxxx>

> ---
> drivers/hv/channel.c | 27 +++++++++++++++++++++++++--
> include/linux/hyperv.h | 8 +++++++-
> 2 files changed, 32 insertions(+), 3 deletions(-)
>
> 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 type, void *kbuffer,
>
> switch (type) {
> case HV_GPADL_BUFFER:
> + case HV_GPADL_BUFFER_DECRYPTED:
> break;
> case HV_GPADL_RING:
> if (i == 0)
> @@ -460,7 +462,8 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
> }
>
> gpadl->decrypted = !((channel->co_external_memory && type == HV_GPADL_BUFFER) ||
> - (channel->co_ring_buffer && type == HV_GPADL_RING));
> + (channel->co_ring_buffer && type == HV_GPADL_RING) ||
> + (type == 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_channel *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 *channel, void *kbuffer,
> }
> EXPORT_SYMBOL_GPL(vmbus_establish_gpadl);
>
> +/*
> + * vmbus_establish_gpadl_caller_decrypted - Establish a GPADL for a buffer
> + * that has already been decrypted by the caller.
> + *
> + * @channel: a channel
> + * @kbuffer: from kmalloc or vmalloc; must already be decrypted by the caller
> + * @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 slot
> * 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
> };
>
> /* Single-page buffer */
> @@ -1205,6 +1206,11 @@ extern int vmbus_establish_gpadl(struct vmbus_channel *channel,
> u32 size,
> struct vmbus_gpadl *gpadl);
>
> +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);
>
> --
> 2.45.4
>