All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input
@ 2019-05-03 13:00 Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 1/6] libvhost-user: fix -Waddress-of-packed-member Marc-André Lureau
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

Hi,

This is the vhost-user-input part of "[PATCH v6 00/11] vhost-user for input & GPU".

v2:
- build fixes

v1: (changes since original v6 series)
- add "libvhost-user: fix -Waddress-of-packed-member" & "util: simplify unix_listen()"
- use unix_listen()
- build vhost-user-input by default (when applicable)

Marc-André Lureau (6):
  libvhost-user: fix -Waddress-of-packed-member
  libvhost-user: add PROTOCOL_F_CONFIG if {set,get}_config
  Add vhost-user-backend
  Add vhost-user-input-pci
  util: simplify unix_listen()
  contrib: add vhost-user-input

 include/hw/virtio/virtio-input.h       |  14 +
 include/sysemu/vhost-user-backend.h    |  57 ++++
 backends/vhost-user.c                  | 209 +++++++++++++
 contrib/libvhost-user/libvhost-user.c  |  10 +-
 contrib/vhost-user-input/main.c        | 393 +++++++++++++++++++++++++
 hw/input/vhost-user-input.c            | 129 ++++++++
 hw/virtio/vhost-user-input-pci.c       |  53 ++++
 util/qemu-sockets.c                    |  18 +-
 MAINTAINERS                            |   4 +
 Makefile                               |  11 +
 Makefile.objs                          |   1 +
 backends/Makefile.objs                 |   2 +
 contrib/vhost-user-input/Makefile.objs |   1 +
 hw/input/Kconfig                       |   5 +
 hw/input/Makefile.objs                 |   1 +
 hw/virtio/Makefile.objs                |   1 +
 16 files changed, 890 insertions(+), 19 deletions(-)
 create mode 100644 include/sysemu/vhost-user-backend.h
 create mode 100644 backends/vhost-user.c
 create mode 100644 contrib/vhost-user-input/main.c
 create mode 100644 hw/input/vhost-user-input.c
 create mode 100644 hw/virtio/vhost-user-input-pci.c
 create mode 100644 contrib/vhost-user-input/Makefile.objs

-- 
2.21.0.777.g83232e3864

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v2 1/6] libvhost-user: fix -Waddress-of-packed-member
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
@ 2019-05-03 13:00 ` Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 2/6] libvhost-user: add PROTOCOL_F_CONFIG if {set, get}_config Marc-André Lureau
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

/home/elmarco/src/qemu/contrib/libvhost-user/libvhost-user.c: In function ‘vu_set_mem_table_exec_postcopy’:
/home/elmarco/src/qemu/contrib/libvhost-user/libvhost-user.c:546:31: warning: taking address of packed member of ‘struct VhostUserMsg’ may result in an unaligned pointer value [-Waddress-of-packed-member]
  546 |     VhostUserMemory *memory = &vmsg->payload.memory;
      |                               ^~~~~~~~~~~~~~~~~~~~~
/home/elmarco/src/qemu/contrib/libvhost-user/libvhost-user.c: In function ‘vu_set_mem_table_exec’:
/home/elmarco/src/qemu/contrib/libvhost-user/libvhost-user.c:688:31: warning: taking address of packed member of ‘struct VhostUserMsg’ may result in an unaligned pointer value [-Waddress-of-packed-member]
  688 |     VhostUserMemory *memory = &vmsg->payload.memory;
      |                               ^~~~~~~~~~~~~~~~~~~~~
/home/elmarco/src/qemu/contrib/libvhost-user/libvhost-user.c: In function ‘vu_set_vring_addr_exec’:
/home/elmarco/src/qemu/contrib/libvhost-user/libvhost-user.c:817:36: warning: taking address of packed member of ‘struct VhostUserMsg’ may result in an unaligned pointer value [-Waddress-of-packed-member]
  817 |     struct vhost_vring_addr *vra = &vmsg->payload.addr;
      |                                    ^~~~~~~~~~~~~~~~~~~

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 contrib/libvhost-user/libvhost-user.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
index e08d6c7b97..dcf4a969f2 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -542,7 +542,7 @@ static bool
 vu_set_mem_table_exec_postcopy(VuDev *dev, VhostUserMsg *vmsg)
 {
     int i;
-    VhostUserMemory *memory = &vmsg->payload.memory;
+    VhostUserMemory m = vmsg->payload.memory, *memory = &m;
     dev->nregions = memory->nregions;
 
     DPRINT("Nregions: %d\n", memory->nregions);
@@ -684,7 +684,7 @@ static bool
 vu_set_mem_table_exec(VuDev *dev, VhostUserMsg *vmsg)
 {
     int i;
-    VhostUserMemory *memory = &vmsg->payload.memory;
+    VhostUserMemory m = vmsg->payload.memory, *memory = &m;
 
     for (i = 0; i < dev->nregions; i++) {
         VuDevRegion *r = &dev->regions[i];
@@ -813,7 +813,7 @@ vu_set_vring_num_exec(VuDev *dev, VhostUserMsg *vmsg)
 static bool
 vu_set_vring_addr_exec(VuDev *dev, VhostUserMsg *vmsg)
 {
-    struct vhost_vring_addr *vra = &vmsg->payload.addr;
+    struct vhost_vring_addr addr = vmsg->payload.addr, *vra = &addr;
     unsigned int index = vra->index;
     VuVirtq *vq = &dev->vq[index];
 
-- 
2.21.0.777.g83232e3864

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v2 2/6] libvhost-user: add PROTOCOL_F_CONFIG if {set, get}_config
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 1/6] libvhost-user: fix -Waddress-of-packed-member Marc-André Lureau
@ 2019-05-03 13:00 ` Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 3/6] Add vhost-user-backend Marc-André Lureau
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

Add the config protocol feature bit if the set_config & get_config
callbacks are implemented.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 contrib/libvhost-user/libvhost-user.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
index dcf4a969f2..74d42177c5 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -1157,6 +1157,10 @@ vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
         features |= 1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT;
     }
 
+    if (dev->iface->get_config && dev->iface->set_config) {
+        features |= 1ULL << VHOST_USER_PROTOCOL_F_CONFIG;
+    }
+
     if (dev->iface->get_protocol_features) {
         features |= dev->iface->get_protocol_features(dev);
     }
-- 
2.21.0.777.g83232e3864

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v2 3/6] Add vhost-user-backend
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 1/6] libvhost-user: fix -Waddress-of-packed-member Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 2/6] libvhost-user: add PROTOCOL_F_CONFIG if {set, get}_config Marc-André Lureau
@ 2019-05-03 13:00 ` Marc-André Lureau
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci Marc-André Lureau
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

Create a vhost-user-backend object that holds a connection to a
vhost-user backend (or "slave" process) and can be referenced from
virtio devices that support it. See later patches for input & gpu
usage.

Note: a previous iteration of this object made it user-creatable, and
allowed managed sub-process spawning, but that has been dropped for
now.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/sysemu/vhost-user-backend.h |  57 ++++++++
 backends/vhost-user.c               | 209 ++++++++++++++++++++++++++++
 MAINTAINERS                         |   2 +
 backends/Makefile.objs              |   2 +
 4 files changed, 270 insertions(+)
 create mode 100644 include/sysemu/vhost-user-backend.h
 create mode 100644 backends/vhost-user.c

diff --git a/include/sysemu/vhost-user-backend.h b/include/sysemu/vhost-user-backend.h
new file mode 100644
index 0000000000..9abf8f06a1
--- /dev/null
+++ b/include/sysemu/vhost-user-backend.h
@@ -0,0 +1,57 @@
+/*
+ * QEMU vhost-user backend
+ *
+ * Copyright (C) 2018 Red Hat Inc
+ *
+ * Authors:
+ *  Marc-André Lureau <marcandre.lureau@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+#ifndef QEMU_VHOST_USER_BACKEND_H
+#define QEMU_VHOST_USER_BACKEND_H
+
+#include "qom/object.h"
+#include "exec/memory.h"
+#include "qemu/option.h"
+#include "qemu/bitmap.h"
+#include "hw/virtio/vhost.h"
+#include "hw/virtio/vhost-user.h"
+#include "chardev/char-fe.h"
+#include "io/channel.h"
+
+#define TYPE_VHOST_USER_BACKEND "vhost-user-backend"
+#define VHOST_USER_BACKEND(obj) \
+    OBJECT_CHECK(VhostUserBackend, (obj), TYPE_VHOST_USER_BACKEND)
+#define VHOST_USER_BACKEND_GET_CLASS(obj) \
+    OBJECT_GET_CLASS(VhostUserBackendClass, (obj), TYPE_VHOST_USER_BACKEND)
+#define VHOST_USER_BACKEND_CLASS(klass) \
+    OBJECT_CLASS_CHECK(VhostUserBackendClass, (klass), TYPE_VHOST_USER_BACKEND)
+
+typedef struct VhostUserBackend VhostUserBackend;
+typedef struct VhostUserBackendClass VhostUserBackendClass;
+
+struct VhostUserBackendClass {
+    ObjectClass parent_class;
+};
+
+struct VhostUserBackend {
+    /* private */
+    Object parent;
+
+    char *chr_name;
+    CharBackend chr;
+    VhostUserState vhost_user;
+    struct vhost_dev dev;
+    VirtIODevice *vdev;
+    bool started;
+    bool completed;
+};
+
+int vhost_user_backend_dev_init(VhostUserBackend *b, VirtIODevice *vdev,
+                                unsigned nvqs, Error **errp);
+void vhost_user_backend_start(VhostUserBackend *b);
+void vhost_user_backend_stop(VhostUserBackend *b);
+
+#endif
diff --git a/backends/vhost-user.c b/backends/vhost-user.c
new file mode 100644
index 0000000000..2b055544a7
--- /dev/null
+++ b/backends/vhost-user.c
@@ -0,0 +1,209 @@
+/*
+ * QEMU vhost-user backend
+ *
+ * Copyright (C) 2018 Red Hat Inc
+ *
+ * Authors:
+ *  Marc-André Lureau <marcandre.lureau@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+
+#include "qemu/osdep.h"
+#include "hw/qdev.h"
+#include "qapi/error.h"
+#include "qapi/qmp/qerror.h"
+#include "qemu/error-report.h"
+#include "qom/object_interfaces.h"
+#include "sysemu/vhost-user-backend.h"
+#include "sysemu/kvm.h"
+#include "io/channel-command.h"
+#include "hw/virtio/virtio-bus.h"
+
+static bool
+ioeventfd_enabled(void)
+{
+    return kvm_enabled() && kvm_eventfds_enabled();
+}
+
+int
+vhost_user_backend_dev_init(VhostUserBackend *b, VirtIODevice *vdev,
+                            unsigned nvqs, Error **errp)
+{
+    int ret;
+
+    assert(!b->vdev && vdev);
+
+    if (!ioeventfd_enabled()) {
+        error_setg(errp, "vhost initialization failed: requires kvm");
+        return -1;
+    }
+
+    if (!vhost_user_init(&b->vhost_user, &b->chr, errp)) {
+        return -1;
+    }
+
+    b->vdev = vdev;
+    b->dev.nvqs = nvqs;
+    b->dev.vqs = g_new(struct vhost_virtqueue, nvqs);
+
+    ret = vhost_dev_init(&b->dev, &b->vhost_user, VHOST_BACKEND_TYPE_USER, 0);
+    if (ret < 0) {
+        error_setg_errno(errp, -ret, "vhost initialization failed");
+        return -1;
+    }
+
+    return 0;
+}
+
+void
+vhost_user_backend_start(VhostUserBackend *b)
+{
+    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(b->vdev)));
+    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    int ret, i ;
+
+    if (b->started) {
+        return;
+    }
+
+    if (!k->set_guest_notifiers) {
+        error_report("binding does not support guest notifiers");
+        return;
+    }
+
+    ret = vhost_dev_enable_notifiers(&b->dev, b->vdev);
+    if (ret < 0) {
+        return;
+    }
+
+    ret = k->set_guest_notifiers(qbus->parent, b->dev.nvqs, true);
+    if (ret < 0) {
+        error_report("Error binding guest notifier");
+        goto err_host_notifiers;
+    }
+
+    b->dev.acked_features = b->vdev->guest_features;
+    ret = vhost_dev_start(&b->dev, b->vdev);
+    if (ret < 0) {
+        error_report("Error start vhost dev");
+        goto err_guest_notifiers;
+    }
+
+    /* guest_notifier_mask/pending not used yet, so just unmask
+     * everything here.  virtio-pci will do the right thing by
+     * enabling/disabling irqfd.
+     */
+    for (i = 0; i < b->dev.nvqs; i++) {
+        vhost_virtqueue_mask(&b->dev, b->vdev,
+                             b->dev.vq_index + i, false);
+    }
+
+    b->started = true;
+    return;
+
+err_guest_notifiers:
+    k->set_guest_notifiers(qbus->parent, b->dev.nvqs, false);
+err_host_notifiers:
+    vhost_dev_disable_notifiers(&b->dev, b->vdev);
+}
+
+void
+vhost_user_backend_stop(VhostUserBackend *b)
+{
+    BusState *qbus = BUS(qdev_get_parent_bus(DEVICE(b->vdev)));
+    VirtioBusClass *k = VIRTIO_BUS_GET_CLASS(qbus);
+    int ret = 0;
+
+    if (!b->started) {
+        return;
+    }
+
+    vhost_dev_stop(&b->dev, b->vdev);
+
+    if (k->set_guest_notifiers) {
+        ret = k->set_guest_notifiers(qbus->parent,
+                                     b->dev.nvqs, false);
+        if (ret < 0) {
+            error_report("vhost guest notifier cleanup failed: %d", ret);
+        }
+    }
+    assert(ret >= 0);
+
+    vhost_dev_disable_notifiers(&b->dev, b->vdev);
+    b->started = false;
+}
+
+static void set_chardev(Object *obj, const char *value, Error **errp)
+{
+    VhostUserBackend *b = VHOST_USER_BACKEND(obj);
+    Chardev *chr;
+
+    if (b->completed) {
+        error_setg(errp, QERR_PERMISSION_DENIED);
+        return;
+    }
+
+    g_free(b->chr_name);
+    b->chr_name = g_strdup(value);
+
+    chr = qemu_chr_find(b->chr_name);
+    if (chr == NULL) {
+        error_set(errp, ERROR_CLASS_DEVICE_NOT_FOUND,
+                  "Chardev '%s' not found", b->chr_name);
+        return;
+    }
+
+    if (!qemu_chr_fe_init(&b->chr, chr, errp)) {
+        return;
+    }
+
+    b->completed = true;
+    /* could call vhost_dev_init() so early message can be exchanged */
+}
+
+static char *get_chardev(Object *obj, Error **errp)
+{
+    VhostUserBackend *b = VHOST_USER_BACKEND(obj);
+    Chardev *chr = qemu_chr_fe_get_driver(&b->chr);
+
+    if (chr && chr->label) {
+        return g_strdup(chr->label);
+    }
+
+    return NULL;
+}
+
+static void vhost_user_backend_init(Object *obj)
+{
+    object_property_add_str(obj, "chardev", get_chardev, set_chardev, NULL);
+}
+
+static void vhost_user_backend_finalize(Object *obj)
+{
+    VhostUserBackend *b = VHOST_USER_BACKEND(obj);
+
+    g_free(b->dev.vqs);
+    g_free(b->chr_name);
+
+    vhost_user_cleanup(&b->vhost_user);
+    qemu_chr_fe_deinit(&b->chr, true);
+}
+
+static const TypeInfo vhost_user_backend_info = {
+    .name = TYPE_VHOST_USER_BACKEND,
+    .parent = TYPE_OBJECT,
+    .instance_size = sizeof(VhostUserBackend),
+    .instance_init = vhost_user_backend_init,
+    .instance_finalize = vhost_user_backend_finalize,
+    .class_size = sizeof(VhostUserBackendClass),
+};
+
+static void register_types(void)
+{
+    type_register_static(&vhost_user_backend_info);
+}
+
+type_init(register_types);
diff --git a/MAINTAINERS b/MAINTAINERS
index 66ddbda9c9..2e40390ebc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1478,6 +1478,8 @@ F: hw/*/*vhost*
 F: docs/interop/vhost-user.json
 F: docs/interop/vhost-user.txt
 F: contrib/vhost-user-*/
+F: backends/vhost-user.c
+F: include/sysemu/vhost-user-backend.h
 
 virtio
 M: Michael S. Tsirkin <mst@redhat.com>
diff --git a/backends/Makefile.objs b/backends/Makefile.objs
index ff619d31b4..981e8e122f 100644
--- a/backends/Makefile.objs
+++ b/backends/Makefile.objs
@@ -14,4 +14,6 @@ common-obj-y += cryptodev-vhost.o
 common-obj-$(CONFIG_VHOST_CRYPTO) += cryptodev-vhost-user.o
 endif
 
+common-obj-$(call land,$(CONFIG_VHOST_USER),$(CONFIG_VIRTIO)) += vhost-user.o
+
 common-obj-$(CONFIG_LINUX) += hostmem-memfd.o
-- 
2.21.0.777.g83232e3864

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
                   ` (2 preceding siblings ...)
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 3/6] Add vhost-user-backend Marc-André Lureau
@ 2019-05-03 13:00 ` Marc-André Lureau
  2019-05-09  6:32   ` Gerd Hoffmann
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 5/6] util: simplify unix_listen() Marc-André Lureau
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

Add a new virtio-input device, which connects to a vhost-user
backend.

Instead of reading configuration directly from an input device /
evdev (like virtio-input-host), it reads it over vhost-user protocol
with {SET,GET}_CONFIG messages. The vhost-user-backend handles the
queues & events setup.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/hw/virtio/virtio-input.h |  14 ++++
 hw/input/vhost-user-input.c      | 129 +++++++++++++++++++++++++++++++
 hw/virtio/vhost-user-input-pci.c |  53 +++++++++++++
 MAINTAINERS                      |   1 +
 hw/input/Kconfig                 |   5 ++
 hw/input/Makefile.objs           |   1 +
 hw/virtio/Makefile.objs          |   1 +
 7 files changed, 204 insertions(+)
 create mode 100644 hw/input/vhost-user-input.c
 create mode 100644 hw/virtio/vhost-user-input-pci.c

diff --git a/include/hw/virtio/virtio-input.h b/include/hw/virtio/virtio-input.h
index 054c38836f..4fca03e796 100644
--- a/include/hw/virtio/virtio-input.h
+++ b/include/hw/virtio/virtio-input.h
@@ -2,6 +2,7 @@
 #define QEMU_VIRTIO_INPUT_H
 
 #include "ui/input.h"
+#include "sysemu/vhost-user-backend.h"
 
 /* ----------------------------------------------------------------- */
 /* virtio input protocol                                             */
@@ -42,11 +43,18 @@ typedef struct virtio_input_event virtio_input_event;
 #define VIRTIO_INPUT_HOST_GET_PARENT_CLASS(obj) \
         OBJECT_GET_PARENT_CLASS(obj, TYPE_VIRTIO_INPUT_HOST)
 
+#define TYPE_VHOST_USER_INPUT   "vhost-user-input"
+#define VHOST_USER_INPUT(obj)                              \
+    OBJECT_CHECK(VHostUserInput, (obj), TYPE_VHOST_USER_INPUT)
+#define VHOST_USER_INPUT_GET_PARENT_CLASS(obj)             \
+    OBJECT_GET_PARENT_CLASS(obj, TYPE_VHOST_USER_INPUT)
+
 typedef struct VirtIOInput VirtIOInput;
 typedef struct VirtIOInputClass VirtIOInputClass;
 typedef struct VirtIOInputConfig VirtIOInputConfig;
 typedef struct VirtIOInputHID VirtIOInputHID;
 typedef struct VirtIOInputHost VirtIOInputHost;
+typedef struct VHostUserInput VHostUserInput;
 
 struct VirtIOInputConfig {
     virtio_input_config               config;
@@ -98,6 +106,12 @@ struct VirtIOInputHost {
     int                               fd;
 };
 
+struct VHostUserInput {
+    VirtIOInput                       parent_obj;
+
+    VhostUserBackend                  *vhost;
+};
+
 void virtio_input_send(VirtIOInput *vinput, virtio_input_event *event);
 void virtio_input_init_config(VirtIOInput *vinput,
                               virtio_input_config *config);
diff --git a/hw/input/vhost-user-input.c b/hw/input/vhost-user-input.c
new file mode 100644
index 0000000000..6da497b1a8
--- /dev/null
+++ b/hw/input/vhost-user-input.c
@@ -0,0 +1,129 @@
+/*
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include "qemu/error-report.h"
+#include "qapi/error.h"
+#include "qemu-common.h"
+
+#include "hw/qdev.h"
+#include "hw/virtio/virtio-input.h"
+
+static int vhost_input_config_change(struct vhost_dev *dev)
+{
+    error_report("vhost-user-input: unhandled backend config change");
+    return -1;
+}
+
+static const VhostDevConfigOps config_ops = {
+    .vhost_dev_config_notifier = vhost_input_config_change,
+};
+
+static void vhost_input_realize(DeviceState *dev, Error **errp)
+{
+    VHostUserInput *vhi = VHOST_USER_INPUT(dev);
+    VirtIOInput *vinput = VIRTIO_INPUT(dev);
+    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+
+    vhost_dev_set_config_notifier(&vhi->vhost->dev, &config_ops);
+    vinput->cfg_size = sizeof_field(virtio_input_config, u);
+    if (vhost_user_backend_dev_init(vhi->vhost, vdev, 2, errp) == -1) {
+        return;
+    }
+}
+
+static void vhost_input_change_active(VirtIOInput *vinput)
+{
+    VHostUserInput *vhi = VHOST_USER_INPUT(vinput);
+
+    if (vinput->active) {
+        vhost_user_backend_start(vhi->vhost);
+    } else {
+        vhost_user_backend_stop(vhi->vhost);
+    }
+}
+
+static void vhost_input_get_config(VirtIODevice *vdev, uint8_t *config_data)
+{
+    VirtIOInput *vinput = VIRTIO_INPUT(vdev);
+    VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
+    int ret;
+
+    memset(config_data, 0, vinput->cfg_size);
+
+    ret = vhost_dev_get_config(&vhi->vhost->dev, config_data, vinput->cfg_size);
+    if (ret) {
+        error_report("vhost-user-input: get device config space failed");
+        return;
+    }
+}
+
+static void vhost_input_set_config(VirtIODevice *vdev,
+                                   const uint8_t *config_data)
+{
+    VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
+    int ret;
+
+    ret = vhost_dev_set_config(&vhi->vhost->dev, config_data,
+                               0, sizeof(virtio_input_config),
+                               VHOST_SET_CONFIG_TYPE_MASTER);
+    if (ret) {
+        error_report("vhost-user-input: set device config space failed");
+        return;
+    }
+
+    virtio_notify_config(vdev);
+}
+
+static const VMStateDescription vmstate_vhost_input = {
+    .name = "vhost-user-input",
+    .unmigratable = 1,
+};
+
+static void vhost_input_class_init(ObjectClass *klass, void *data)
+{
+    VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass);
+    VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    dc->vmsd = &vmstate_vhost_input;
+    vdc->get_config = vhost_input_get_config;
+    vdc->set_config = vhost_input_set_config;
+    vic->realize = vhost_input_realize;
+    vic->change_active = vhost_input_change_active;
+}
+
+static void vhost_input_init(Object *obj)
+{
+    VHostUserInput *vhi = VHOST_USER_INPUT(obj);
+
+    vhi->vhost = VHOST_USER_BACKEND(object_new(TYPE_VHOST_USER_BACKEND));
+    object_property_add_alias(obj, "chardev",
+                              OBJECT(vhi->vhost), "chardev", &error_abort);
+}
+
+static void vhost_input_finalize(Object *obj)
+{
+    VHostUserInput *vhi = VHOST_USER_INPUT(obj);
+
+    object_unref(OBJECT(vhi->vhost));
+}
+
+static const TypeInfo vhost_input_info = {
+    .name          = TYPE_VHOST_USER_INPUT,
+    .parent        = TYPE_VIRTIO_INPUT,
+    .instance_size = sizeof(VHostUserInput),
+    .instance_init = vhost_input_init,
+    .instance_finalize = vhost_input_finalize,
+    .class_init    = vhost_input_class_init,
+};
+
+static void vhost_input_register_types(void)
+{
+    type_register_static(&vhost_input_info);
+}
+
+type_init(vhost_input_register_types)
diff --git a/hw/virtio/vhost-user-input-pci.c b/hw/virtio/vhost-user-input-pci.c
new file mode 100644
index 0000000000..3d1b7a85fd
--- /dev/null
+++ b/hw/virtio/vhost-user-input-pci.c
@@ -0,0 +1,53 @@
+/*
+ * This work is licensed under the terms of the GNU LGPL, version 2 or
+ * later.  See the COPYING.LIB file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+
+#include "hw/virtio/virtio.h"
+#include "hw/virtio/virtio-input.h"
+#include "qapi/error.h"
+#include "qemu/error-report.h"
+#include "virtio-pci.h"
+
+typedef struct VHostUserInputPCI VHostUserInputPCI;
+
+#define TYPE_VHOST_USER_INPUT_PCI "vhost-user-input-pci-base"
+
+#define VHOST_USER_INPUT_PCI(obj) \
+    OBJECT_CHECK(VHostUserInputPCI, (obj), TYPE_VHOST_USER_INPUT_PCI)
+
+struct VHostUserInputPCI {
+    VirtIOPCIProxy parent_obj;
+    VHostUserInput vhi;
+};
+
+static void vhost_user_input_pci_instance_init(Object *obj)
+{
+    VHostUserInputPCI *dev = VHOST_USER_INPUT_PCI(obj);
+
+    virtio_instance_init_common(obj, &dev->vhi, sizeof(dev->vhi),
+                                TYPE_VHOST_USER_INPUT);
+
+    object_property_add_alias(obj, "chardev",
+                              OBJECT(&dev->vhi), "chardev",
+                              &error_abort);
+}
+
+static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
+    .base_name = TYPE_VHOST_USER_INPUT_PCI,
+    .generic_name = "vhost-user-input-pci",
+    .transitional_name = "vhost-user-input-pci-transitional",
+    .non_transitional_name = "vhost-user-input-pci-non-transitional",
+    .parent = TYPE_VIRTIO_INPUT_PCI,
+    .instance_size = sizeof(VHostUserInputPCI),
+    .instance_init = vhost_user_input_pci_instance_init,
+};
+
+static void vhost_user_input_pci_register(void)
+{
+    virtio_pci_types_register(&vhost_user_input_pci_info);
+}
+
+type_init(vhost_user_input_pci_register)
diff --git a/MAINTAINERS b/MAINTAINERS
index 2e40390ebc..6d4a10b390 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1521,6 +1521,7 @@ L: qemu-s390x@nongnu.org
 virtio-input
 M: Gerd Hoffmann <kraxel@redhat.com>
 S: Maintained
+F: hw/input/vhost-user-input.c
 F: hw/input/virtio-input*.c
 F: include/hw/virtio/virtio-input.h
 
diff --git a/hw/input/Kconfig b/hw/input/Kconfig
index e2e66f0858..50e55e3538 100644
--- a/hw/input/Kconfig
+++ b/hw/input/Kconfig
@@ -29,5 +29,10 @@ config VIRTIO_INPUT_HOST
     default y
     depends on VIRTIO && LINUX
 
+config VHOST_USER_INPUT
+    bool
+    default y
+    depends on VIRTIO_INPUT && VHOST_USER
+
 config TSC210X
     bool
diff --git a/hw/input/Makefile.objs b/hw/input/Makefile.objs
index c8b00f71ec..9511e3102f 100644
--- a/hw/input/Makefile.objs
+++ b/hw/input/Makefile.objs
@@ -11,6 +11,7 @@ common-obj-$(CONFIG_VIRTIO_INPUT) += virtio-input.o
 common-obj-$(CONFIG_VIRTIO_INPUT) += virtio-input-hid.o
 ifeq ($(CONFIG_LINUX),y)
 common-obj-$(CONFIG_VIRTIO_INPUT) += virtio-input-host.o
+common-obj-$(CONFIG_VHOST_USER_INPUT) += vhost-user-input.o
 endif
 
 obj-$(CONFIG_MILKYMIST) += milkymist-softusb.o
diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
index f2ab667a21..5570ea8df8 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -17,6 +17,7 @@ obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.o
 ifeq ($(CONFIG_VIRTIO_PCI),y)
 obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock-pci.o
 obj-$(CONFIG_VHOST_USER_BLK) += vhost-user-blk-pci.o
+obj-$(CONFIG_VHOST_USER_INPUT) += vhost-user-input-pci.o
 obj-$(CONFIG_VHOST_USER_SCSI) += vhost-user-scsi-pci.o
 obj-$(CONFIG_VHOST_SCSI) += vhost-scsi-pci.o
 obj-$(CONFIG_VIRTIO_INPUT_HOST) += virtio-input-host-pci.o
-- 
2.21.0.777.g83232e3864

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v2 5/6] util: simplify unix_listen()
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
                   ` (3 preceding siblings ...)
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci Marc-André Lureau
@ 2019-05-03 13:00 ` Marc-André Lureau
  2019-05-03 13:37     ` Daniel P. Berrangé
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 6/6] contrib: add vhost-user-input Marc-André Lureau
  2019-05-09 12:34 ` [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Michael S. Tsirkin
  6 siblings, 1 reply; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

The only caller of unix_listen() left is qga/channel-posix.c.

There is no need to deal with legacy coma-trailing options ",...".

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 util/qemu-sockets.c | 18 ++----------------
 1 file changed, 2 insertions(+), 16 deletions(-)

diff --git a/util/qemu-sockets.c b/util/qemu-sockets.c
index 9705051690..d1664e83d6 100644
--- a/util/qemu-sockets.c
+++ b/util/qemu-sockets.c
@@ -966,26 +966,12 @@ static int unix_connect_saddr(UnixSocketAddress *saddr, Error **errp)
 /* compatibility wrapper */
 int unix_listen(const char *str, Error **errp)
 {
-    char *path, *optstr;
-    int sock, len;
     UnixSocketAddress *saddr;
+    int sock;
 
     saddr = g_new0(UnixSocketAddress, 1);
-
-    optstr = strchr(str, ',');
-    if (optstr) {
-        len = optstr - str;
-        if (len) {
-            path = g_malloc(len+1);
-            snprintf(path, len+1, "%.*s", len, str);
-            saddr->path = path;
-        }
-    } else {
-        saddr->path = g_strdup(str);
-    }
-
+    saddr->path = g_strdup(str);
     sock = unix_listen_saddr(saddr, errp);
-
     qapi_free_UnixSocketAddress(saddr);
     return sock;
 }
-- 
2.21.0.777.g83232e3864

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH v2 6/6] contrib: add vhost-user-input
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
                   ` (4 preceding siblings ...)
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 5/6] util: simplify unix_listen() Marc-André Lureau
@ 2019-05-03 13:00 ` Marc-André Lureau
  2019-05-09 12:34 ` [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Michael S. Tsirkin
  6 siblings, 0 replies; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-03 13:00 UTC (permalink / raw)
  To: qemu-devel; +Cc: kraxel, mst

Add a vhost-user input backend example, based on virtio-input-host
device. It takes an evdev path as argument, and can be associated with
a vhost-user-input device via a UNIX socket:

$ vhost-user-input -p /dev/input/eventX -s /tmp/vui.sock

$ qemu ... -chardev socket,id=vuic,path=/tmp/vui.sock
  -device vhost-user-input-pci,chardev=vuic

This example is intentionally not included in $TOOLS, and not
installed by default.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 contrib/vhost-user-input/main.c        | 393 +++++++++++++++++++++++++
 MAINTAINERS                            |   1 +
 Makefile                               |  11 +
 Makefile.objs                          |   1 +
 contrib/vhost-user-input/Makefile.objs |   1 +
 5 files changed, 407 insertions(+)
 create mode 100644 contrib/vhost-user-input/main.c
 create mode 100644 contrib/vhost-user-input/Makefile.objs

diff --git a/contrib/vhost-user-input/main.c b/contrib/vhost-user-input/main.c
new file mode 100644
index 0000000000..8d493f598e
--- /dev/null
+++ b/contrib/vhost-user-input/main.c
@@ -0,0 +1,393 @@
+/*
+ * This work is licensed under the terms of the GNU GPL, version 2 or
+ * (at your option) any later version.  See the COPYING file in the
+ * top-level directory.
+ */
+
+#include "qemu/osdep.h"
+
+#include <glib.h>
+#include <linux/input.h>
+
+#include "qemu/iov.h"
+#include "qemu/bswap.h"
+#include "qemu/sockets.h"
+#include "contrib/libvhost-user/libvhost-user.h"
+#include "contrib/libvhost-user/libvhost-user-glib.h"
+#include "standard-headers/linux/virtio_input.h"
+#include "qapi/error.h"
+
+typedef struct virtio_input_event virtio_input_event;
+typedef struct virtio_input_config virtio_input_config;
+
+typedef struct VuInput {
+    VugDev dev;
+    GSource *evsrc;
+    int evdevfd;
+    GArray *config;
+    virtio_input_config *sel_config;
+    struct {
+        virtio_input_event event;
+        VuVirtqElement *elem;
+    } *queue;
+    uint32_t qindex, qsize;
+} VuInput;
+
+static void vi_input_send(VuInput *vi, struct virtio_input_event *event)
+{
+    VuDev *dev = &vi->dev.parent;
+    VuVirtq *vq = vu_get_queue(dev, 0);
+    VuVirtqElement *elem;
+    int i, len;
+
+    /* queue up events ... */
+    if (vi->qindex == vi->qsize) {
+        vi->qsize++;
+        vi->queue = g_realloc_n(vi->queue, vi->qsize, sizeof(vi->queue[0]));
+    }
+    vi->queue[vi->qindex++].event = *event;
+
+    /* ... until we see a report sync ... */
+    if (event->type != htole16(EV_SYN) ||
+        event->code != htole16(SYN_REPORT)) {
+        return;
+    }
+
+    /* ... then check available space ... */
+    for (i = 0; i < vi->qindex; i++) {
+        elem = vu_queue_pop(dev, vq, sizeof(VuVirtqElement));
+        if (!elem) {
+            while (--i >= 0) {
+                vu_queue_unpop(dev, vq, vi->queue[i].elem, 0);
+            }
+            vi->qindex = 0;
+            g_warning("virtio-input queue full");
+            return;
+        }
+        vi->queue[i].elem = elem;
+    }
+
+    /* ... and finally pass them to the guest */
+    for (i = 0; i < vi->qindex; i++) {
+        elem = vi->queue[i].elem;
+        len = iov_from_buf(elem->in_sg, elem->in_num,
+                           0, &vi->queue[i].event, sizeof(virtio_input_event));
+        vu_queue_push(dev, vq, elem, len);
+        g_free(elem);
+    }
+
+    vu_queue_notify(&vi->dev.parent, vq);
+    vi->qindex = 0;
+}
+
+static void
+vi_evdev_watch(VuDev *dev, int condition, void *data)
+{
+    VuInput *vi = data;
+    int fd = vi->evdevfd;
+
+    g_debug("Got evdev condition %x", condition);
+
+    struct virtio_input_event virtio;
+    struct input_event evdev;
+    int rc;
+
+    for (;;) {
+        rc = read(fd, &evdev, sizeof(evdev));
+        if (rc != sizeof(evdev)) {
+            break;
+        }
+
+        g_debug("input %d %d %d", evdev.type, evdev.code, evdev.value);
+
+        virtio.type  = htole16(evdev.type);
+        virtio.code  = htole16(evdev.code);
+        virtio.value = htole32(evdev.value);
+        vi_input_send(vi, &virtio);
+    }
+}
+
+
+static void vi_handle_status(VuInput *vi, virtio_input_event *event)
+{
+    struct input_event evdev;
+    int rc;
+
+    if (gettimeofday(&evdev.time, NULL)) {
+        perror("vi_handle_status: gettimeofday");
+        return;
+    }
+
+    evdev.type = le16toh(event->type);
+    evdev.code = le16toh(event->code);
+    evdev.value = le32toh(event->value);
+
+    rc = write(vi->evdevfd, &evdev, sizeof(evdev));
+    if (rc == -1) {
+        perror("vi_host_handle_status: write");
+    }
+}
+
+static void vi_handle_sts(VuDev *dev, int qidx)
+{
+    VuInput *vi = container_of(dev, VuInput, dev.parent);
+    VuVirtq *vq = vu_get_queue(dev, qidx);
+    virtio_input_event event;
+    VuVirtqElement *elem;
+    int len;
+
+    g_debug("%s", G_STRFUNC);
+
+    for (;;) {
+        elem = vu_queue_pop(dev, vq, sizeof(VuVirtqElement));
+        if (!elem) {
+            break;
+        }
+
+        memset(&event, 0, sizeof(event));
+        len = iov_to_buf(elem->out_sg, elem->out_num,
+                         0, &event, sizeof(event));
+        vi_handle_status(vi, &event);
+        vu_queue_push(dev, vq, elem, len);
+        g_free(elem);
+    }
+
+    vu_queue_notify(&vi->dev.parent, vq);
+}
+
+static void
+vi_panic(VuDev *dev, const char *msg)
+{
+    g_critical("%s\n", msg);
+    exit(EXIT_FAILURE);
+}
+
+static void
+vi_queue_set_started(VuDev *dev, int qidx, bool started)
+{
+    VuInput *vi = container_of(dev, VuInput, dev.parent);
+    VuVirtq *vq = vu_get_queue(dev, qidx);
+
+    g_debug("queue started %d:%d", qidx, started);
+
+    if (qidx == 1) {
+        vu_set_queue_handler(dev, vq, started ? vi_handle_sts : NULL);
+    }
+
+    started = vu_queue_started(dev, vu_get_queue(dev, 0)) &&
+        vu_queue_started(dev, vu_get_queue(dev, 1));
+
+    if (started && !vi->evsrc) {
+        vi->evsrc = vug_source_new(&vi->dev, vi->evdevfd,
+                                   G_IO_IN, vi_evdev_watch, vi);
+    }
+
+    if (!started && vi->evsrc) {
+        g_source_destroy(vi->evsrc);
+        vi->evsrc = NULL;
+    }
+}
+
+static virtio_input_config *
+vi_find_config(VuInput *vi, uint8_t select, uint8_t subsel)
+{
+    virtio_input_config *cfg;
+    int i;
+
+    for (i = 0; i < vi->config->len; i++) {
+        cfg = &g_array_index(vi->config, virtio_input_config, i);
+        if (select == cfg->select && subsel == cfg->subsel) {
+            return cfg;
+        }
+    }
+
+    return NULL;
+}
+
+static int vi_get_config(VuDev *dev, uint8_t *config, uint32_t len)
+{
+    VuInput *vi = container_of(dev, VuInput, dev.parent);
+
+    g_return_val_if_fail(len <= sizeof(*vi->sel_config), -1);
+
+    if (vi->sel_config) {
+        memcpy(config, vi->sel_config, len);
+    } else {
+        memset(config, 0, len);
+    }
+
+    return 0;
+}
+
+static int vi_set_config(VuDev *dev, const uint8_t *data,
+                         uint32_t offset, uint32_t size,
+                         uint32_t flags)
+{
+    VuInput *vi = container_of(dev, VuInput, dev.parent);
+    virtio_input_config *config = (virtio_input_config *)data;
+
+    vi->sel_config = vi_find_config(vi, config->select, config->subsel);
+
+    return 0;
+}
+
+static const VuDevIface vuiface = {
+    .queue_set_started = vi_queue_set_started,
+    .get_config = vi_get_config,
+    .set_config = vi_set_config,
+};
+
+static void
+vi_bits_config(VuInput *vi, int type, int count)
+{
+    virtio_input_config bits;
+    int rc, i, size = 0;
+
+    memset(&bits, 0, sizeof(bits));
+    rc = ioctl(vi->evdevfd, EVIOCGBIT(type, count / 8), bits.u.bitmap);
+    if (rc < 0) {
+        return;
+    }
+
+    for (i = 0; i < count / 8; i++) {
+        if (bits.u.bitmap[i]) {
+            size = i + 1;
+        }
+    }
+    if (size == 0) {
+        return;
+    }
+
+    bits.select = VIRTIO_INPUT_CFG_EV_BITS;
+    bits.subsel = type;
+    bits.size   = size;
+    g_array_append_val(vi->config, bits);
+}
+
+static char *opt_evdev;
+static int opt_fdnum = -1;
+static char *opt_socket_path;
+static gboolean opt_nograb;
+static gboolean opt_print_caps;
+
+static GOptionEntry entries[] = {
+    { "print-capabilities", 'c', 0, G_OPTION_ARG_NONE, &opt_print_caps,
+      "Print capabilities", NULL },
+    { "no-grab", 'n', 0, G_OPTION_ARG_NONE, &opt_nograb,
+      "Don't grab device", NULL },
+    { "fd", 'f', 0, G_OPTION_ARG_INT, &opt_fdnum,
+      "Use inherited fd socket", "FDNUM" },
+    { "socket-path", 's', 0, G_OPTION_ARG_FILENAME, &opt_socket_path,
+      "Use UNIX socket path", "PATH" },
+    { "evdev-path", 'p', 0, G_OPTION_ARG_FILENAME, &opt_evdev,
+      "evdev input device path", "PATH" },
+    { NULL, }
+};
+
+int
+main(int argc, char *argv[])
+{
+    GMainLoop *loop = NULL;
+    VuInput vi = { 0, };
+    int rc, ver, fd;
+    virtio_input_config id;
+    struct input_id ids;
+    GError *error = NULL;
+    GOptionContext *context;
+
+    context = g_option_context_new(NULL);
+    g_option_context_add_main_entries(context, entries, NULL);
+    if (!g_option_context_parse(context, &argc, &argv, &error)) {
+        g_printerr("Option parsing failed: %s\n", error->message);
+        exit(EXIT_FAILURE);
+    }
+    if (opt_print_caps) {
+        g_print("{\n");
+        g_print("  \"type\": \"input\",\n");
+        g_print("  \"features\": [\n");
+        g_print("    \"evdev-path\",\n");
+        g_print("    \"no-grab\"\n");
+        g_print("  ]\n");
+        g_print("}\n");
+        exit(EXIT_SUCCESS);
+    }
+    if (!opt_evdev) {
+        g_printerr("Please specify an evdev path\n");
+        exit(EXIT_FAILURE);
+    }
+    if ((!!opt_socket_path + (opt_fdnum != -1)) != 1) {
+        g_printerr("Please specify either --fd or --socket-path\n");
+        exit(EXIT_FAILURE);
+    }
+
+    vi.evdevfd = open(opt_evdev, O_RDWR);
+    if (vi.evdevfd < 0) {
+        g_printerr("Failed to open evdev: %s\n", g_strerror(errno));
+        exit(EXIT_FAILURE);
+    }
+
+    rc = ioctl(vi.evdevfd, EVIOCGVERSION, &ver);
+    if (rc < 0) {
+        g_printerr("%s: is not an evdev device\n", argv[1]);
+        exit(EXIT_FAILURE);
+    }
+
+    if (!opt_nograb) {
+        rc = ioctl(vi.evdevfd, EVIOCGRAB, 1);
+        if (rc < 0) {
+            g_printerr("Failed to grab device\n");
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    vi.config = g_array_new(false, false, sizeof(virtio_input_config));
+    memset(&id, 0, sizeof(id));
+    ioctl(vi.evdevfd, EVIOCGNAME(sizeof(id.u.string) - 1), id.u.string);
+    id.select = VIRTIO_INPUT_CFG_ID_NAME;
+    id.size = strlen(id.u.string);
+    g_array_append_val(vi.config, id);
+
+    if (ioctl(vi.evdevfd, EVIOCGID, &ids) == 0) {
+        memset(&id, 0, sizeof(id));
+        id.select = VIRTIO_INPUT_CFG_ID_DEVIDS;
+        id.size = sizeof(struct virtio_input_devids);
+        id.u.ids.bustype = cpu_to_le16(ids.bustype);
+        id.u.ids.vendor  = cpu_to_le16(ids.vendor);
+        id.u.ids.product = cpu_to_le16(ids.product);
+        id.u.ids.version = cpu_to_le16(ids.version);
+        g_array_append_val(vi.config, id);
+    }
+
+    vi_bits_config(&vi, EV_KEY, KEY_CNT);
+    vi_bits_config(&vi, EV_REL, REL_CNT);
+    vi_bits_config(&vi, EV_ABS, ABS_CNT);
+    vi_bits_config(&vi, EV_MSC, MSC_CNT);
+    vi_bits_config(&vi, EV_SW,  SW_CNT);
+    g_debug("config length: %u", vi.config->len);
+
+    if (opt_socket_path) {
+        int lsock = unix_listen(opt_socket_path, &error_fatal);
+        fd = accept(lsock, NULL, NULL);
+        close(lsock);
+    } else {
+        fd = opt_fdnum;
+    }
+    if (fd == -1) {
+        g_printerr("Invalid socket");
+        exit(EXIT_FAILURE);
+    }
+    vug_init(&vi.dev, fd, vi_panic, &vuiface);
+
+    loop = g_main_loop_new(NULL, FALSE);
+    g_main_loop_run(loop);
+    g_main_loop_unref(loop);
+
+    vug_deinit(&vi.dev);
+
+    if (vi.evsrc) {
+        g_source_unref(vi.evsrc);
+    }
+    g_array_free(vi.config, TRUE);
+    g_free(vi.queue);
+    return 0;
+}
diff --git a/MAINTAINERS b/MAINTAINERS
index 6d4a10b390..89c6d517ed 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1524,6 +1524,7 @@ S: Maintained
 F: hw/input/vhost-user-input.c
 F: hw/input/virtio-input*.c
 F: include/hw/virtio/virtio-input.h
+F: contrib/vhost-user-input/*
 
 virtio-serial
 M: Amit Shah <amit@kernel.org>
diff --git a/Makefile b/Makefile
index 1211e78c91..6633f472a3 100644
--- a/Makefile
+++ b/Makefile
@@ -406,6 +406,7 @@ dummy := $(call unnest-vars,, \
                 libvhost-user-obj-y \
                 vhost-user-scsi-obj-y \
                 vhost-user-blk-obj-y \
+                vhost-user-input-obj-y \
                 qga-vss-dll-obj-y \
                 block-obj-y \
                 block-obj-m \
@@ -615,6 +616,16 @@ rdmacm-mux$(EXESUF): LIBS += "-libumad"
 rdmacm-mux$(EXESUF): $(rdmacm-mux-obj-y) $(COMMON_LDADDS)
 	$(call LINK, $^)
 
+ifdef CONFIG_VHOST_USER_INPUT
+ifdef CONFIG_LINUX
+vhost-user-input$(EXESUF): $(vhost-user-input-obj-y) libvhost-user.a libqemuutil.a
+	$(call LINK, $^)
+
+# build by default, do not install
+all: vhost-user-input$(EXESUF)
+endif
+endif
+
 module_block.h: $(SRC_PATH)/scripts/modules/module_block.py config-host.mak
 	$(call quiet-command,$(PYTHON) $< $@ \
 	$(addprefix $(SRC_PATH)/,$(patsubst %.mo,%.c,$(block-obj-m))), \
diff --git a/Makefile.objs b/Makefile.objs
index cf065de5ed..27502b7df1 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -122,6 +122,7 @@ vhost-user-scsi.o-libs := $(LIBISCSI_LIBS)
 vhost-user-scsi-obj-y = contrib/vhost-user-scsi/
 vhost-user-blk-obj-y = contrib/vhost-user-blk/
 rdmacm-mux-obj-y = contrib/rdmacm-mux/
+vhost-user-input-obj-y = contrib/vhost-user-input/
 
 ######################################################################
 trace-events-subdirs =
diff --git a/contrib/vhost-user-input/Makefile.objs b/contrib/vhost-user-input/Makefile.objs
new file mode 100644
index 0000000000..b1fad90d51
--- /dev/null
+++ b/contrib/vhost-user-input/Makefile.objs
@@ -0,0 +1 @@
+vhost-user-input-obj-y = main.o
-- 
2.21.0.777.g83232e3864

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 5/6] util: simplify unix_listen()
@ 2019-05-03 13:37     ` Daniel P. Berrangé
  0 siblings, 0 replies; 16+ messages in thread
From: Daniel P. Berrangé @ 2019-05-03 13:37 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, kraxel, mst

On Fri, May 03, 2019 at 03:00:33PM +0200, Marc-André Lureau wrote:
> The only caller of unix_listen() left is qga/channel-posix.c.
> 
> There is no need to deal with legacy coma-trailing options ",...".
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  util/qemu-sockets.c | 18 ++----------------
>  1 file changed, 2 insertions(+), 16 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 5/6] util: simplify unix_listen()
@ 2019-05-03 13:37     ` Daniel P. Berrangé
  0 siblings, 0 replies; 16+ messages in thread
From: Daniel P. Berrangé @ 2019-05-03 13:37 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: mst, qemu-devel, kraxel

On Fri, May 03, 2019 at 03:00:33PM +0200, Marc-André Lureau wrote:
> The only caller of unix_listen() left is qga/channel-posix.c.
> 
> There is no need to deal with legacy coma-trailing options ",...".
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  util/qemu-sockets.c | 18 ++----------------
>  1 file changed, 2 insertions(+), 16 deletions(-)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci Marc-André Lureau
@ 2019-05-09  6:32   ` Gerd Hoffmann
  2019-05-09  8:37     ` Marc-André Lureau
  0 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2019-05-09  6:32 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, mst

  Hi,

> +static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
> +    .base_name = TYPE_VHOST_USER_INPUT_PCI,
> +    .generic_name = "vhost-user-input-pci",
> +    .transitional_name = "vhost-user-input-pci-transitional",
> +    .non_transitional_name = "vhost-user-input-pci-non-transitional",

virtio-input is virtio 1.0 only, so we don't need these variants.
Incremental fix below, if you ack that I can squash it for the pull req.
Or you send a v3 (in case you have other changes pending).

cheers,
  Gerd

--- a/hw/virtio/vhost-user-input-pci.c
+++ b/hw/virtio/vhost-user-input-pci.c
@@ -13,7 +13,7 @@
 
 typedef struct VHostUserInputPCI VHostUserInputPCI;
 
-#define TYPE_VHOST_USER_INPUT_PCI "vhost-user-input-pci-base"
+#define TYPE_VHOST_USER_INPUT_PCI "vhost-user-input-pci"
 
 #define VHOST_USER_INPUT_PCI(obj) \
     OBJECT_CHECK(VHostUserInputPCI, (obj), TYPE_VHOST_USER_INPUT_PCI)
@@ -37,9 +37,7 @@ static void vhost_user_input_pci_instance_init(Object *obj)
 
 static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
     .base_name = TYPE_VHOST_USER_INPUT_PCI,
-    .generic_name = "vhost-user-input-pci",
-    .transitional_name = "vhost-user-input-pci-transitional",
-    .non_transitional_name = "vhost-user-input-pci-non-transitional",
+    .generic_name = TYPE_VHOST_USER_INPUT_PCI,
     .parent = TYPE_VIRTIO_INPUT_PCI,
     .instance_size = sizeof(VHostUserInputPCI),
     .instance_init = vhost_user_input_pci_instance_init,


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-09  6:32   ` Gerd Hoffmann
@ 2019-05-09  8:37     ` Marc-André Lureau
  2019-05-09  9:24       ` Gerd Hoffmann
  0 siblings, 1 reply; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-09  8:37 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Michael S . Tsirkin

Hi

On Thu, May 9, 2019 at 8:32 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
>
>   Hi,
>
> > +static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
> > +    .base_name = TYPE_VHOST_USER_INPUT_PCI,
> > +    .generic_name = "vhost-user-input-pci",
> > +    .transitional_name = "vhost-user-input-pci-transitional",
> > +    .non_transitional_name = "vhost-user-input-pci-non-transitional",
>
> virtio-input is virtio 1.0 only, so we don't need these variants.
> Incremental fix below, if you ack that I can squash it for the pull req.
> Or you send a v3 (in case you have other changes pending).
>
> cheers,
>   Gerd

ack, thanks

>
> --- a/hw/virtio/vhost-user-input-pci.c
> +++ b/hw/virtio/vhost-user-input-pci.c
> @@ -13,7 +13,7 @@
>
>  typedef struct VHostUserInputPCI VHostUserInputPCI;
>
> -#define TYPE_VHOST_USER_INPUT_PCI "vhost-user-input-pci-base"
> +#define TYPE_VHOST_USER_INPUT_PCI "vhost-user-input-pci"
>
>  #define VHOST_USER_INPUT_PCI(obj) \
>      OBJECT_CHECK(VHostUserInputPCI, (obj), TYPE_VHOST_USER_INPUT_PCI)
> @@ -37,9 +37,7 @@ static void vhost_user_input_pci_instance_init(Object *obj)
>
>  static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
>      .base_name = TYPE_VHOST_USER_INPUT_PCI,
> -    .generic_name = "vhost-user-input-pci",
> -    .transitional_name = "vhost-user-input-pci-transitional",
> -    .non_transitional_name = "vhost-user-input-pci-non-transitional",
> +    .generic_name = TYPE_VHOST_USER_INPUT_PCI,
>      .parent = TYPE_VIRTIO_INPUT_PCI,
>      .instance_size = sizeof(VHostUserInputPCI),
>      .instance_init = vhost_user_input_pci_instance_init,


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-09  8:37     ` Marc-André Lureau
@ 2019-05-09  9:24       ` Gerd Hoffmann
  2019-05-09  9:53         ` Marc-André Lureau
  0 siblings, 1 reply; 16+ messages in thread
From: Gerd Hoffmann @ 2019-05-09  9:24 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, Michael S . Tsirkin

On Thu, May 09, 2019 at 10:37:20AM +0200, Marc-André Lureau wrote:
> Hi
> 
> On Thu, May 9, 2019 at 8:32 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> >
> >   Hi,
> >
> > > +static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
> > > +    .base_name = TYPE_VHOST_USER_INPUT_PCI,
> > > +    .generic_name = "vhost-user-input-pci",
> > > +    .transitional_name = "vhost-user-input-pci-transitional",
> > > +    .non_transitional_name = "vhost-user-input-pci-non-transitional",
> >
> > virtio-input is virtio 1.0 only, so we don't need these variants.
> > Incremental fix below, if you ack that I can squash it for the pull req.
> > Or you send a v3 (in case you have other changes pending).
> >
> > cheers,
> >   Gerd
> 
> ack, thanks

Spoke too soon, patch failed tests.
New version (with some virtio-input-host fixes on top) pushed to:

	https://git.kraxel.org/cgit/qemu/log/?h=testing/vhost-input

Can you please verify?

thanks,
  Gerd



^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-09  9:24       ` Gerd Hoffmann
@ 2019-05-09  9:53         ` Marc-André Lureau
  2019-05-09 10:09           ` Marc-André Lureau
  0 siblings, 1 reply; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-09  9:53 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Michael S . Tsirkin

Hi

On Thu, May 9, 2019 at 11:25 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
>
> On Thu, May 09, 2019 at 10:37:20AM +0200, Marc-André Lureau wrote:
> > Hi
> >
> > On Thu, May 9, 2019 at 8:32 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> > >
> > >   Hi,
> > >
> > > > +static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
> > > > +    .base_name = TYPE_VHOST_USER_INPUT_PCI,
> > > > +    .generic_name = "vhost-user-input-pci",
> > > > +    .transitional_name = "vhost-user-input-pci-transitional",
> > > > +    .non_transitional_name = "vhost-user-input-pci-non-transitional",
> > >
> > > virtio-input is virtio 1.0 only, so we don't need these variants.
> > > Incremental fix below, if you ack that I can squash it for the pull req.
> > > Or you send a v3 (in case you have other changes pending).
> > >
> > > cheers,
> > >   Gerd
> >
> > ack, thanks
>
> Spoke too soon, patch failed tests.
> New version (with some virtio-input-host fixes on top) pushed to:
>
>         https://git.kraxel.org/cgit/qemu/log/?h=testing/vhost-input
>
> Can you please verify?

Looks good, tested successfully.
thanks


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-09  9:53         ` Marc-André Lureau
@ 2019-05-09 10:09           ` Marc-André Lureau
  2019-05-09 10:16             ` Marc-André Lureau
  0 siblings, 1 reply; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-09 10:09 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Michael S . Tsirkin

Hi

On Thu, May 9, 2019 at 11:53 AM Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
>
> Hi
>
> On Thu, May 9, 2019 at 11:25 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> >
> > On Thu, May 09, 2019 at 10:37:20AM +0200, Marc-André Lureau wrote:
> > > Hi
> > >
> > > On Thu, May 9, 2019 at 8:32 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> > > >
> > > >   Hi,
> > > >
> > > > > +static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
> > > > > +    .base_name = TYPE_VHOST_USER_INPUT_PCI,
> > > > > +    .generic_name = "vhost-user-input-pci",
> > > > > +    .transitional_name = "vhost-user-input-pci-transitional",
> > > > > +    .non_transitional_name = "vhost-user-input-pci-non-transitional",
> > > >
> > > > virtio-input is virtio 1.0 only, so we don't need these variants.
> > > > Incremental fix below, if you ack that I can squash it for the pull req.
> > > > Or you send a v3 (in case you have other changes pending).
> > > >
> > > > cheers,
> > > >   Gerd
> > >
> > > ack, thanks
> >
> > Spoke too soon, patch failed tests.
> > New version (with some virtio-input-host fixes on top) pushed to:
> >
> >         https://git.kraxel.org/cgit/qemu/log/?h=testing/vhost-input
> >
> > Can you please verify?
>
> Looks good, tested successfully.
> thanks
>

nack, I tested wrongly, investigating some issue


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci
  2019-05-09 10:09           ` Marc-André Lureau
@ 2019-05-09 10:16             ` Marc-André Lureau
  0 siblings, 0 replies; 16+ messages in thread
From: Marc-André Lureau @ 2019-05-09 10:16 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: qemu-devel, Michael S . Tsirkin

Hi

On Thu, May 9, 2019 at 12:09 PM Marc-André Lureau
<marcandre.lureau@gmail.com> wrote:
>
> Hi
>
> On Thu, May 9, 2019 at 11:53 AM Marc-André Lureau
> <marcandre.lureau@gmail.com> wrote:
> >
> > Hi
> >
> > On Thu, May 9, 2019 at 11:25 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> > >
> > > On Thu, May 09, 2019 at 10:37:20AM +0200, Marc-André Lureau wrote:
> > > > Hi
> > > >
> > > > On Thu, May 9, 2019 at 8:32 AM Gerd Hoffmann <kraxel@redhat.com> wrote:
> > > > >
> > > > >   Hi,
> > > > >
> > > > > > +static const VirtioPCIDeviceTypeInfo vhost_user_input_pci_info = {
> > > > > > +    .base_name = TYPE_VHOST_USER_INPUT_PCI,
> > > > > > +    .generic_name = "vhost-user-input-pci",
> > > > > > +    .transitional_name = "vhost-user-input-pci-transitional",
> > > > > > +    .non_transitional_name = "vhost-user-input-pci-non-transitional",
> > > > >
> > > > > virtio-input is virtio 1.0 only, so we don't need these variants.
> > > > > Incremental fix below, if you ack that I can squash it for the pull req.
> > > > > Or you send a v3 (in case you have other changes pending).
> > > > >
> > > > > cheers,
> > > > >   Gerd
> > > >
> > > > ack, thanks
> > >
> > > Spoke too soon, patch failed tests.
> > > New version (with some virtio-input-host fixes on top) pushed to:
> > >
> > >         https://git.kraxel.org/cgit/qemu/log/?h=testing/vhost-input
> > >
> > > Can you please verify?
> >
> > Looks good, tested successfully.
> > thanks
> >
>
> nack, I tested wrongly, investigating some issue

In your git tree, you removed:
-    .parent = TYPE_VIRTIO_INPUT_PCI,

from vhost_user_input_pci_info, please add it back


-- 
Marc-André Lureau


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input
  2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
                   ` (5 preceding siblings ...)
  2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 6/6] contrib: add vhost-user-input Marc-André Lureau
@ 2019-05-09 12:34 ` Michael S. Tsirkin
  6 siblings, 0 replies; 16+ messages in thread
From: Michael S. Tsirkin @ 2019-05-09 12:34 UTC (permalink / raw)
  To: Marc-André Lureau; +Cc: qemu-devel, kraxel

On Fri, May 03, 2019 at 03:00:28PM +0200, Marc-André Lureau wrote:
> Hi,
> 
> This is the vhost-user-input part of "[PATCH v6 00/11] vhost-user for input & GPU".
> 
> v2:
> - build fixes
> 
> v1: (changes since original v6 series)
> - add "libvhost-user: fix -Waddress-of-packed-member" & "util: simplify unix_listen()"
> - use unix_listen()
> - build vhost-user-input by default (when applicable)
> 
> Marc-André Lureau (6):
>   libvhost-user: fix -Waddress-of-packed-member
>   libvhost-user: add PROTOCOL_F_CONFIG if {set,get}_config
>   Add vhost-user-backend
>   Add vhost-user-input-pci
>   util: simplify unix_listen()
>   contrib: add vhost-user-input

OK looks sane.

Gerd, IIUC you are going to merge this right?
If so

Reviewed-by: Michael S. Tsirkin <mst@redhat.com>

thanks!


>  include/sysemu/vhost-user-backend.h    |  57 ++++
>  backends/vhost-user.c                  | 209 +++++++++++++
>  contrib/libvhost-user/libvhost-user.c  |  10 +-
>  contrib/vhost-user-input/main.c        | 393 +++++++++++++++++++++++++
>  hw/input/vhost-user-input.c            | 129 ++++++++
>  hw/virtio/vhost-user-input-pci.c       |  53 ++++
>  util/qemu-sockets.c                    |  18 +-
>  MAINTAINERS                            |   4 +
>  Makefile                               |  11 +
>  Makefile.objs                          |   1 +
>  backends/Makefile.objs                 |   2 +
>  contrib/vhost-user-input/Makefile.objs |   1 +
>  hw/input/Kconfig                       |   5 +
>  hw/input/Makefile.objs                 |   1 +
>  hw/virtio/Makefile.objs                |   1 +
>  16 files changed, 890 insertions(+), 19 deletions(-)
>  create mode 100644 include/sysemu/vhost-user-backend.h
>  create mode 100644 backends/vhost-user.c
>  create mode 100644 contrib/vhost-user-input/main.c
>  create mode 100644 hw/input/vhost-user-input.c
>  create mode 100644 hw/virtio/vhost-user-input-pci.c
>  create mode 100644 contrib/vhost-user-input/Makefile.objs
> 
> -- 
> 2.21.0.777.g83232e3864


^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2019-05-09 12:35 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-05-03 13:00 [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Marc-André Lureau
2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 1/6] libvhost-user: fix -Waddress-of-packed-member Marc-André Lureau
2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 2/6] libvhost-user: add PROTOCOL_F_CONFIG if {set, get}_config Marc-André Lureau
2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 3/6] Add vhost-user-backend Marc-André Lureau
2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 4/6] Add vhost-user-input-pci Marc-André Lureau
2019-05-09  6:32   ` Gerd Hoffmann
2019-05-09  8:37     ` Marc-André Lureau
2019-05-09  9:24       ` Gerd Hoffmann
2019-05-09  9:53         ` Marc-André Lureau
2019-05-09 10:09           ` Marc-André Lureau
2019-05-09 10:16             ` Marc-André Lureau
2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 5/6] util: simplify unix_listen() Marc-André Lureau
2019-05-03 13:37   ` Daniel P. Berrangé
2019-05-03 13:37     ` Daniel P. Berrangé
2019-05-03 13:00 ` [Qemu-devel] [PATCH v2 6/6] contrib: add vhost-user-input Marc-André Lureau
2019-05-09 12:34 ` [Qemu-devel] [PATCH v2 0/6] Add vhost-user-input Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.