[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 11/16] vhost-user: add asynchronous read for the
From: |
Wei Wang |
Subject: |
[Qemu-devel] [PATCH v2 11/16] vhost-user: add asynchronous read for the vhost-user master |
Date: |
Fri, 12 May 2017 16:35:43 +0800 |
Enable the vhost-user master to asynchronously receive messages
from the slave. The vhost_user_asyn_read and vhost_user_can_read
stub functions are defined for platforms that do not support the
use of virtio.
Signed-off-by: Wei Wang <address@hidden>
---
hw/virtio/Makefile.objs | 6 +++---
hw/virtio/vhost-stub.c | 11 +++++++++++
hw/virtio/vhost-user.c | 42 +++++++++++++++++++++++++++++++++++++++++-
include/hw/virtio/vhost-user.h | 4 ++++
include/net/vhost-user.h | 4 ++++
net/vhost-user.c | 23 ++++++++++++++++++++---
6 files changed, 83 insertions(+), 7 deletions(-)
diff --git a/hw/virtio/Makefile.objs b/hw/virtio/Makefile.objs
index 5e81f2f..59e826e 100644
--- a/hw/virtio/Makefile.objs
+++ b/hw/virtio/Makefile.objs
@@ -10,7 +10,7 @@ obj-$(CONFIG_LINUX) += vhost.o vhost-backend.o vhost-user.o
obj-$(CONFIG_VHOST_VSOCK) += vhost-vsock.o
obj-y += virtio-crypto.o
obj-$(CONFIG_VIRTIO_PCI) += virtio-crypto-pci.o
-endif
-
+else
common-obj-$(call lnot,$(CONFIG_LINUX)) += vhost-stub.o
-common-obj-$(CONFIG_ALL) += vhost-stub.o
+common-obj-y += vhost-stub.o
+endif
diff --git a/hw/virtio/vhost-stub.c b/hw/virtio/vhost-stub.c
index 2d76cde..e130791 100644
--- a/hw/virtio/vhost-stub.c
+++ b/hw/virtio/vhost-stub.c
@@ -1,7 +1,18 @@
#include "qemu/osdep.h"
#include "hw/virtio/vhost.h"
+#include "hw/virtio/vhost-user.h"
bool vhost_has_free_slot(void)
{
return true;
}
+
+void vhost_user_asyn_read(void *opaque, const uint8_t *buf, int size)
+{
+ return;
+}
+
+int vhost_user_can_read(void *opaque)
+{
+ return 0;
+}
diff --git a/hw/virtio/vhost-user.c b/hw/virtio/vhost-user.c
index ca8fe36..5d55ea1 100644
--- a/hw/virtio/vhost-user.c
+++ b/hw/virtio/vhost-user.c
@@ -14,7 +14,7 @@
#include "hw/virtio/vhost-backend.h"
#include "hw/virtio/vhost-user.h"
#include "hw/virtio/virtio-net.h"
-#include "sysemu/char.h"
+#include "net/vhost-user.h"
#include "sysemu/kvm.h"
#include "qemu/error-report.h"
#include "qemu/sockets.h"
@@ -75,6 +75,46 @@ fail:
return -1;
}
+int vhost_user_can_read(void *opaque)
+{
+ return VHOST_USER_HDR_SIZE;
+}
+
+void vhost_user_asyn_read(void *opaque, const uint8_t *buf, int size)
+{
+ const char *name = opaque;
+ VhostUserMsg msg;
+ uint8_t *p = (uint8_t *) &msg;
+ CharBackend *chr_be = net_name_to_chr_be(name);
+
+ if (size != VHOST_USER_HDR_SIZE) {
+ error_report("%s: wrong message size received %d", __func__, size);
+ return;
+ }
+
+ memcpy(p, buf, VHOST_USER_HDR_SIZE);
+
+ if (msg.size) {
+ p += VHOST_USER_HDR_SIZE;
+ size = qemu_chr_fe_read_all(chr_be, p, msg.size);
+ if (size != msg.size) {
+ error_report("%s: wrong message size %d != %d", __func__,
+ size, msg.size);
+ return;
+ }
+ }
+
+ if (msg.request > VHOST_USER_MAX) {
+ error_report("%s:incorrect msg %d", __func__, msg.request);
+ }
+
+ switch (msg.request) {
+ default:
+ error_report("%s: does not support msg %d", __func__, msg.request);
+ break;
+ }
+}
+
static int process_message_reply(struct vhost_dev *dev,
VhostUserRequest request)
{
diff --git a/include/hw/virtio/vhost-user.h b/include/hw/virtio/vhost-user.h
index 1fccbe2..eae5431 100644
--- a/include/hw/virtio/vhost-user.h
+++ b/include/hw/virtio/vhost-user.h
@@ -103,4 +103,8 @@ static VhostUserMsg m __attribute__ ((unused));
/* The version of the protocol we support */
#define VHOST_USER_VERSION (0x1)
+int vhost_user_can_read(void *opaque);
+
+void vhost_user_asyn_read(void *opaque, const uint8_t *buf, int size);
+
#endif
diff --git a/include/net/vhost-user.h b/include/net/vhost-user.h
index d9e328d..1bb5f1a 100644
--- a/include/net/vhost-user.h
+++ b/include/net/vhost-user.h
@@ -11,8 +11,12 @@
#ifndef NET_VHOST_USER_H
#define NET_VHOST_USER_H
+#include "sysemu/char.h"
+
struct vhost_net;
struct vhost_net *vhost_user_get_vhost_net(NetClientState *nc);
uint64_t vhost_user_get_acked_features(NetClientState *nc);
+CharBackend *net_name_to_chr_be(const char *name);
+
#endif /* VHOST_USER_H */
diff --git a/net/vhost-user.c b/net/vhost-user.c
index e7e6340..91ee146 100644
--- a/net/vhost-user.c
+++ b/net/vhost-user.c
@@ -12,7 +12,7 @@
#include "clients.h"
#include "net/vhost_net.h"
#include "net/vhost-user.h"
-#include "sysemu/char.h"
+#include "hw/virtio/vhost-user.h"
#include "qemu/config-file.h"
#include "qemu/error-report.h"
#include "qmp-commands.h"
@@ -221,6 +221,22 @@ static void chr_closed_bh(void *opaque)
}
}
+CharBackend *net_name_to_chr_be(const char *name)
+{
+ NetClientState *ncs[MAX_QUEUE_NUM];
+ VhostUserState *s;
+ int queues;
+
+ queues = qemu_find_net_clients_except(name, ncs,
+ NET_CLIENT_DRIVER_NIC,
+ MAX_QUEUE_NUM);
+ assert(queues < MAX_QUEUE_NUM);
+
+ s = DO_UPCAST(VhostUserState, nc, ncs[0]);
+
+ return &s->chr;
+}
+
static void net_vhost_user_event(void *opaque, int event)
{
const char *name = opaque;
@@ -307,8 +323,9 @@ static int net_vhost_user_init(NetClientState *peer, const
char *device,
error_report_err(err);
return -1;
}
- qemu_chr_fe_set_handlers(&s->chr, NULL, NULL,
- net_vhost_user_event, nc0->name, NULL, true);
+ qemu_chr_fe_set_handlers(&s->chr, vhost_user_can_read,
+ vhost_user_asyn_read, net_vhost_user_event,
+ nc0->name, NULL, true);
} while (!s->started);
assert(s->vhost_net);
--
2.7.4
- [Qemu-devel] [PATCH v2 02/16] vl: add the vhost-pci-slave command line option, (continued)
- [Qemu-devel] [PATCH v2 02/16] vl: add the vhost-pci-slave command line option, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 03/16] vhost-pci-slave: create a vhost-user slave to support vhost-pci, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 04/16] vhost-pci-net: add vhost-pci-net, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 07/16] vhost-user: send device id to the slave, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 05/16] vhost-pci-net-pci: add vhost-pci-net-pci, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 06/16] virtio: add inter-vm notification support, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 08/16] vhost-user: send guest physical address of virtqueues to the slave, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 09/16] vhost-user: send VHOST_USER_SET_VHOST_PCI_START/STOP, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 10/16] vhost-pci-net: send the negotiated feature bits to the master, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 11/16] vhost-user: add asynchronous read for the vhost-user master,
Wei Wang <=
- [Qemu-devel] [PATCH v2 12/16] vhost-user: handling VHOST_USER_SET_FEATURES, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 13/16] vhost-pci-slave: add "reset_virtio", Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 14/16] vhost-pci-slave: add support to delete a vhost-pci device, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 15/16] vhost-pci-net: tell the driver that it is ready to send packets, Wei Wang, 2017/05/12
- [Qemu-devel] [PATCH v2 16/16] vl: enable vhost-pci-slave, Wei Wang, 2017/05/12
- Re: [Qemu-devel] [PATCH v2 00/16] Vhost-pci for inter-VM communication, no-reply, 2017/05/12
- Re: [Qemu-devel] [PATCH v2 00/16] Vhost-pci for inter-VM communication, Jason Wang, 2017/05/16