From: Adrian Moreno <amorenoz@redhat.com> To: dev@dpdk.org, chenbo.xia@intel.com, xiaolong.ye@intel.com, shahafs@mellanox.com, matan@mellanox.com, maxime.coquelin@redhat.com, xiao.w.wang@intel.com, viacheslavo@mellanox.com Cc: jasowang@redhat.com, lulu@redhat.com Subject: [dpdk-dev] [PATCH v3 5/8] vhost: add support for virtio status Date: Mon, 6 Jul 2020 13:24:49 +0200 Message-ID: <20200706112452.1474533-6-amorenoz@redhat.com> (raw) In-Reply-To: <20200706112452.1474533-1-amorenoz@redhat.com> From: Maxime Coquelin <maxime.coquelin@redhat.com> This patch adds support to the new Virtio device status Vhost-user protocol feature. Getting such information in the backend helps to know when the driver is done with the device configuration and so makes the initialization phase more robust. Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com> --- lib/librte_vhost/rte_vhost.h | 4 ++++ lib/librte_vhost/vhost.h | 9 +++++++ lib/librte_vhost/vhost_user.c | 45 ++++++++++++++++++++++++++++++++++- lib/librte_vhost/vhost_user.h | 6 +++-- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/lib/librte_vhost/rte_vhost.h b/lib/librte_vhost/rte_vhost.h index 8a5c332c8..104e2e869 100644 --- a/lib/librte_vhost/rte_vhost.h +++ b/lib/librte_vhost/rte_vhost.h @@ -102,6 +102,10 @@ extern "C" { #define VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD 12 #endif +#ifndef VHOST_USER_PROTOCOL_F_STATUS +#define VHOST_USER_PROTOCOL_F_STATUS 16 +#endif + /** Indicate whether protocol features negotiation is supported. */ #ifndef VHOST_USER_F_PROTOCOL_FEATURES #define VHOST_USER_F_PROTOCOL_FEATURES 30 diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 034463699..25d31c71b 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -204,6 +204,14 @@ struct vhost_virtqueue { TAILQ_HEAD(, vhost_iotlb_entry) iotlb_pending_list; } __rte_cache_aligned; +/* Virtio device status as per Virtio specification */ +#define VIRTIO_DEVICE_STATUS_ACK 0x01 +#define VIRTIO_DEVICE_STATUS_DRIVER 0x02 +#define VIRTIO_DEVICE_STATUS_DRIVER_OK 0x04 +#define VIRTIO_DEVICE_STATUS_FEATURES_OK 0x08 +#define VIRTIO_DEVICE_STATUS_DEV_NEED_RESET 0x40 +#define VIRTIO_DEVICE_STATUS_FAILED 0x80 + #define VHOST_MAX_VRING 0x100 #define VHOST_MAX_QUEUE_PAIRS 0x80 @@ -349,6 +357,7 @@ struct virtio_net { uint64_t log_addr; struct rte_ether_addr mac; uint16_t mtu; + uint8_t status; struct vhost_device_ops const *notify_ops; diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c index bf079c914..8d3d13913 100644 --- a/lib/librte_vhost/vhost_user.c +++ b/lib/librte_vhost/vhost_user.c @@ -87,6 +87,7 @@ static const char *vhost_message_str[VHOST_USER_MAX] = { [VHOST_USER_POSTCOPY_END] = "VHOST_USER_POSTCOPY_END", [VHOST_USER_GET_INFLIGHT_FD] = "VHOST_USER_GET_INFLIGHT_FD", [VHOST_USER_SET_INFLIGHT_FD] = "VHOST_USER_SET_INFLIGHT_FD", + [VHOST_USER_SET_STATUS] = "VHOST_USER_SET_STATUS", }; static int send_vhost_reply(int sockfd, struct VhostUserMsg *msg); @@ -1350,6 +1351,11 @@ virtio_is_ready(struct virtio_net *dev) return 0; } + /* If supported, ensure the frontend is really done with config */ + if (dev->protocol_features & (1ULL << VHOST_USER_PROTOCOL_F_STATUS)) + if (!(dev->status & VIRTIO_DEVICE_STATUS_DRIVER_OK)) + return 0; + dev->flags |= VIRTIO_DEV_READY; if (!(dev->flags & VIRTIO_DEV_RUNNING)) @@ -2452,6 +2458,42 @@ vhost_user_postcopy_end(struct virtio_net **pdev, struct VhostUserMsg *msg, return RTE_VHOST_MSG_RESULT_REPLY; } +static int +vhost_user_set_status(struct virtio_net **pdev, struct VhostUserMsg *msg, + int main_fd __rte_unused) +{ + struct virtio_net *dev = *pdev; + + if (validate_msg_fds(msg, 0) != 0) + return RTE_VHOST_MSG_RESULT_ERR; + + /* As per Virtio specification, the device status is 8bits long */ + if (msg->payload.u64 > UINT8_MAX) { + VHOST_LOG_CONFIG(ERR, "Invalid VHOST_USER_SET_STATUS payload 0x%" PRIx64 "\n", + msg->payload.u64); + return RTE_VHOST_MSG_RESULT_ERR; + } + + dev->status = msg->payload.u64; + + VHOST_LOG_CONFIG(INFO, "New device status(0x%08x):\n" + "\t-ACKNOWLEDGE: %u\n" + "\t-DRIVER: %u\n" + "\t-FEATURES_OK: %u\n" + "\t-DRIVER_OK: %u\n" + "\t-DEVICE_NEED_RESET: %u\n" + "\t-FAILED: %u\n", + dev->status, + !!(dev->status & VIRTIO_DEVICE_STATUS_ACK), + !!(dev->status & VIRTIO_DEVICE_STATUS_DRIVER), + !!(dev->status & VIRTIO_DEVICE_STATUS_FEATURES_OK), + !!(dev->status & VIRTIO_DEVICE_STATUS_DRIVER_OK), + !!(dev->status & VIRTIO_DEVICE_STATUS_DEV_NEED_RESET), + !!(dev->status & VIRTIO_DEVICE_STATUS_FAILED)); + + return RTE_VHOST_MSG_RESULT_OK; +} + typedef int (*vhost_message_handler_t)(struct virtio_net **pdev, struct VhostUserMsg *msg, int main_fd); @@ -2484,6 +2526,7 @@ static vhost_message_handler_t vhost_message_handlers[VHOST_USER_MAX] = { [VHOST_USER_POSTCOPY_END] = vhost_user_postcopy_end, [VHOST_USER_GET_INFLIGHT_FD] = vhost_user_get_inflight_fd, [VHOST_USER_SET_INFLIGHT_FD] = vhost_user_set_inflight_fd, + [VHOST_USER_SET_STATUS] = vhost_user_set_status, }; /* return bytes# of read on success or negative val on failure. */ @@ -2851,7 +2894,7 @@ vhost_user_msg_handler(int vid, int fd) if (!(dev->flags & VIRTIO_DEV_VDPA_CONFIGURED)) { if (vdpa_dev->ops->dev_conf(dev->vid)) VHOST_LOG_CONFIG(ERR, - "Failed to configure vDPA device\n") + "Failed to configure vDPA device\n"); else dev->flags |= VIRTIO_DEV_VDPA_CONFIGURED; } diff --git a/lib/librte_vhost/vhost_user.h b/lib/librte_vhost/vhost_user.h index 1f65efa4a..82885ab5e 100644 --- a/lib/librte_vhost/vhost_user.h +++ b/lib/librte_vhost/vhost_user.h @@ -23,7 +23,8 @@ (1ULL << VHOST_USER_PROTOCOL_F_CRYPTO_SESSION) | \ (1ULL << VHOST_USER_PROTOCOL_F_SLAVE_SEND_FD) | \ (1ULL << VHOST_USER_PROTOCOL_F_HOST_NOTIFIER) | \ - (1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT)) + (1ULL << VHOST_USER_PROTOCOL_F_PAGEFAULT) | \ + (1ULL << VHOST_USER_PROTOCOL_F_STATUS)) typedef enum VhostUserRequest { VHOST_USER_NONE = 0, @@ -56,7 +57,8 @@ typedef enum VhostUserRequest { VHOST_USER_POSTCOPY_END = 30, VHOST_USER_GET_INFLIGHT_FD = 31, VHOST_USER_SET_INFLIGHT_FD = 32, - VHOST_USER_MAX = 33 + VHOST_USER_SET_STATUS = 39, + VHOST_USER_MAX = 41 } VhostUserRequest; typedef enum VhostUserSlaveRequest { -- 2.26.2
next prev parent reply other threads:[~2020-07-06 11:26 UTC|newest] Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-07-06 11:24 [dpdk-dev] [PATCH (v20.08) v3 0/8] vhost: improve Vhost/vDPA device init Adrian Moreno 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 1/8] vhost: fix virtio ready flag check Adrian Moreno 2020-07-07 3:21 ` Xia, Chenbo 2020-07-08 14:22 ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 2/8] vhost: refactor Virtio ready check Adrian Moreno 2020-07-07 3:21 ` Xia, Chenbo 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 3/8] vhost: make some vDPA callbacks mandatory Adrian Moreno 2020-07-07 3:21 ` Xia, Chenbo 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 4/8] vhost: check vDPA configuration succeed Adrian Moreno 2020-07-07 3:22 ` Xia, Chenbo 2020-07-08 13:20 ` Ferruh Yigit 2020-07-06 11:24 ` Adrian Moreno [this message] 2020-07-07 3:22 ` [dpdk-dev] [PATCH v3 5/8] vhost: add support for virtio status Xia, Chenbo 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 6/8] vhost: add support for virtio get status message Adrian Moreno 2020-07-07 3:22 ` Xia, Chenbo 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 7/8] vdpa/ifc: enable status protocol feature Adrian Moreno 2020-07-07 3:22 ` Xia, Chenbo 2020-07-06 11:24 ` [dpdk-dev] [PATCH v3 8/8] vdpa/mlx5: " Adrian Moreno 2020-07-07 3:23 ` Xia, Chenbo
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20200706112452.1474533-6-amorenoz@redhat.com \ --to=amorenoz@redhat.com \ --cc=chenbo.xia@intel.com \ --cc=dev@dpdk.org \ --cc=jasowang@redhat.com \ --cc=lulu@redhat.com \ --cc=matan@mellanox.com \ --cc=maxime.coquelin@redhat.com \ --cc=shahafs@mellanox.com \ --cc=viacheslavo@mellanox.com \ --cc=xiao.w.wang@intel.com \ --cc=xiaolong.ye@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
DPDK patches and discussions This inbox may be cloned and mirrored by anyone: git clone --mirror https://inbox.dpdk.org/dev/0 dev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 dev dev/ https://inbox.dpdk.org/dev \ dev@dpdk.org public-inbox-index dev Example config snippet for mirrors. Newsgroup available over NNTP: nntp://inbox.dpdk.org/inbox.dpdk.dev AGPL code for this site: git clone https://public-inbox.org/public-inbox.git