All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Stefano Garzarella <sgarzare@redhat.com>
Subject: [PULL v2 49/58] virtio: add vhost-user-vsock base device
Date: Fri, 12 Jun 2020 10:52:50 -0400	[thread overview]
Message-ID: <20200612141917.9446-50-mst@redhat.com> (raw)
In-Reply-To: <20200612141917.9446-1-mst@redhat.com>

From: Stefano Garzarella <sgarzare@redhat.com>

This patch introduces a vhost-user device for vsock, using the
vhost-vsock-common parent class.

The vhost-user-vsock device can be used to implement the virtio-vsock
device emulation in user-space.

Signed-off-by: Stefano Garzarella <sgarzare@redhat.com>
Message-Id: <20200522122512.87413-3-sgarzare@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 configure                            |   3 +
 include/hw/virtio/vhost-user-vsock.h |  36 ++++++
 hw/virtio/vhost-user-vsock.c         | 181 +++++++++++++++++++++++++++
 hw/virtio/Makefile.objs              |   1 +
 4 files changed, 221 insertions(+)
 create mode 100644 include/hw/virtio/vhost-user-vsock.h
 create mode 100644 hw/virtio/vhost-user-vsock.c

diff --git a/configure b/configure
index 597e909b53..7c2adf36e5 100755
--- a/configure
+++ b/configure
@@ -7196,6 +7196,9 @@ if test "$vhost_crypto" = "yes" ; then
 fi
 if test "$vhost_vsock" = "yes" ; then
   echo "CONFIG_VHOST_VSOCK=y" >> $config_host_mak
+  if test "$vhost_user" = "yes" ; then
+    echo "CONFIG_VHOST_USER_VSOCK=y" >> $config_host_mak
+  fi
 fi
 if test "$vhost_kernel" = "yes" ; then
   echo "CONFIG_VHOST_KERNEL=y" >> $config_host_mak
diff --git a/include/hw/virtio/vhost-user-vsock.h b/include/hw/virtio/vhost-user-vsock.h
new file mode 100644
index 0000000000..4e128a4b9f
--- /dev/null
+++ b/include/hw/virtio/vhost-user-vsock.h
@@ -0,0 +1,36 @@
+/*
+ * Vhost-user vsock virtio device
+ *
+ * Copyright 2020 Red Hat, Inc.
+ *
+ * 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.
+ */
+
+#ifndef _QEMU_VHOST_USER_VSOCK_H
+#define _QEMU_VHOST_USER_VSOCK_H
+
+#include "hw/virtio/vhost-vsock-common.h"
+#include "hw/virtio/vhost-user.h"
+#include "standard-headers/linux/virtio_vsock.h"
+
+#define TYPE_VHOST_USER_VSOCK "vhost-user-vsock-device"
+#define VHOST_USER_VSOCK(obj) \
+        OBJECT_CHECK(VHostUserVSock, (obj), TYPE_VHOST_USER_VSOCK)
+
+typedef struct {
+    CharBackend chardev;
+} VHostUserVSockConf;
+
+typedef struct {
+    /*< private >*/
+    VHostVSockCommon parent;
+    VhostUserState vhost_user;
+    VHostUserVSockConf conf;
+    struct virtio_vsock_config vsockcfg;
+
+    /*< public >*/
+} VHostUserVSock;
+
+#endif /* _QEMU_VHOST_USER_VSOCK_H */
diff --git a/hw/virtio/vhost-user-vsock.c b/hw/virtio/vhost-user-vsock.c
new file mode 100644
index 0000000000..3534a39d62
--- /dev/null
+++ b/hw/virtio/vhost-user-vsock.c
@@ -0,0 +1,181 @@
+/*
+ * Vhost-user vsock virtio device
+ *
+ * Copyright 2020 Red Hat, Inc.
+ *
+ * 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 "qapi/error.h"
+#include "qemu/error-report.h"
+#include "hw/qdev-properties.h"
+#include "hw/virtio/vhost-user-vsock.h"
+
+static const int user_feature_bits[] = {
+    VIRTIO_F_VERSION_1,
+    VIRTIO_RING_F_INDIRECT_DESC,
+    VIRTIO_RING_F_EVENT_IDX,
+    VIRTIO_F_NOTIFY_ON_EMPTY,
+    VHOST_INVALID_FEATURE_BIT
+};
+
+static void vuv_get_config(VirtIODevice *vdev, uint8_t *config)
+{
+    VHostUserVSock *vsock = VHOST_USER_VSOCK(vdev);
+
+    memcpy(config, &vsock->vsockcfg, sizeof(struct virtio_vsock_config));
+}
+
+static int vuv_handle_config_change(struct vhost_dev *dev)
+{
+    VHostUserVSock *vsock = VHOST_USER_VSOCK(dev->vdev);
+    int ret = vhost_dev_get_config(dev, (uint8_t *)&vsock->vsockcfg,
+                                   sizeof(struct virtio_vsock_config));
+    if (ret < 0) {
+        error_report("get config space failed");
+        return -1;
+    }
+
+    virtio_notify_config(dev->vdev);
+
+    return 0;
+}
+
+const VhostDevConfigOps vsock_ops = {
+    .vhost_dev_config_notifier = vuv_handle_config_change,
+};
+
+static void vuv_set_status(VirtIODevice *vdev, uint8_t status)
+{
+    VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev);
+    bool should_start = status & VIRTIO_CONFIG_S_DRIVER_OK;
+
+    if (!vdev->vm_running) {
+        should_start = false;
+    }
+
+    if (vvc->vhost_dev.started == should_start) {
+        return;
+    }
+
+    if (should_start) {
+        int ret = vhost_vsock_common_start(vdev);
+        if (ret < 0) {
+            return;
+        }
+    } else {
+        vhost_vsock_common_stop(vdev);
+    }
+}
+
+static uint64_t vuv_get_features(VirtIODevice *vdev,
+                                 uint64_t features,
+                                 Error **errp)
+{
+    VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(vdev);
+
+    return vhost_get_features(&vvc->vhost_dev, user_feature_bits, features);
+}
+
+static const VMStateDescription vuv_vmstate = {
+    .name = "vhost-user-vsock",
+    .unmigratable = 1,
+};
+
+static void vuv_device_realize(DeviceState *dev, Error **errp)
+{
+    VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(dev);
+    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+    VHostUserVSock *vsock = VHOST_USER_VSOCK(dev);
+    int ret;
+
+    if (!vsock->conf.chardev.chr) {
+        error_setg(errp, "missing chardev");
+        return;
+    }
+
+    if (!vhost_user_init(&vsock->vhost_user, &vsock->conf.chardev, errp)) {
+        return;
+    }
+
+    vhost_vsock_common_realize(vdev, "vhost-user-vsock");
+
+    vhost_dev_set_config_notifier(&vvc->vhost_dev, &vsock_ops);
+
+    ret = vhost_dev_init(&vvc->vhost_dev, &vsock->vhost_user,
+                         VHOST_BACKEND_TYPE_USER, 0);
+    if (ret < 0) {
+        error_setg_errno(errp, -ret, "vhost_dev_init failed");
+        goto err_virtio;
+    }
+
+    ret = vhost_dev_get_config(&vvc->vhost_dev, (uint8_t *)&vsock->vsockcfg,
+                               sizeof(struct virtio_vsock_config));
+    if (ret < 0) {
+        error_setg_errno(errp, -ret, "get config space failed");
+        goto err_vhost_dev;
+    }
+
+    return;
+
+err_vhost_dev:
+    vhost_dev_cleanup(&vvc->vhost_dev);
+err_virtio:
+    vhost_vsock_common_unrealize(vdev);
+    vhost_user_cleanup(&vsock->vhost_user);
+    return;
+}
+
+static void vuv_device_unrealize(DeviceState *dev)
+{
+    VHostVSockCommon *vvc = VHOST_VSOCK_COMMON(dev);
+    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+    VHostUserVSock *vsock = VHOST_USER_VSOCK(dev);
+
+    /* This will stop vhost backend if appropriate. */
+    vuv_set_status(vdev, 0);
+
+    vhost_dev_cleanup(&vvc->vhost_dev);
+
+    vhost_vsock_common_unrealize(vdev);
+
+    vhost_user_cleanup(&vsock->vhost_user);
+
+}
+
+static Property vuv_properties[] = {
+    DEFINE_PROP_CHR("chardev", VHostUserVSock, conf.chardev),
+    DEFINE_PROP_END_OF_LIST(),
+};
+
+static void vuv_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+    VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
+
+    device_class_set_props(dc, vuv_properties);
+    dc->vmsd = &vuv_vmstate;
+    vdc->realize = vuv_device_realize;
+    vdc->unrealize = vuv_device_unrealize;
+    vdc->get_features = vuv_get_features;
+    vdc->get_config = vuv_get_config;
+    vdc->set_status = vuv_set_status;
+}
+
+static const TypeInfo vuv_info = {
+    .name = TYPE_VHOST_USER_VSOCK,
+    .parent = TYPE_VHOST_VSOCK_COMMON,
+    .instance_size = sizeof(VHostUserVSock),
+    .class_init = vuv_class_init,
+};
+
+static void vuv_register_types(void)
+{
+    type_register_static(&vuv_info);
+}
+
+type_init(vuv_register_types)
diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
index b1eeb44eac..dd42daedb1 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -18,6 +18,7 @@ common-obj-$(call land,$(CONFIG_VIRTIO_PMEM),$(CONFIG_VIRTIO_PCI)) += virtio-pme
 obj-$(call land,$(CONFIG_VHOST_USER_FS),$(CONFIG_VIRTIO_PCI)) += vhost-user-fs-pci.o
 obj-$(CONFIG_VIRTIO_IOMMU) += virtio-iommu.o
 obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock-common.o vhost-vsock.o
+obj-$(CONFIG_VHOST_USER_VSOCK) += vhost-vsock-common.o vhost-user-vsock.o
 
 ifeq ($(CONFIG_VIRTIO_PCI),y)
 obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock-pci.o
-- 
MST



  parent reply	other threads:[~2020-06-12 15:22 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-12 14:51 [PULL v2 00/58] virtio,acpi,pci: features, fixes, cleanups, tests Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 01/58] msix: allow qword MSI-X table accesses Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 02/58] diffs-allowed: add the SRAT AML to diffs-allowed Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 03/58] hw/acpi/nvdimm: add a helper to augment SRAT generation Michael S. Tsirkin
2020-06-12 14:51   ` Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 04/58] tests/acpi: update expected SRAT files Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 05/58] qtest: allow DSDT acpi table changes Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 06/58] acpi: move aml builder code for rtc device Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 07/58] acpi: rtc: use a single crs range Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 08/58] acpi: serial: don't use _STA method Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 09/58] acpi: move aml builder code for serial device Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 10/58] acpi: parallel: don't use _STA method Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 11/58] acpi: move aml builder code for parallel device Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 12/58] tests/acpi: update DSDT expected files Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 13/58] acpi: tpm: Do not build TCPA table for TPM 2 Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 14/58] acpi: Convert build_tpm2() to build_append* API Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 15/58] acpi: Move build_tpm2() in the generic part Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 16/58] arm/acpi: TPM2 ACPI table support Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 17/58] test/tpm-emu: include sockets and channel headers in tpm-emu header Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 18/58] tests/acpi: Add void tables for Q35/TPM-TIS bios-tables-test Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 19/58] tests: tpm-emu: Remove assert on TPM2_ST_NO_SESSIONS Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 20/58] bios-tables-test: Add Q35/TPM-TIS test Michael S. Tsirkin
2020-06-15 10:02   ` Philippe Mathieu-Daudé
2020-06-15 10:22     ` Thomas Huth
2020-06-15 12:35       ` Auger Eric
2020-06-15 12:58         ` Thomas Huth
2020-06-12 14:51 ` [PULL v2 21/58] bios-tables-test: Generate reference tables for Q35/TPM-TIS Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 22/58] virtio-balloon: fix free page hinting without an iothread Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 23/58] virtio-balloon: fix free page hinting check on unrealize Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 24/58] virtio-balloon: unref the iothread when unrealizing Michael S. Tsirkin
2020-06-12 14:51 ` [PULL v2 25/58] virtio-balloon: Implement support for page poison reporting feature Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 26/58] virtio-balloon: Provide an interface for free page reporting Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 27/58] MAINTAINERS: Fix the classification of bios-tables-test-allowed-diff.h Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 28/58] hw/pci/pcie: Move hot plug capability check to pre_plug callback Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 29/58] pci: assert configuration access is within bounds Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 30/58] hw/pci-host/prep: Correct RAVEN bus bridge memory region size Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 31/58] hw/pci/pci_bridge: Correct pci_bridge_io " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 32/58] hw/pci/pci_bridge: Use the IEC binary prefix definitions Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 33/58] hw/pci-host: " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 34/58] char-socket: return -1 in case of disconnect during tcp_chr_write Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 35/58] vhost-user-blk: delay vhost_user_blk_disconnect Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 36/58] Add helper to populate vhost-user message regions Michael S. Tsirkin
2020-06-19 12:59   ` Peter Maydell
2020-06-12 14:52 ` [PULL v2 37/58] Add vhost-user helper to get MemoryRegion data Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 38/58] Add VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 39/58] Transmit vhost-user memory regions individually Michael S. Tsirkin
2020-06-19 13:02   ` Peter Maydell
2020-06-22 18:51     ` Raphael Norwitz
2020-06-12 14:52 ` [PULL v2 40/58] Lift max memory slots limit imposed by vhost-user Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 41/58] Refactor out libvhost-user fault generation logic Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 42/58] Support ram slot configuration in libvhost-user Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 43/58] Support adding individual regions " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 44/58] Support individual region unmap " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 45/58] Lift max ram slots limit " Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 46/58] libvhost-user: advertise vring features Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 47/58] hw/pci: Fix crash when running QEMU with "-nic model=rocker" Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 48/58] vhost-vsock: add vhost-vsock-common abstraction Michael S. Tsirkin
2020-06-12 14:52 ` Michael S. Tsirkin [this message]
2020-06-12 14:52 ` [PULL v2 50/58] virtio: add vhost-user-vsock-pci device Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 51/58] acpi: make build_madt() more generic Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 52/58] acpi: create acpi-common.c and move madt code Michael S. Tsirkin
2020-06-12 14:52 ` [PULL v2 53/58] acpi: madt: skip pci override on pci-less systems Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 54/58] acpi: fadt: add hw-reduced sleep register support Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 55/58] acpi: ged: rename event memory region Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 56/58] Fix parameter type in vhost migration log path Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 57/58] pci: Display PCI IRQ pin in "info pci" Michael S. Tsirkin
2020-06-12 14:53 ` [PULL v2 58/58] virtio-pci: fix queue_enable write Michael S. Tsirkin
2020-06-12 15:51 ` [PULL v2 00/58] virtio, acpi, pci: features, fixes, cleanups, tests no-reply
2020-06-12 16:11   ` Michael S. Tsirkin
2020-06-12 22:01 ` Peter Maydell
2020-06-16  7:26 ` Auger Eric
2020-06-16  7:43   ` Auger Eric

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=20200612141917.9446-50-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=sgarzare@redhat.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 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.