From: Kameron Carr <[email protected]> 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 <[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(-)
> 
> 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
> 


Reply via email to