From patchwork Tue Mar 27 16:05:26 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: junjie.j.chen@intel.com X-Patchwork-Id: 36561 X-Patchwork-Delegate: maxime.coquelin@redhat.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 86EF32A62; Tue, 27 Mar 2018 10:27:05 +0200 (CEST) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by dpdk.org (Postfix) with ESMTP id DF8B3DE0 for ; Tue, 27 Mar 2018 10:27:03 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Mar 2018 01:27:02 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.48,366,1517904000"; d="scan'208";a="211622779" Received: from dpdk-dev.sh.intel.com ([10.67.111.147]) by orsmga005.jf.intel.com with ESMTP; 27 Mar 2018 01:27:01 -0700 From: Junjie Chen To: jianfeng.tan@intel.com, maxime.coquelin@redhat.com, mtetsuyah@gmail.com Cc: dev@dpdk.org, Junjie Chen Date: Tue, 27 Mar 2018 12:05:26 -0400 Message-Id: <1522166726-42025-1-git-send-email-junjie.j.chen@intel.com> X-Mailer: git-send-email 2.0.1 Subject: [dpdk-dev] [PATCH] net/vhost: fix segfault when creating vdev dynamically 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" when creating vdev dynamically, vhost pmd driver start directly without checking TX/RX queues ready or not, and thus cause segmentation fault when vhost library accessing queues. This patch add flag to check whether queues setup or not, and add driver start call into dev_start to allow user start it after setting up queue. Fixes: aed0b12930b33("net/vhost: fix socket file deleted on stop") Signed-off-by: Junjie Chen --- drivers/net/vhost/rte_eth_vhost.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 3aae01c..719a150 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -118,6 +118,7 @@ struct pmd_internal { char *iface_name; uint16_t max_queues; rte_atomic32_t started; + rte_atomic32_t once; }; struct internal_list { @@ -772,12 +773,24 @@ rte_eth_vhost_get_vid_from_port_id(uint16_t port_id) static int eth_dev_start(struct rte_eth_dev *dev) { + int ret = 0; struct pmd_internal *internal = dev->data->dev_private; + if (unlikely(rte_atomic32_read(&internal->once) == 0)) { + ret = rte_vhost_driver_start(internal->iface_name); + if (ret < 0) { + RTE_LOG(ERR, PMD, "Failed to start driver for %s\n", + internal->iface_name); + return ret; + } + + rte_atomic32_set(&internal->once, 1); + } + rte_atomic32_set(&internal->started, 1); update_queuing_status(dev); - return 0; + return ret; } static void @@ -1101,7 +1114,11 @@ eth_dev_vhost_create(struct rte_vdev_device *dev, char *iface_name, goto error; } - if (rte_vhost_driver_start(iface_name) < 0) { + if (!data->rx_queues || !data->tx_queues) { + RTE_LOG(INFO, PMD, + "TX/RX queue is not ready, driver will not start\n"); + rte_atomic32_set(&internal->once, 0); + } else if (rte_vhost_driver_start(iface_name) < 0) { RTE_LOG(ERR, PMD, "Failed to start driver for %s\n", iface_name); goto error;