aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2017-10-16 10:22:39 +0100
committerPeter Maydell <peter.maydell@linaro.org>2017-10-16 10:22:39 +0100
commit40a1e8ac2e10155b5df13a2508ac080b00cd7e23 (patch)
tree891376c9ace90e648f1d78294e2840afb2d85bf8
parentf90ea7ba7c5ae7010ee0ce062207ae42530f57d6 (diff)
parent13384f158ce043744cf7542162a34953c7e05a70 (diff)
downloadqemu-40a1e8ac2e10155b5df13a2508ac080b00cd7e23.zip
qemu-40a1e8ac2e10155b5df13a2508ac080b00cd7e23.tar.gz
qemu-40a1e8ac2e10155b5df13a2508ac080b00cd7e23.tar.bz2
Merge remote-tracking branch 'remotes/elmarco/tags/vu-pull-request' into staging
# gpg: Signature made Thu 12 Oct 2017 21:52:28 BST # gpg: using RSA key 0xDAE8E10975969CE5 # gpg: Good signature from "Marc-André Lureau <marcandre.lureau@redhat.com>" # gpg: aka "Marc-André Lureau <marcandre.lureau@gmail.com>" # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: 87A9 BD93 3F87 C606 D276 F62D DAE8 E109 7596 9CE5 * remotes/elmarco/tags/vu-pull-request: libvhost-user: Support VHOST_USER_SET_SLAVE_REQ_FD libvhost-user: Update and fix feature and request lists vhost-user-bridge: Only process received packets on started queues libvhost-user: vu_queue_started Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--contrib/libvhost-user/libvhost-user.c43
-rw-r--r--contrib/libvhost-user/libvhost-user.h19
-rw-r--r--tests/vhost-user-bridge.c1
3 files changed, 56 insertions, 7 deletions
diff --git a/contrib/libvhost-user/libvhost-user.c b/contrib/libvhost-user/libvhost-user.c
index a0e0da4..f409bd3 100644
--- a/contrib/libvhost-user/libvhost-user.c
+++ b/contrib/libvhost-user/libvhost-user.c
@@ -56,16 +56,13 @@
} while (0)
static const char *
-vu_request_to_string(int req)
+vu_request_to_string(unsigned int req)
{
#define REQ(req) [req] = #req
static const char *vu_request_str[] = {
REQ(VHOST_USER_NONE),
REQ(VHOST_USER_GET_FEATURES),
REQ(VHOST_USER_SET_FEATURES),
- REQ(VHOST_USER_NONE),
- REQ(VHOST_USER_GET_FEATURES),
- REQ(VHOST_USER_SET_FEATURES),
REQ(VHOST_USER_SET_OWNER),
REQ(VHOST_USER_RESET_OWNER),
REQ(VHOST_USER_SET_MEM_TABLE),
@@ -83,7 +80,10 @@ vu_request_to_string(int req)
REQ(VHOST_USER_GET_QUEUE_NUM),
REQ(VHOST_USER_SET_VRING_ENABLE),
REQ(VHOST_USER_SEND_RARP),
- REQ(VHOST_USER_INPUT_GET_CONFIG),
+ REQ(VHOST_USER_NET_SET_MTU),
+ REQ(VHOST_USER_SET_SLAVE_REQ_FD),
+ REQ(VHOST_USER_IOTLB_MSG),
+ REQ(VHOST_USER_SET_VRING_ENDIAN),
REQ(VHOST_USER_MAX),
};
#undef REQ
@@ -726,7 +726,8 @@ vu_set_vring_err_exec(VuDev *dev, VhostUserMsg *vmsg)
static bool
vu_get_protocol_features_exec(VuDev *dev, VhostUserMsg *vmsg)
{
- uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD;
+ uint64_t features = 1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD |
+ 1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ;
if (dev->iface->get_protocol_features) {
features |= dev->iface->get_protocol_features(dev);
@@ -780,6 +781,23 @@ vu_set_vring_enable_exec(VuDev *dev, VhostUserMsg *vmsg)
}
static bool
+vu_set_slave_req_fd(VuDev *dev, VhostUserMsg *vmsg)
+{
+ if (vmsg->fd_num != 1) {
+ vu_panic(dev, "Invalid slave_req_fd message (%d fd's)", vmsg->fd_num);
+ return false;
+ }
+
+ if (dev->slave_fd != -1) {
+ close(dev->slave_fd);
+ }
+ dev->slave_fd = vmsg->fds[0];
+ DPRINT("Got slave_fd: %d\n", vmsg->fds[0]);
+
+ return false;
+}
+
+static bool
vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
{
int do_reply = 0;
@@ -842,6 +860,8 @@ vu_process_message(VuDev *dev, VhostUserMsg *vmsg)
return vu_get_queue_num_exec(dev, vmsg);
case VHOST_USER_SET_VRING_ENABLE:
return vu_set_vring_enable_exec(dev, vmsg);
+ case VHOST_USER_SET_SLAVE_REQ_FD:
+ return vu_set_slave_req_fd(dev, vmsg);
case VHOST_USER_NONE:
break;
default:
@@ -915,6 +935,10 @@ vu_deinit(VuDev *dev)
vu_close_log(dev);
+ if (dev->slave_fd != -1) {
+ close(dev->slave_fd);
+ dev->slave_fd = -1;
+ }
if (dev->sock != -1) {
close(dev->sock);
@@ -945,6 +969,7 @@ vu_init(VuDev *dev,
dev->remove_watch = remove_watch;
dev->iface = iface;
dev->log_call_fd = -1;
+ dev->slave_fd = -1;
for (i = 0; i < VHOST_MAX_NR_VIRTQUEUE; i++) {
dev->vq[i] = (VuVirtq) {
.call_fd = -1, .kick_fd = -1, .err_fd = -1,
@@ -966,6 +991,12 @@ vu_queue_enabled(VuDev *dev, VuVirtq *vq)
return vq->enable;
}
+bool
+vu_queue_started(const VuDev *dev, const VuVirtq *vq)
+{
+ return vq->started;
+}
+
static inline uint16_t
vring_avail_flags(VuVirtq *vq)
{
diff --git a/contrib/libvhost-user/libvhost-user.h b/contrib/libvhost-user/libvhost-user.h
index 5825b66..2f5864b 100644
--- a/contrib/libvhost-user/libvhost-user.h
+++ b/contrib/libvhost-user/libvhost-user.h
@@ -34,6 +34,10 @@ enum VhostUserProtocolFeature {
VHOST_USER_PROTOCOL_F_MQ = 0,
VHOST_USER_PROTOCOL_F_LOG_SHMFD = 1,
VHOST_USER_PROTOCOL_F_RARP = 2,
+ VHOST_USER_PROTOCOL_F_REPLY_ACK = 3,
+ VHOST_USER_PROTOCOL_F_NET_MTU = 4,
+ VHOST_USER_PROTOCOL_F_SLAVE_REQ = 5,
+ VHOST_USER_PROTOCOL_F_CROSS_ENDIAN = 6,
VHOST_USER_PROTOCOL_F_MAX
};
@@ -61,7 +65,10 @@ typedef enum VhostUserRequest {
VHOST_USER_GET_QUEUE_NUM = 17,
VHOST_USER_SET_VRING_ENABLE = 18,
VHOST_USER_SEND_RARP = 19,
- VHOST_USER_INPUT_GET_CONFIG = 20,
+ VHOST_USER_NET_SET_MTU = 20,
+ VHOST_USER_SET_SLAVE_REQ_FD = 21,
+ VHOST_USER_IOTLB_MSG = 22,
+ VHOST_USER_SET_VRING_ENDIAN = 23,
VHOST_USER_MAX
} VhostUserRequest;
@@ -219,6 +226,7 @@ struct VuDev {
VuDevRegion regions[VHOST_MEMORY_MAX_NREGIONS];
VuVirtq vq[VHOST_MAX_NR_VIRTQUEUE];
int log_call_fd;
+ int slave_fd;
uint64_t log_size;
uint8_t *log_table;
uint64_t features;
@@ -335,6 +343,15 @@ void vu_queue_set_notification(VuDev *dev, VuVirtq *vq, int enable);
bool vu_queue_enabled(VuDev *dev, VuVirtq *vq);
/**
+ * vu_queue_started:
+ * @dev: a VuDev context
+ * @vq: a VuVirtq queue
+ *
+ * Returns: whether the queue is started.
+ */
+bool vu_queue_started(const VuDev *dev, const VuVirtq *vq);
+
+/**
* vu_queue_empty:
* @dev: a VuDev context
* @vq: a VuVirtq queue
diff --git a/tests/vhost-user-bridge.c b/tests/vhost-user-bridge.c
index f922cc7..d820033 100644
--- a/tests/vhost-user-bridge.c
+++ b/tests/vhost-user-bridge.c
@@ -277,6 +277,7 @@ vubr_backend_recv_cb(int sock, void *ctx)
DPRINT(" hdrlen = %d\n", hdrlen);
if (!vu_queue_enabled(dev, vq) ||
+ !vu_queue_started(dev, vq) ||
!vu_queue_avail_bytes(dev, vq, hdrlen, 0)) {
DPRINT("Got UDP packet, but no available descriptors on RX virtq.\n");
return;