qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Jagannathan Raman <jag.raman@oracle.com>
To: qemu-devel@nongnu.org
Cc: eduardo@habkost.net, elena.ufimtseva@oracle.com,
	john.g.johnson@oracle.com, berrange@redhat.com, bleal@redhat.com,
	john.levon@nutanix.com, mst@redhat.com, armbru@redhat.com,
	quintela@redhat.com, f4bug@amsat.org, alex.williamson@redhat.com,
	kanth.ghatraju@oracle.com, stefanha@redhat.com,
	thanos.makatos@nutanix.com, pbonzini@redhat.com,
	jag.raman@oracle.com, eblake@redhat.com, dgilbert@redhat.com
Subject: [PATCH v6 10/19] vfio-user: run vfio-user context
Date: Thu, 17 Feb 2022 02:48:57 -0500	[thread overview]
Message-ID: <1735f90d6a5784a93cad5e46ebc6bb1a40ba1f5f.1645079934.git.jag.raman@oracle.com> (raw)
In-Reply-To: <cover.1645079934.git.jag.raman@oracle.com>

Setup a handler to run vfio-user context. The context is driven by
messages to the file descriptor associated with it - get the fd for
the context and hook up the handler with it

Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
---
 qapi/misc.json            | 23 ++++++++++
 hw/remote/vfio-user-obj.c | 96 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 118 insertions(+), 1 deletion(-)

diff --git a/qapi/misc.json b/qapi/misc.json
index e8054f415b..9d7f12ab04 100644
--- a/qapi/misc.json
+++ b/qapi/misc.json
@@ -527,3 +527,26 @@
  'data': { '*option': 'str' },
  'returns': ['CommandLineOptionInfo'],
  'allow-preconfig': true }
+
+##
+# @VFU_CLIENT_HANGUP:
+#
+# Emitted when the client of a TYPE_VFIO_USER_SERVER closes the
+# communication channel
+#
+# @id: ID of the TYPE_VFIO_USER_SERVER object
+#
+# @device: ID of attached PCI device
+#
+# Since: 6.3
+#
+# Example:
+#
+# <- { "event": "VFU_CLIENT_HANGUP",
+#      "data": { "id": "vfu1",
+#                "device": "lsi1" },
+#      "timestamp": { "seconds": 1265044230, "microseconds": 450486 } }
+#
+##
+{ 'event': 'VFU_CLIENT_HANGUP',
+  'data': { 'id': 'str', 'device': 'str' } }
diff --git a/hw/remote/vfio-user-obj.c b/hw/remote/vfio-user-obj.c
index 9c76913545..384ec4612d 100644
--- a/hw/remote/vfio-user-obj.c
+++ b/hw/remote/vfio-user-obj.c
@@ -27,6 +27,9 @@
  *
  * device - id of a device on the server, a required option. PCI devices
  *          alone are supported presently.
+ *
+ * notes - x-vfio-user-server could block IO and monitor during the
+ *         initialization phase.
  */
 
 #include "qemu/osdep.h"
@@ -41,11 +44,14 @@
 #include "hw/remote/machine.h"
 #include "qapi/error.h"
 #include "qapi/qapi-visit-sockets.h"
+#include "qapi/qapi-events-misc.h"
 #include "qemu/notify.h"
+#include "qemu/thread.h"
 #include "sysemu/sysemu.h"
 #include "libvfio-user.h"
 #include "hw/qdev-core.h"
 #include "hw/pci/pci.h"
+#include "qemu/timer.h"
 
 #define TYPE_VFU_OBJECT "x-vfio-user-server"
 OBJECT_DECLARE_TYPE(VfuObject, VfuObjectClass, VFU_OBJECT)
@@ -95,6 +101,8 @@ struct VfuObject {
     PCIDevice *pci_dev;
 
     Error *unplug_blocker;
+
+    int vfu_poll_fd;
 };
 
 static void vfu_object_init_ctx(VfuObject *o, Error **errp);
@@ -146,6 +154,69 @@ static void vfu_object_set_device(Object *obj, const char *str, Error **errp)
     vfu_object_init_ctx(o, errp);
 }
 
+static void vfu_object_ctx_run(void *opaque)
+{
+    VfuObject *o = opaque;
+    const char *id = NULL;
+    int ret = -1;
+
+    while (ret != 0) {
+        ret = vfu_run_ctx(o->vfu_ctx);
+        if (ret < 0) {
+            if (errno == EINTR) {
+                continue;
+            } else if (errno == ENOTCONN) {
+                id = object_get_canonical_path_component(OBJECT(o));
+                qapi_event_send_vfu_client_hangup(id, o->device);
+                qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL);
+                o->vfu_poll_fd = -1;
+                object_unparent(OBJECT(o));
+                break;
+            } else {
+                VFU_OBJECT_ERROR(o, "vfu: Failed to run device %s - %s",
+                                 o->device, strerror(errno));
+                break;
+            }
+        }
+    }
+}
+
+static void vfu_object_attach_ctx(void *opaque)
+{
+    VfuObject *o = opaque;
+    GPollFD pfds[1];
+    int ret;
+
+    qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL);
+
+    pfds[0].fd = o->vfu_poll_fd;
+    pfds[0].events = G_IO_IN | G_IO_HUP | G_IO_ERR;
+
+retry_attach:
+    ret = vfu_attach_ctx(o->vfu_ctx);
+    if (ret < 0 && (errno == EAGAIN || errno == EWOULDBLOCK)) {
+        /**
+         * vfu_object_attach_ctx can block QEMU's main loop
+         * during attach - the monitor and other IO
+         * could be unresponsive during this time.
+         */
+        (void)qemu_poll_ns(pfds, 1, 500 * (int64_t)SCALE_MS);
+        goto retry_attach;
+    } else if (ret < 0) {
+        VFU_OBJECT_ERROR(o, "vfu: Failed to attach device %s to context - %s",
+                         o->device, strerror(errno));
+        return;
+    }
+
+    o->vfu_poll_fd = vfu_get_poll_fd(o->vfu_ctx);
+    if (o->vfu_poll_fd < 0) {
+        VFU_OBJECT_ERROR(o, "vfu: Failed to get poll fd %s", o->device);
+        return;
+    }
+
+    qemu_set_fd_handler(o->vfu_poll_fd, vfu_object_ctx_run, NULL, o);
+}
+
 /*
  * TYPE_VFU_OBJECT depends on the availability of the 'socket' and 'device'
  * properties. It also depends on devices instantiated in QEMU. These
@@ -184,7 +255,8 @@ static void vfu_object_init_ctx(VfuObject *o, Error **errp)
         return;
     }
 
-    o->vfu_ctx = vfu_create_ctx(VFU_TRANS_SOCK, o->socket->u.q_unix.path, 0,
+    o->vfu_ctx = vfu_create_ctx(VFU_TRANS_SOCK, o->socket->u.q_unix.path,
+                                LIBVFIO_USER_FLAG_ATTACH_NB,
                                 o, VFU_DEV_TYPE_PCI);
     if (o->vfu_ctx == NULL) {
         error_setg(errp, "vfu: Failed to create context - %s", strerror(errno));
@@ -221,6 +293,21 @@ static void vfu_object_init_ctx(VfuObject *o, Error **errp)
                TYPE_VFU_OBJECT, o->device);
     qdev_add_unplug_blocker(DEVICE(o->pci_dev), o->unplug_blocker);
 
+    ret = vfu_realize_ctx(o->vfu_ctx);
+    if (ret < 0) {
+        error_setg(errp, "vfu: Failed to realize device %s- %s",
+                   o->device, strerror(errno));
+        goto fail;
+    }
+
+    o->vfu_poll_fd = vfu_get_poll_fd(o->vfu_ctx);
+    if (o->vfu_poll_fd < 0) {
+        error_setg(errp, "vfu: Failed to get poll fd %s", o->device);
+        goto fail;
+    }
+
+    qemu_set_fd_handler(o->vfu_poll_fd, vfu_object_attach_ctx, NULL, o);
+
     return;
 
 fail:
@@ -251,6 +338,8 @@ static void vfu_object_init(Object *obj)
                    TYPE_VFU_OBJECT, TYPE_REMOTE_MACHINE);
         return;
     }
+
+    o->vfu_poll_fd = -1;
 }
 
 static void vfu_object_finalize(Object *obj)
@@ -264,6 +353,11 @@ static void vfu_object_finalize(Object *obj)
 
     o->socket = NULL;
 
+    if (o->vfu_poll_fd != -1) {
+        qemu_set_fd_handler(o->vfu_poll_fd, NULL, NULL, NULL);
+        o->vfu_poll_fd = -1;
+    }
+
     if (o->vfu_ctx) {
         vfu_destroy_ctx(o->vfu_ctx);
     }
-- 
2.20.1



  parent reply	other threads:[~2022-02-17  8:13 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-17  7:48 [PATCH v6 00/19] vfio-user server in QEMU Jagannathan Raman
2022-02-17  7:48 ` [PATCH v6 01/19] configure, meson: override C compiler for cmake Jagannathan Raman
2022-02-17 12:09   ` Peter Maydell
2022-02-17 15:49     ` Jag Raman
2022-02-18  3:40     ` Jag Raman
2022-02-18 12:13       ` Paolo Bonzini
2022-02-18 14:49         ` Jag Raman
2022-02-18 15:16           ` Jag Raman
2022-02-20  8:27           ` Paolo Bonzini
2022-02-20 13:27             ` Paolo Bonzini
2022-02-22 19:05             ` Jag Raman
2022-02-24 17:52               ` Paolo Bonzini
2022-02-25  4:03                 ` Jag Raman
2022-02-28 18:12                   ` Paolo Bonzini
2022-02-28 19:55                     ` Jag Raman
2022-02-17  7:48 ` [PATCH v6 02/19] tests/avocado: Specify target VM argument to helper routines Jagannathan Raman
2022-02-17  7:48 ` [PATCH v6 03/19] qdev: unplug blocker for devices Jagannathan Raman
2022-02-21 15:27   ` Stefan Hajnoczi
2022-02-28 16:23     ` Jag Raman
2022-02-21 15:30   ` Stefan Hajnoczi
2022-02-28 19:11     ` Jag Raman
2022-02-17  7:48 ` [PATCH v6 04/19] remote/machine: add HotplugHandler for remote machine Jagannathan Raman
2022-02-21 15:30   ` Stefan Hajnoczi
2022-02-17  7:48 ` [PATCH v6 05/19] remote/machine: add vfio-user property Jagannathan Raman
2022-02-21 15:32   ` Stefan Hajnoczi
2022-02-17  7:48 ` [PATCH v6 06/19] vfio-user: build library Jagannathan Raman
2022-02-17  7:48 ` [PATCH v6 07/19] vfio-user: define vfio-user-server object Jagannathan Raman
2022-02-21 15:37   ` Stefan Hajnoczi
2022-02-28 19:14     ` Jag Raman
2022-03-02 16:45       ` Stefan Hajnoczi
2022-02-25 15:42   ` Eric Blake
2022-02-17  7:48 ` [PATCH v6 08/19] vfio-user: instantiate vfio-user context Jagannathan Raman
2022-02-21 15:42   ` Stefan Hajnoczi
2022-02-28 19:16     ` Jag Raman
2022-02-17  7:48 ` [PATCH v6 09/19] vfio-user: find and init PCI device Jagannathan Raman
2022-02-21 15:57   ` Stefan Hajnoczi
2022-02-28 19:17     ` Jag Raman
2022-02-17  7:48 ` Jagannathan Raman [this message]
2022-02-22 10:13   ` [PATCH v6 10/19] vfio-user: run vfio-user context Stefan Hajnoczi
2022-02-25 16:06   ` Eric Blake
2022-02-28 19:22     ` Jag Raman
2022-02-17  7:48 ` [PATCH v6 11/19] vfio-user: handle PCI config space accesses Jagannathan Raman
2022-02-22 11:09   ` Stefan Hajnoczi
2022-02-28 19:23     ` Jag Raman
2022-02-17  7:48 ` [PATCH v6 12/19] vfio-user: IOMMU support for remote device Jagannathan Raman
2022-02-22 10:40   ` Stefan Hajnoczi
2022-02-28 19:54     ` Jag Raman
2022-03-02 16:49       ` Stefan Hajnoczi
2022-03-03 14:49         ` Jag Raman
2022-03-07  9:45           ` Stefan Hajnoczi
2022-03-07 14:42             ` Jag Raman
2022-03-08 10:04               ` Stefan Hajnoczi
2022-02-17  7:49 ` [PATCH v6 13/19] vfio-user: handle DMA mappings Jagannathan Raman
2022-02-17  7:49 ` [PATCH v6 14/19] vfio-user: handle PCI BAR accesses Jagannathan Raman
2022-02-22 11:04   ` Stefan Hajnoczi
2022-02-17  7:49 ` [PATCH v6 15/19] vfio-user: handle device interrupts Jagannathan Raman
2022-03-07 10:24   ` Stefan Hajnoczi
2022-03-07 15:10     ` Jag Raman
2022-03-08 10:15       ` Stefan Hajnoczi
2022-03-26 23:47     ` Jag Raman
2022-03-29 14:24       ` Stefan Hajnoczi
2022-03-29 19:06         ` Jag Raman
2022-03-30  9:40           ` Thanos Makatos
2022-04-04  9:44             ` Stefan Hajnoczi
2022-02-17  7:49 ` [PATCH v6 16/19] softmmu/vl: defer backend init Jagannathan Raman
2022-03-07 10:48   ` Stefan Hajnoczi
2022-03-07 15:31     ` Jag Raman
2022-02-17  7:49 ` [PATCH v6 17/19] vfio-user: register handlers to facilitate migration Jagannathan Raman
2022-02-18 12:20   ` Paolo Bonzini
2022-02-18 14:55     ` Jag Raman
2022-03-07 11:26   ` Stefan Hajnoczi
2022-02-17  7:49 ` [PATCH v6 18/19] vfio-user: handle reset of remote device Jagannathan Raman
2022-03-07 11:36   ` Stefan Hajnoczi
2022-03-07 15:37     ` Jag Raman
2022-03-08 10:21       ` Stefan Hajnoczi
2022-02-17  7:49 ` [PATCH v6 19/19] vfio-user: avocado tests for vfio-user Jagannathan Raman

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=1735f90d6a5784a93cad5e46ebc6bb1a40ba1f5f.1645079934.git.jag.raman@oracle.com \
    --to=jag.raman@oracle.com \
    --cc=alex.williamson@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=bleal@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=elena.ufimtseva@oracle.com \
    --cc=f4bug@amsat.org \
    --cc=john.g.johnson@oracle.com \
    --cc=john.levon@nutanix.com \
    --cc=kanth.ghatraju@oracle.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=thanos.makatos@nutanix.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).