From patchwork Tue Jul 21 16:38:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matan Azrad X-Patchwork-Id: 74583 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 5ACE3A0526; Tue, 21 Jul 2020 18:38:29 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3F3461C025; Tue, 21 Jul 2020 18:38:29 +0200 (CEST) Received: from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129]) by dpdk.org (Postfix) with ESMTP id 9E0C11C010 for ; Tue, 21 Jul 2020 18:38:27 +0200 (CEST) Received: from Internal Mail-Server by MTLPINE1 (envelope-from matan@mellanox.com) with SMTP; 21 Jul 2020 19:38:23 +0300 Received: from pegasus24.mtr.labs.mlnx (pegasus24.mtr.labs.mlnx [10.210.16.8]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 06LGcMWE005836; Tue, 21 Jul 2020 19:38:22 +0300 From: Matan Azrad To: Maxime Coquelin Cc: dev@dpdk.org, Ferruh Yigit , chenbo.xia@intel.com, david.marchand@redhat.com, thomas@monjalon.net Date: Tue, 21 Jul 2020 16:38:16 +0000 Message-Id: <20200721163816.15057-1-matan@mellanox.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <1595175493-21497-1-git-send-email-matan@mellanox.com> References: <1595175493-21497-1-git-send-email-matan@mellanox.com> Subject: [dpdk-dev] [PATCH v2] net/vhost: support queue update X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" The commit below changed the readiness condition of vhost device to fix multi-queues issues showed with QEMU versions. Now, the vhost device is ready when the first queue-pair is ready. When more queues are being ready, the queue state callback will be triggered to notify the vhost manager. In case of Rx interrupt configuration, the vhost driver set the kickfd queue file descriptor in order to be notified on Rx traffic. So, when queue becomes ready, the kickfd may be changed and should be updated in the Rx interrupt structure. Update kickfd when the queue state callback is invoked. Also update event notification when it is enabled by the user. Fixes: d0fcc38f5fa4 ("vhost: improve device readiness notifications") Signed-off-by: Matan Azrad Reviewed-by: Maxime Coquelin --- drivers/net/vhost/rte_eth_vhost.c | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 9fbf39f66b..bbf79b2c0e 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -94,6 +94,7 @@ struct vhost_queue { struct rte_mempool *mb_pool; uint16_t port; uint16_t virtqueue_id; + bool intr_en; struct vhost_stats stats; }; @@ -546,6 +547,8 @@ eth_rxq_intr_enable(struct rte_eth_dev *dev, uint16_t qid) rte_vhost_enable_guest_notification(vq->vid, (qid << 1) + 1, 1); rte_wmb(); + vq->intr_en = true; + return ret; } @@ -571,6 +574,8 @@ eth_rxq_intr_disable(struct rte_eth_dev *dev, uint16_t qid) rte_vhost_enable_guest_notification(vq->vid, (qid << 1) + 1, 0); rte_wmb(); + vq->intr_en = false; + return 0; } @@ -830,6 +835,45 @@ destroy_device(int vid) _rte_eth_dev_callback_process(eth_dev, RTE_ETH_EVENT_INTR_LSC, NULL); } +static int +vring_conf_update(int vid, struct rte_eth_dev *eth_dev, uint16_t vring_id) +{ + struct rte_eth_conf *dev_conf = ð_dev->data->dev_conf; + struct pmd_internal *internal = eth_dev->data->dev_private; + struct rte_vhost_vring vring; + struct vhost_queue *vq; + int rx_idx = vring_id % 2 ? (vring_id - 1) >> 1 : -1; + int ret = 0; + + /* + * The vring kickfd may be changed after the new device notification. + * Update it when the vring state is updated. + */ + if (rx_idx >= 0 && rx_idx < eth_dev->data->nb_rx_queues && + rte_atomic32_read(&internal->dev_attached) && + rte_atomic32_read(&internal->started) && + dev_conf->intr_conf.rxq) { + vq = eth_dev->data->rx_queues[rx_idx]; + ret = rte_vhost_get_vhost_vring(vid, vring_id, &vring); + if (!ret) { + if (vring.kickfd != + eth_dev->intr_handle->efds[rx_idx]) { + VHOST_LOG(INFO, + "kickfd for rxq-%d was changed.\n", + rx_idx); + eth_dev->intr_handle->efds[rx_idx] = + vring.kickfd; + } + + rte_vhost_enable_guest_notification(vid, vring_id, + vq->intr_en); + rte_wmb(); + } + } + + return ret; +} + static int vring_state_changed(int vid, uint16_t vring, int enable) { @@ -848,6 +892,11 @@ vring_state_changed(int vid, uint16_t vring, int enable) eth_dev = list->eth_dev; /* won't be NULL */ state = vring_states[eth_dev->data->port_id]; + + if (enable && vring_conf_update(vid, eth_dev, vring)) + VHOST_LOG(INFO, "Failed to update vring-%d configuration.\n", + (int)vring); + rte_spinlock_lock(&state->lock); if (state->cur[vring] == enable) { rte_spinlock_unlock(&state->lock);