]> git.droids-corp.org - dpdk.git/commitdiff
net/virtio-user: support vhost status setting
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Wed, 5 Aug 2020 14:45:15 +0000 (16:45 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 18 Sep 2020 16:55:12 +0000 (18:55 +0200)
This patch adds support for VHOST_USER_SET_STATUS
request. It is used to make the backend aware of
Virtio devices status update.

It is useful for the backend to know when the Virtio
driver is done with the Virtio device configuration.

Reviewed-by: Chenbo Xia <chenbo.xia@intel.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
drivers/net/virtio/virtio_user/vhost.h
drivers/net/virtio/virtio_user/vhost_user.c
drivers/net/virtio/virtio_user/virtio_user_dev.c
drivers/net/virtio/virtio_user/virtio_user_dev.h
drivers/net/virtio/virtio_user_ethdev.c

index 260e1c3081971892b850a1daa8c0ffe19e75b4a8..8f49ef45742ddb1c05ccd95eb4f546e9ecd95451 100644 (file)
@@ -57,6 +57,10 @@ struct vhost_vring_addr {
 #define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
 #endif
 
+#ifndef VHOST_USER_PROTOCOL_F_STATUS
+#define VHOST_USER_PROTOCOL_F_STATUS 16
+#endif
+
 enum vhost_user_request {
        VHOST_USER_NONE = 0,
        VHOST_USER_GET_FEATURES = 1,
@@ -77,6 +81,8 @@ enum vhost_user_request {
        VHOST_USER_SET_PROTOCOL_FEATURES = 16,
        VHOST_USER_GET_QUEUE_NUM = 17,
        VHOST_USER_SET_VRING_ENABLE = 18,
+       VHOST_USER_SET_STATUS = 39,
+       VHOST_USER_GET_STATUS = 40,
        VHOST_USER_MAX
 };
 
index ad48bafd482ccf86bd4aee4d123a9f4be3cc544a..337e511990b73cd059cea3400e76538350100530 100644 (file)
@@ -244,6 +244,8 @@ const char * const vhost_msg_strings[] = {
        [VHOST_USER_SET_VRING_ENABLE] = "VHOST_SET_VRING_ENABLE",
        [VHOST_USER_GET_PROTOCOL_FEATURES] = "VHOST_USER_GET_PROTOCOL_FEATURES",
        [VHOST_USER_SET_PROTOCOL_FEATURES] = "VHOST_USER_SET_PROTOCOL_FEATURES",
+       [VHOST_USER_SET_STATUS] = "VHOST_SET_STATUS",
+       [VHOST_USER_GET_STATUS] = "VHOST_GET_STATUS",
 };
 
 static int
@@ -280,6 +282,14 @@ vhost_user_sock(struct virtio_user_dev *dev,
                need_reply = 1;
                break;
 
+       case VHOST_USER_SET_STATUS:
+               if (!(dev->protocol_features &
+                               (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
+                       return 0;
+
+               if (has_reply_ack)
+                       msg.flags |= VHOST_USER_NEED_REPLY_MASK;
+               /* Fallthrough */
        case VHOST_USER_SET_FEATURES:
        case VHOST_USER_SET_PROTOCOL_FEATURES:
        case VHOST_USER_SET_LOG_BASE:
index 0a6991bcc8167cfbbd5eca218002d6d39c310441..670fc9d40df06e9bacf13e0ac77b703322c2609f 100644 (file)
@@ -424,7 +424,8 @@ virtio_user_dev_setup(struct virtio_user_dev *dev)
 
 #define VIRTIO_USER_SUPPORTED_PROTOCOL_FEATURES                \
        (1ULL << VHOST_USER_PROTOCOL_F_MQ |             \
-        1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK)
+        1ULL << VHOST_USER_PROTOCOL_F_REPLY_ACK |      \
+        1ULL << VHOST_USER_PROTOCOL_F_STATUS)
 
 int
 virtio_user_dev_init(struct virtio_user_dev *dev, char *path, int queues,
@@ -783,3 +784,26 @@ virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx)
                __atomic_add_fetch(&vring->used->idx, 1, __ATOMIC_RELAXED);
        }
 }
+
+int
+virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status)
+{
+       int ret;
+       uint64_t arg = status;
+
+       /* Vhost-user only for now */
+       if (!is_vhost_user_by_type(dev->path))
+               return 0;
+
+       if (!(dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)))
+               return 0;
+
+       ret = dev->ops->send_request(dev, VHOST_USER_SET_STATUS, &arg);
+       if (ret) {
+               PMD_INIT_LOG(ERR, "VHOST_USER_SET_STATUS failed (%d): %s", ret,
+                            strerror(errno));
+               return -1;
+       }
+
+       return 0;
+}
index 554174e819a054a210de122adc259967327193f3..835ab64ae4bd2b270a0eb7e868375afc12915fe5 100644 (file)
@@ -72,4 +72,5 @@ void virtio_user_handle_cq(struct virtio_user_dev *dev, uint16_t queue_idx);
 void virtio_user_handle_cq_packed(struct virtio_user_dev *dev,
                                  uint16_t queue_idx);
 uint8_t virtio_user_handle_mq(struct virtio_user_dev *dev, uint16_t q_pairs);
+int virtio_user_send_status_update(struct virtio_user_dev *dev, uint8_t status);
 #endif
index 6003f6d50f6360a711054f7d2524651af7fff70e..785882e062ce32ed1725429e3af081385a4d2da1 100644 (file)
@@ -272,6 +272,7 @@ virtio_user_set_status(struct virtio_hw *hw, uint8_t status)
        else if (status == VIRTIO_CONFIG_STATUS_RESET)
                virtio_user_reset(hw);
        dev->status = status;
+       virtio_user_send_status_update(dev, status);
 }
 
 static uint8_t