mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 12:52:29 -04:00
Drivers: hv: vmbus: add vmbus_establish_gpadl_caller_decrypted()
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@linux.microsoft.com> Reviewed-by: Michael Kelley <mhklinux@outlook.com> Signed-off-by: Wei Liu <wei.liu@kernel.org>
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user