qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Peter Maydell" <peter.maydell@linaro.org>,
	"Tiwei Bie" <tiwei.bie@intel.com>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
	"Maxime Coquelin" <maxime.coquelin@redhat.com>,
	"Yongji Xie" <xieyongji@baidu.com>,
	"Peter Xu" <peterx@redhat.com>
Subject: [Qemu-devel] [PULL 05/31] libvhost-user: support host notifier
Date: Fri, 1 Jun 2018 19:26:43 +0300	[thread overview]
Message-ID: <20180601162620.32362-6-mst@redhat.com> (raw)
In-Reply-To: <20180601162620.32362-1-mst@redhat.com>

From: Tiwei Bie <tiwei.bie@intel.com>

This patch introduces the host notifier support in
libvhost-user. A new API is added to support setting
host notifier for each queue.

Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 contrib/libvhost-user/libvhost-user.h | 32 +++++++++++
 contrib/libvhost-user/libvhost-user.c | 81 ++++++++++++++++++++++++---
 2 files changed, 105 insertions(+), 8 deletions(-)

diff --git a/contrib/libvhost-user/libvhost-user.h b/contrib/libvhost-user/libvhost-user.h
index b27075ea3b..4aa55b4d2d 100644
--- a/contrib/libvhost-user/libvhost-user.h
+++ b/contrib/libvhost-user/libvhost-user.h
@@ -51,6 +51,8 @@ enum VhostUserProtocolFeature {
     VHOST_USER_PROTOCOL_F_CRYPTO_SESSION = 7,
     VHOST_USER_PROTOCOL_F_PAGEFAULT = 8,
     VHOST_USER_PROTOCOL_F_CONFIG = 9,
+    VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD = 10,
+    VHOST_USER_PROTOCOL_F_HOST_NOTIFIER = 11,
 
     VHOST_USER_PROTOCOL_F_MAX
 };
@@ -92,6 +94,14 @@ typedef enum VhostUserRequest {
     VHOST_USER_MAX
 } VhostUserRequest;
 
+typedef enum VhostUserSlaveRequest {
+    VHOST_USER_SLAVE_NONE = 0,
+    VHOST_USER_SLAVE_IOTLB_MSG = 1,
+    VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2,
+    VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3,
+    VHOST_USER_SLAVE_MAX
+}  VhostUserSlaveRequest;
+
 typedef struct VhostUserMemoryRegion {
     uint64_t guest_phys_addr;
     uint64_t memory_size;
@@ -122,6 +132,12 @@ static VhostUserConfig c __attribute__ ((unused));
                                    + sizeof(c.size) \
                                    + sizeof(c.flags))
 
+typedef struct VhostUserVringArea {
+    uint64_t u64;
+    uint64_t size;
+    uint64_t offset;
+} VhostUserVringArea;
+
 #if defined(_WIN32)
 # define VU_PACKED __attribute__((gcc_struct, packed))
 #else
@@ -133,6 +149,7 @@ typedef struct VhostUserMsg {
 
 #define VHOST_USER_VERSION_MASK     (0x3)
 #define VHOST_USER_REPLY_MASK       (0x1 << 2)
+#define VHOST_USER_NEED_REPLY_MASK  (0x1 << 3)
     uint32_t flags;
     uint32_t size; /* the following payload size */
 
@@ -145,6 +162,7 @@ typedef struct VhostUserMsg {
         VhostUserMemory memory;
         VhostUserLog log;
         VhostUserConfig config;
+        VhostUserVringArea area;
     } payload;
 
     int fds[VHOST_MEMORY_MAX_NREGIONS];
@@ -368,6 +386,20 @@ VuVirtq *vu_get_queue(VuDev *dev, int qidx);
 void vu_set_queue_handler(VuDev *dev, VuVirtq *vq,
                           vu_queue_handler_cb handler);
 
+/**
+ * vu_set_queue_host_notifier:
+ * @dev: a VuDev context
+ * @vq: a VuVirtq queue
+ * @fd: a file descriptor
+ * @size: host page size
+ * @offset: notifier offset in @fd file
+ *
+ * Set queue's host notifier. This function may be called several
+ * times for the same queue. If called with -1 @fd, the notifier
+ * is removed.
+ */
+bool vu_set_queue_host_notifier(VuDev *dev, VuVirtq *vq, int fd,
+                                int size, int offset);
 
 /**
  * vu_queue_set_notification:
diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
index 54e643d871..a6b46cdc03 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -314,11 +314,6 @@ vu_message_write(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
         msg.msg_controllen = 0;
     }
 
-    /* Set the version in the flags when sending the reply */
-    vmsg->flags &= ~VHOST_USER_VERSION_MASK;
-    vmsg->flags |= VHOST_USER_VERSION;
-    vmsg->flags |= VHOST_USER_REPLY_MASK;
-
     do {
         rc = sendmsg(conn_fd, &msg, 0);
     } while (rc < 0 && (errno == EINTR || errno == EAGAIN));
@@ -341,6 +336,39 @@ vu_message_write(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
     return true;
 }
 
+static bool
+vu_send_reply(VuDev *dev, int conn_fd, VhostUserMsg *vmsg)
+{
+    /* Set the version in the flags when sending the reply */
+    vmsg->flags &= ~VHOST_USER_VERSION_MASK;
+    vmsg->flags |= VHOST_USER_VERSION;
+    vmsg->flags |= VHOST_USER_REPLY_MASK;
+
+    return vu_message_write(dev, conn_fd, vmsg);
+}
+
+static bool
+vu_process_message_reply(VuDev *dev, const VhostUserMsg *vmsg)
+{
+    VhostUserMsg msg_reply;
+
+    if ((vmsg->flags & VHOST_USER_NEED_REPLY_MASK) == 0) {
+        return true;
+    }
+
+    if (!vu_message_read(dev, dev->slave_fd, &msg_reply)) {
+        return false;
+    }
+
+    if (msg_reply.request != vmsg->request) {
+        DPRINT("Received unexpected msg type. Expected %d received %d",
+               vmsg->request, msg_reply.request);
+        return false;
+    }
+
+    return msg_reply.payload.u64 == 0;
+}
+
 /* Kick the log_call_fd if required. */
 static void
 vu_log_kick(VuDev *dev)
@@ -536,7 +564,7 @@ vu_set_mem_table_exec_postcopy(VuDev *dev, VhostUserMsg *vmsg)
 
     /* Send the message back to qemu with the addresses filled in */
     vmsg->fd_num = 0;
-    if (!vu_message_write(dev, dev->sock, vmsg)) {
+    if (!vu_send_reply(dev, dev->sock, vmsg)) {
         vu_panic(dev, "failed to respond to set-mem-table for postcopy");
         return false;
     }
@@ -916,6 +944,41 @@ void vu_set_queue_handler(VuDev *dev, VuVirtq *vq,
     }
 }
 
+bool vu_set_queue_host_notifier(VuDev *dev, VuVirtq *vq, int fd,
+                                int size, int offset)
+{
+    int qidx = vq - dev->vq;
+    int fd_num = 0;
+    VhostUserMsg vmsg = {
+        .request = VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG,
+        .flags = VHOST_USER_VERSION | VHOST_USER_NEED_REPLY_MASK,
+        .size = sizeof(vmsg.payload.area),
+        .payload.area = {
+            .u64 = qidx & VHOST_USER_VRING_IDX_MASK,
+            .size = size,
+            .offset = offset,
+        },
+    };
+
+    if (fd == -1) {
+        vmsg.payload.area.u64 |= VHOST_USER_VRING_NOFD_MASK;
+    } else {
+        vmsg.fds[fd_num++] = fd;
+    }
+
+    vmsg.fd_num = fd_num;
+
+    if ((dev->protocol_features & VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD) == 0) {
+        return false;
+    }
+
+    if (!vu_message_write(dev, dev->slave_fd, &vmsg)) {
+        return false;
+    }
+
+    return vu_process_message_reply(dev, &vmsg);
+}
+
 static bool
 vu_set_vring_call_exec(VuDev *dev, VhostUserMsg *vmsg)
 {
@@ -968,7 +1031,9 @@ static bool
 vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
 {
     uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD |
-                        1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ;
+                        1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ |
+                        1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER |
+                        1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD;
 
     if (have_userfault()) {
         features |= 1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT;
@@ -1252,7 +1317,7 @@ vu_dispatch(VuDev *dev)
         goto end;
     }
 
-    if (!vu_message_write(dev, dev->sock, &vmsg)) {
+    if (!vu_send_reply(dev, dev->sock, &vmsg)) {
         goto end;
     }
 
-- 
MST

  parent reply	other threads:[~2018-06-01 16:26 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-01 16:26 [Qemu-devel] [PULL 00/31] acpi, vhost, misc: fixes, features Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 01/31] vhost: allow backends to filter memory sections Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 03/31] vhost-user: introduce shared vhost-user state Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 02/31] vhost-user: allow slave to send fds via slave channel Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 04/31] vhost-user: support registering external host notifiers Michael S. Tsirkin
2018-06-01 16:26 ` Michael S. Tsirkin [this message]
2018-06-01 16:26 ` [Qemu-devel] [PULL 06/31] vhost-user-bridge: support host notifier Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 08/31] libqtest: fail if child coredumps Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 07/31] osdep: add wait.h compat macros Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 09/31] block: use local path for local headers Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 10/31] crypto: " Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 12/31] migration: drop an unused include Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 11/31] hppa: use local path for local headers Michael S. Tsirkin
2018-06-01 16:26 ` [Qemu-devel] [PULL 13/31] trace: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 14/31] display: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 15/31] ide: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 16/31] ioapic: fix up includes Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 18/31] rocker: drop an unused include Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 17/31] e1000e: use local path for local headers Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 19/31] ppc: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 20/31] vhost-scsi: drop an unused include Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 21/31] sd: fix up include Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 22/31] usb: use local path for local headers Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 23/31] migration: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 24/31] colo: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 25/31] qga: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 26/31] ui: " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 27/31] arch_init: sort architectures Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 28/31] tests/.gitignore: add entry for generated file Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 29/31] nvdimm, acpi: support NFIT platform capabilities Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 30/31] ACPI testing: test " Michael S. Tsirkin
2018-06-01 16:27 ` [Qemu-devel] [PULL 31/31] vhost-blk: turn on pre-defined RO feature bit Michael S. Tsirkin
2018-06-04 10:28 ` [Qemu-devel] [PULL 00/31] acpi, vhost, misc: fixes, features Peter Maydell
2018-06-08 17:52   ` Philippe Mathieu-Daudé
2018-06-08 18:47     ` Philippe Mathieu-Daudé
2018-06-09 11:38       ` Peter Maydell
2018-06-06 10:09 ` Thomas Huth

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=20180601162620.32362-6-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=maxime.coquelin@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=tiwei.bie@intel.com \
    --cc=xieyongji@baidu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
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;
as well as URLs for NNTP newsgroup(s).