]> git.droids-corp.org - dpdk.git/commitdiff
vhost: support slave requests channel
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Thu, 5 Oct 2017 08:36:12 +0000 (10:36 +0200)
committerYuanhan Liu <yliu@fridaylinux.org>
Tue, 10 Oct 2017 13:52:27 +0000 (15:52 +0200)
Currently, only QEMU sends requests, the backend sends
replies. In some cases, the backend may need to send
requests to QEMU, like IOTLB miss events when IOMMU is
supported.

This patch introduces a new channel for such requests.
QEMU sends a file descriptor of a new socket using
VHOST_USER_SET_SLAVE_REQ_FD.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Yuanhan Liu <yliu@fridaylinux.org>
lib/librte_vhost/vhost.c
lib/librte_vhost/vhost.h
lib/librte_vhost/vhost_user.c
lib/librte_vhost/vhost_user.h

index 474b6e493960c4feb4fe07be823795c3428ab51e..2d30f14c4ca3364ddf9aa2b82e059763ce621974 100644 (file)
@@ -207,6 +207,7 @@ vhost_new_device(void)
 
        vhost_devices[i] = dev;
        dev->vid = i;
+       dev->slave_req_fd = -1;
 
        return i;
 }
index 74df747170d8b1f8e16c1188f21e6af2e4aeb916..8405f879b59ee72c38337c6a1cfe7b86ace55e16 100644 (file)
@@ -209,6 +209,8 @@ struct virtio_net {
        uint32_t                nr_guest_pages;
        uint32_t                max_guest_pages;
        struct guest_page       *guest_pages;
+
+       int                     slave_req_fd;
 } __rte_cache_aligned;
 
 
index a068d8651a7f7a664ff807dbaf9f003509e1c76f..0ba66e19349f7a623ac18b95f479905a8314b041 100644 (file)
@@ -76,6 +76,7 @@ static const char *vhost_message_str[VHOST_USER_MAX] = {
        [VHOST_USER_SET_VRING_ENABLE]  = "VHOST_USER_SET_VRING_ENABLE",
        [VHOST_USER_SEND_RARP]  = "VHOST_USER_SEND_RARP",
        [VHOST_USER_NET_SET_MTU]  = "VHOST_USER_NET_SET_MTU",
+       [VHOST_USER_SET_SLAVE_REQ_FD]  = "VHOST_USER_SET_SLAVE_REQ_FD",
 };
 
 static uint64_t
@@ -122,6 +123,11 @@ vhost_backend_cleanup(struct virtio_net *dev)
                munmap((void *)(uintptr_t)dev->log_addr, dev->log_size);
                dev->log_addr = 0;
        }
+
+       if (dev->slave_req_fd >= 0) {
+               close(dev->slave_req_fd);
+               dev->slave_req_fd = -1;
+       }
 }
 
 /*
@@ -886,6 +892,23 @@ vhost_user_net_set_mtu(struct virtio_net *dev, struct VhostUserMsg *msg)
        return 0;
 }
 
+static int
+vhost_user_set_req_fd(struct virtio_net *dev, struct VhostUserMsg *msg)
+{
+       int fd = msg->fds[0];
+
+       if (fd < 0) {
+               RTE_LOG(ERR, VHOST_CONFIG,
+                               "Invalid file descriptor for slave channel (%d)\n",
+                               fd);
+               return -1;
+       }
+
+       dev->slave_req_fd = fd;
+
+       return 0;
+}
+
 /* return bytes# of read on success or negative val on failure. */
 static int
 read_vhost_message(int sockfd, struct VhostUserMsg *msg)
@@ -1113,6 +1136,10 @@ vhost_user_msg_handler(int vid, int fd)
                ret = vhost_user_net_set_mtu(dev, &msg);
                break;
 
+       case VHOST_USER_SET_SLAVE_REQ_FD:
+               ret = vhost_user_set_req_fd(dev, &msg);
+               break;
+
        default:
                ret = -1;
                break;
index 2ba22dbb09fb70152cb560b5d7564ca3c4d49fb1..98f6e6f37d6da4d06957a046d2af6ece55683a6f 100644 (file)
 #define VHOST_USER_PROTOCOL_F_RARP     2
 #define VHOST_USER_PROTOCOL_F_REPLY_ACK        3
 #define VHOST_USER_PROTOCOL_F_NET_MTU 4
+#define VHOST_USER_PROTOCOL_F_SLAVE_REQ 5
 
 #define VHOST_USER_PROTOCOL_FEATURES   ((1ULL << VHOST_USER_PROTOCOL_F_MQ) | \
                                         (1ULL << VHOST_USER_PROTOCOL_F_LOG_SHMFD) |\
                                         (1ULL << VHOST_USER_PROTOCOL_F_RARP) | \
                                         (1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK) | \
-                                        (1ULL << VHOST_USER_PROTOCOL_F_NET_MTU))
+                                        (1ULL << VHOST_USER_PROTOCOL_F_NET_MTU) | \
+                                        (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_REQ))
 
 typedef enum VhostUserRequest {
        VHOST_USER_NONE = 0,
@@ -77,9 +79,15 @@ typedef enum VhostUserRequest {
        VHOST_USER_SET_VRING_ENABLE = 18,
        VHOST_USER_SEND_RARP = 19,
        VHOST_USER_NET_SET_MTU = 20,
+       VHOST_USER_SET_SLAVE_REQ_FD = 21,
        VHOST_USER_MAX
 } VhostUserRequest;
 
+typedef enum VhostUserSlaveRequest {
+       VHOST_USER_SLAVE_NONE = 0,
+       VHOST_USER_SLAVE_MAX
+} VhostUserSlaveRequest;
+
 typedef struct VhostUserMemoryRegion {
        uint64_t guest_phys_addr;
        uint64_t memory_size;