]> git.droids-corp.org - dpdk.git/commitdiff
vhost: support postcopy end request
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Fri, 12 Oct 2018 12:40:44 +0000 (14:40 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 18 Oct 2018 08:24:39 +0000 (10:24 +0200)
The master sends this message before stopping handling
userfaults, so that the backend closes the userfaultfd.

The master waits for the slave to acknowledge the request
with an empty 64bits payload for synchronization purpose.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
lib/librte_vhost/vhost_user.c
lib/librte_vhost/vhost_user.h

index 8890abbe899697206bcf75212dfba818dfa30255..0560f2f967ff8dfbea43f8852cd684a8e8bf7b3e 100644 (file)
@@ -77,6 +77,7 @@ static const char *vhost_message_str[VHOST_USER_MAX] = {
        [VHOST_USER_CRYPTO_CLOSE_SESS] = "VHOST_USER_CRYPTO_CLOSE_SESS",
        [VHOST_USER_POSTCOPY_ADVISE]  = "VHOST_USER_POSTCOPY_ADVISE",
        [VHOST_USER_POSTCOPY_LISTEN]  = "VHOST_USER_POSTCOPY_LISTEN",
+       [VHOST_USER_POSTCOPY_END]  = "VHOST_USER_POSTCOPY_END",
 };
 
 static int send_vhost_reply(int sockfd, struct VhostUserMsg *msg);
@@ -1636,6 +1637,25 @@ vhost_user_set_postcopy_listen(struct virtio_net **pdev,
        return VH_RESULT_OK;
 }
 
+static int
+vhost_user_postcopy_end(struct virtio_net **pdev, struct VhostUserMsg *msg,
+                       int main_fd __rte_unused)
+{
+       struct virtio_net *dev = *pdev;
+
+       dev->postcopy_listening = 0;
+       if (dev->postcopy_ufd >= 0) {
+               close(dev->postcopy_ufd);
+               dev->postcopy_ufd = -1;
+       }
+
+       msg->payload.u64 = 0;
+       msg->size = sizeof(msg->payload.u64);
+       msg->fd_num = 0;
+
+       return VH_RESULT_REPLY;
+}
+
 typedef int (*vhost_message_handler_t)(struct virtio_net **pdev,
                                        struct VhostUserMsg *msg,
                                        int main_fd);
@@ -1665,6 +1685,7 @@ static vhost_message_handler_t vhost_message_handlers[VHOST_USER_MAX] = {
        [VHOST_USER_IOTLB_MSG] = vhost_user_iotlb_msg,
        [VHOST_USER_POSTCOPY_ADVISE] = vhost_user_set_postcopy_advise,
        [VHOST_USER_POSTCOPY_LISTEN] = vhost_user_set_postcopy_listen,
+       [VHOST_USER_POSTCOPY_END] = vhost_user_postcopy_end,
 };
 
 
index 55d8659ba3be40489e3e3704420e77ffb4508131..73b1fe2b98bb86de9035dab0e3d9527709aa3a29 100644 (file)
@@ -52,7 +52,8 @@ typedef enum VhostUserRequest {
        VHOST_USER_CRYPTO_CLOSE_SESS = 27,
        VHOST_USER_POSTCOPY_ADVISE = 28,
        VHOST_USER_POSTCOPY_LISTEN = 29,
-       VHOST_USER_MAX = 30
+       VHOST_USER_POSTCOPY_END = 30,
+       VHOST_USER_MAX = 31
 } VhostUserRequest;
 
 typedef enum VhostUserSlaveRequest {