From: Tianyu Lan <ltykernel@gmail•com>
To: kys@microsoft•com, haiyangz@microsoft•com,
sthemmin@microsoft•com, wei.liu@kernel•org, decui@microsoft•com,
catalin.marinas@arm•com, will@kernel•org, tglx@linutronix•de,
mingo@redhat•com, bp@alien8•de, x86@kernel•org, hpa@zytor•com,
dave.hansen@linux•intel.com, luto@kernel•org,
peterz@infradead•org, konrad.wilk@oracle•com,
boris.ostrovsky@oracle•com, jgross@suse•com,
sstabellini@kernel•org, joro@8bytes•org, davem@davemloft•net,
kuba@kernel•org, jejb@linux•ibm.com, martin.petersen@oracle•com,
gregkh@linuxfoundation•org, arnd@arndb•de, hch@lst•de,
m.szyprowski@samsung•com, robin.murphy@arm•com,
brijesh.singh@amd•com, thomas.lendacky@amd•com,
Tianyu.Lan@microsoft•com, pgonda@google•com,
martin.b.radev@gmail•com, akpm@linux-foundation•org,
kirill.shutemov@linux•intel.com, rppt@kernel•org,
hannes@cmpxchg•org, aneesh.kumar@linux•ibm.com,
krish.sadhukhan@oracle•com, saravanand@fb•com,
linux-arm-kernel@lists•infradead.org,
xen-devel@lists•xenproject.org, rientjes@google•com,
ardb@kernel•org, michael.h.kelley@microsoft•com
Cc: iommu@lists•linux-foundation.org, linux-arch@vger•kernel.org,
linux-hyperv@vger•kernel.org, linux-kernel@vger•kernel.org,
linux-scsi@vger•kernel.org, netdev@vger•kernel.org,
vkuznets@redhat•com, parri.andrea@gmail•com,
dave.hansen@intel•com
Subject: [PATCH V4 04/13] hyperv: Mark vmbus ring buffer visible to host in Isolation VM
Date: Fri, 27 Aug 2021 13:21:02 -0400 [thread overview]
Message-ID: <20210827172114.414281-5-ltykernel@gmail.com> (raw)
In-Reply-To: <20210827172114.414281-1-ltykernel@gmail.com>
From: Tianyu Lan <Tianyu.Lan@microsoft•com>
Mark vmbus ring buffer visible with set_memory_decrypted() when
establish gpadl handle.
Signed-off-by: Tianyu Lan <Tianyu.Lan@microsoft•com>
---
Change since v3:
* Change vmbus_teardown_gpadl() parameter and put gpadl handle,
buffer and buffer size in the struct vmbus_gpadl.
---
drivers/hv/channel.c | 36 ++++++++++++++++++++++++++++-----
drivers/net/hyperv/hyperv_net.h | 1 +
drivers/net/hyperv/netvsc.c | 16 +++++++++++----
drivers/uio/uio_hv_generic.c | 14 +++++++++++--
include/linux/hyperv.h | 8 +++++++-
5 files changed, 63 insertions(+), 12 deletions(-)
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c
index f3761c73b074..82650beb3af0 100644
--- a/drivers/hv/channel.c
+++ b/drivers/hv/channel.c
@@ -17,6 +17,7 @@
#include <linux/hyperv.h>
#include <linux/uio.h>
#include <linux/interrupt.h>
+#include <linux/set_memory.h>
#include <asm/page.h>
#include <asm/mshyperv.h>
@@ -474,6 +475,13 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
if (ret)
return ret;
+ ret = set_memory_decrypted((unsigned long)kbuffer,
+ HVPFN_UP(size));
+ if (ret) {
+ pr_warn("Failed to set host visibility for new GPADL %d.\n", ret);
+ return ret;
+ }
+
init_completion(&msginfo->waitevent);
msginfo->waiting_channel = channel;
@@ -549,6 +557,11 @@ static int __vmbus_establish_gpadl(struct vmbus_channel *channel,
}
kfree(msginfo);
+
+ if (ret)
+ set_memory_encrypted((unsigned long)kbuffer,
+ HVPFN_UP(size));
+
return ret;
}
@@ -639,6 +652,7 @@ static int __vmbus_open(struct vmbus_channel *newchannel,
struct vmbus_channel_open_channel *open_msg;
struct vmbus_channel_msginfo *open_info = NULL;
struct page *page = newchannel->ringbuffer_page;
+ struct vmbus_gpadl gpadl;
u32 send_pages, recv_pages;
unsigned long flags;
int err;
@@ -759,7 +773,10 @@ static int __vmbus_open(struct vmbus_channel *newchannel,
error_free_info:
kfree(open_info);
error_free_gpadl:
- vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle);
+ gpadl.gpadl_handle = newchannel->ringbuffer_gpadlhandle;
+ gpadl.buffer = page_address(newchannel->ringbuffer_page);
+ gpadl.size = (send_pages + recv_pages) << PAGE_SHIFT;
+ vmbus_teardown_gpadl(newchannel, &gpadl);
newchannel->ringbuffer_gpadlhandle = 0;
error_clean_ring:
hv_ringbuffer_cleanup(&newchannel->outbound);
@@ -806,7 +823,7 @@ EXPORT_SYMBOL_GPL(vmbus_open);
/*
* vmbus_teardown_gpadl -Teardown the specified GPADL handle
*/
-int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
+int vmbus_teardown_gpadl(struct vmbus_channel *channel, struct vmbus_gpadl *gpadl)
{
struct vmbus_channel_gpadl_teardown *msg;
struct vmbus_channel_msginfo *info;
@@ -825,7 +842,7 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
msg->header.msgtype = CHANNELMSG_GPADL_TEARDOWN;
msg->child_relid = channel->offermsg.child_relid;
- msg->gpadl = gpadl_handle;
+ msg->gpadl = gpadl->gpadl_handle;
spin_lock_irqsave(&vmbus_connection.channelmsg_lock, flags);
list_add_tail(&info->msglistentry,
@@ -859,6 +876,12 @@ int vmbus_teardown_gpadl(struct vmbus_channel *channel, u32 gpadl_handle)
spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags);
kfree(info);
+
+ ret = set_memory_encrypted((unsigned long)gpadl->buffer,
+ HVPFN_UP(gpadl->size));
+ if (ret)
+ pr_warn("Fail to set mem host visibility in GPADL teardown %d.\n", ret);
+
return ret;
}
EXPORT_SYMBOL_GPL(vmbus_teardown_gpadl);
@@ -896,6 +919,7 @@ void vmbus_reset_channel_cb(struct vmbus_channel *channel)
static int vmbus_close_internal(struct vmbus_channel *channel)
{
struct vmbus_channel_close_channel *msg;
+ struct vmbus_gpadl gpadl;
int ret;
vmbus_reset_channel_cb(channel);
@@ -934,8 +958,10 @@ static int vmbus_close_internal(struct vmbus_channel *channel)
/* Tear down the gpadl for the channel's ring buffer */
else if (channel->ringbuffer_gpadlhandle) {
- ret = vmbus_teardown_gpadl(channel,
- channel->ringbuffer_gpadlhandle);
+ gpadl.gpadl_handle = channel->ringbuffer_gpadlhandle;
+ gpadl.buffer = page_address(channel->ringbuffer_page);
+ gpadl.size = channel->ringbuffer_pagecount;
+ ret = vmbus_teardown_gpadl(channel, &gpadl);
if (ret) {
pr_err("Close failed: teardown gpadl return %d\n", ret);
/*
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h
index bc48855dff10..aa7c9962dbd8 100644
--- a/drivers/net/hyperv/hyperv_net.h
+++ b/drivers/net/hyperv/hyperv_net.h
@@ -1082,6 +1082,7 @@ struct netvsc_device {
/* Send buffer allocated by us */
void *send_buf;
+ u32 send_buf_size;
u32 send_buf_gpadl_handle;
u32 send_section_cnt;
u32 send_section_size;
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 7bd935412853..f19bffff6a63 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -276,11 +276,14 @@ static void netvsc_teardown_recv_gpadl(struct hv_device *device,
struct netvsc_device *net_device,
struct net_device *ndev)
{
+ struct vmbus_gpadl gpadl;
int ret;
if (net_device->recv_buf_gpadl_handle) {
- ret = vmbus_teardown_gpadl(device->channel,
- net_device->recv_buf_gpadl_handle);
+ gpadl.gpadl_handle = net_device->recv_buf_gpadl_handle;
+ gpadl.buffer = net_device->recv_buf;
+ gpadl.size = net_device->recv_buf_size;
+ ret = vmbus_teardown_gpadl(device->channel, &gpadl);
/* If we failed here, we might as well return and have a leak
* rather than continue and a bugchk
@@ -298,11 +301,15 @@ static void netvsc_teardown_send_gpadl(struct hv_device *device,
struct netvsc_device *net_device,
struct net_device *ndev)
{
+ struct vmbus_gpadl gpadl;
int ret;
if (net_device->send_buf_gpadl_handle) {
- ret = vmbus_teardown_gpadl(device->channel,
- net_device->send_buf_gpadl_handle);
+ gpadl.gpadl_handle = net_device->send_buf_gpadl_handle;
+ gpadl.buffer = net_device->send_buf;
+ gpadl.size = net_device->send_buf_size;
+
+ ret = vmbus_teardown_gpadl(device->channel, &gpadl);
/* If we failed here, we might as well return and have a leak
* rather than continue and a bugchk
@@ -463,6 +470,7 @@ static int netvsc_init_buf(struct hv_device *device,
ret = -ENOMEM;
goto cleanup;
}
+ net_device->send_buf_size = buf_size;
/* Establish the gpadl handle for this buffer on this
* channel. Note: This call uses the vmbus connection rather
diff --git a/drivers/uio/uio_hv_generic.c b/drivers/uio/uio_hv_generic.c
index 652fe2547587..13c5df8dd11d 100644
--- a/drivers/uio/uio_hv_generic.c
+++ b/drivers/uio/uio_hv_generic.c
@@ -179,14 +179,24 @@ hv_uio_new_channel(struct vmbus_channel *new_sc)
static void
hv_uio_cleanup(struct hv_device *dev, struct hv_uio_private_data *pdata)
{
+ struct vmbus_gpadl gpadl;
+
if (pdata->send_gpadl) {
- vmbus_teardown_gpadl(dev->channel, pdata->send_gpadl);
+ gpadl.gpadl_handle = pdata->send_gpadl;
+ gpadl.buffer = pdata->send_buf;
+ gpadl.size = SEND_BUFFER_SIZE;
+
+ vmbus_teardown_gpadl(dev->channel, &gpadl);
pdata->send_gpadl = 0;
vfree(pdata->send_buf);
}
if (pdata->recv_gpadl) {
- vmbus_teardown_gpadl(dev->channel, pdata->recv_gpadl);
+ gpadl.gpadl_handle = pdata->recv_gpadl;
+ gpadl.buffer = pdata->recv_buf;
+ gpadl.size = RECV_BUFFER_SIZE;
+
+ vmbus_teardown_gpadl(dev->channel, &gpadl);
pdata->recv_gpadl = 0;
vfree(pdata->recv_buf);
}
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h
index ddc8713ce57b..757e09606fd3 100644
--- a/include/linux/hyperv.h
+++ b/include/linux/hyperv.h
@@ -803,6 +803,12 @@ struct vmbus_device {
#define VMBUS_DEFAULT_MAX_PKT_SIZE 4096
+struct vmbus_gpadl {
+ u32 gpadl_handle;
+ u32 size;
+ void *buffer;
+};
+
struct vmbus_channel {
struct list_head listentry;
@@ -1195,7 +1201,7 @@ extern int vmbus_establish_gpadl(struct vmbus_channel *channel,
u32 *gpadl_handle);
extern int vmbus_teardown_gpadl(struct vmbus_channel *channel,
- u32 gpadl_handle);
+ struct vmbus_gpadl *gpadl);
void vmbus_reset_channel_cb(struct vmbus_channel *channel);
--
2.25.1
next prev parent reply other threads:[~2021-08-27 17:22 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-27 17:20 [PATCH V4 00/13] x86/Hyper-V: Add Hyper-V Isolation VM support Tianyu Lan
2021-08-27 17:20 ` [PATCH V4 01/13] x86/hyperv: Initialize GHCB page in Isolation VM Tianyu Lan
2021-09-02 0:15 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 02/13] x86/hyperv: Initialize shared memory boundary in the " Tianyu Lan
2021-09-02 0:15 ` Michael Kelley
2021-09-02 6:35 ` Tianyu Lan
2021-08-27 17:21 ` [PATCH V4 03/13] x86/hyperv: Add new hvcall guest address host visibility support Tianyu Lan
2021-09-02 0:16 ` Michael Kelley
2021-08-27 17:21 ` Tianyu Lan [this message]
2021-08-27 17:41 ` [PATCH V4 04/13] hyperv: Mark vmbus ring buffer visible to host in Isolation VM Greg KH
2021-08-27 17:44 ` Tianyu Lan
2021-09-02 0:17 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 05/13] hyperv: Add Write/Read MSR registers via ghcb page Tianyu Lan
2021-08-27 17:41 ` Greg KH
2021-08-27 17:46 ` Tianyu Lan
2021-09-02 3:32 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 06/13] hyperv: Add ghcb hvcall support for SNP VM Tianyu Lan
2021-09-02 0:20 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 07/13] hyperv/Vmbus: Add SNP support for VMbus channel initiate message Tianyu Lan
2021-09-02 0:21 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 08/13] hyperv/vmbus: Initialize VMbus ring buffer for Isolation VM Tianyu Lan
2021-09-02 0:23 ` Michael Kelley
2021-09-02 13:35 ` Tianyu Lan
2021-09-02 16:14 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 09/13] DMA: Add dma_map_decrypted/dma_unmap_encrypted() function Tianyu Lan
2021-08-27 17:21 ` [PATCH V4 10/13] x86/Swiotlb: Add Swiotlb bounce buffer remap function for HV IVM Tianyu Lan
2021-08-27 17:21 ` [PATCH V4 11/13] hyperv/IOMMU: Enable swiotlb bounce buffer for Isolation VM Tianyu Lan
2021-09-02 1:27 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 12/13] hv_netvsc: Add Isolation VM support for netvsc driver Tianyu Lan
2021-09-02 2:34 ` Michael Kelley
2021-09-02 4:56 ` Michael Kelley
2021-08-27 17:21 ` [PATCH V4 13/13] hv_storvsc: Add Isolation VM support for storvsc driver Tianyu Lan
2021-09-02 2:08 ` Michael Kelley
2021-08-30 12:00 ` [PATCH V4 00/13] x86/Hyper-V: Add Hyper-V Isolation VM support Christoph Hellwig
2021-08-31 15:20 ` Tianyu Lan
2021-09-02 7:51 ` Christoph Hellwig
2021-08-31 17:16 ` Michael Kelley
2021-09-02 7:59 ` Christoph Hellwig
2021-09-02 11:21 ` Tianyu Lan
2021-09-02 15:57 ` Michael Kelley
2021-09-14 14:41 ` Tianyu Lan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210827172114.414281-5-ltykernel@gmail.com \
--to=ltykernel@gmail$(echo .)com \
--cc=Tianyu.Lan@microsoft$(echo .)com \
--cc=akpm@linux-foundation$(echo .)org \
--cc=aneesh.kumar@linux$(echo .)ibm.com \
--cc=ardb@kernel$(echo .)org \
--cc=arnd@arndb$(echo .)de \
--cc=boris.ostrovsky@oracle$(echo .)com \
--cc=bp@alien8$(echo .)de \
--cc=brijesh.singh@amd$(echo .)com \
--cc=catalin.marinas@arm$(echo .)com \
--cc=dave.hansen@intel$(echo .)com \
--cc=dave.hansen@linux$(echo .)intel.com \
--cc=davem@davemloft$(echo .)net \
--cc=decui@microsoft$(echo .)com \
--cc=gregkh@linuxfoundation$(echo .)org \
--cc=haiyangz@microsoft$(echo .)com \
--cc=hannes@cmpxchg$(echo .)org \
--cc=hch@lst$(echo .)de \
--cc=hpa@zytor$(echo .)com \
--cc=iommu@lists$(echo .)linux-foundation.org \
--cc=jejb@linux$(echo .)ibm.com \
--cc=jgross@suse$(echo .)com \
--cc=joro@8bytes$(echo .)org \
--cc=kirill.shutemov@linux$(echo .)intel.com \
--cc=konrad.wilk@oracle$(echo .)com \
--cc=krish.sadhukhan@oracle$(echo .)com \
--cc=kuba@kernel$(echo .)org \
--cc=kys@microsoft$(echo .)com \
--cc=linux-arch@vger$(echo .)kernel.org \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-hyperv@vger$(echo .)kernel.org \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-scsi@vger$(echo .)kernel.org \
--cc=luto@kernel$(echo .)org \
--cc=m.szyprowski@samsung$(echo .)com \
--cc=martin.b.radev@gmail$(echo .)com \
--cc=martin.petersen@oracle$(echo .)com \
--cc=michael.h.kelley@microsoft$(echo .)com \
--cc=mingo@redhat$(echo .)com \
--cc=netdev@vger$(echo .)kernel.org \
--cc=parri.andrea@gmail$(echo .)com \
--cc=peterz@infradead$(echo .)org \
--cc=pgonda@google$(echo .)com \
--cc=rientjes@google$(echo .)com \
--cc=robin.murphy@arm$(echo .)com \
--cc=rppt@kernel$(echo .)org \
--cc=saravanand@fb$(echo .)com \
--cc=sstabellini@kernel$(echo .)org \
--cc=sthemmin@microsoft$(echo .)com \
--cc=tglx@linutronix$(echo .)de \
--cc=thomas.lendacky@amd$(echo .)com \
--cc=vkuznets@redhat$(echo .)com \
--cc=wei.liu@kernel$(echo .)org \
--cc=will@kernel$(echo .)org \
--cc=x86@kernel$(echo .)org \
--cc=xen-devel@lists$(echo .)xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox