From patchwork Tue Feb 18 17:22:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 65876 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 60498A054F; Tue, 18 Feb 2020 18:24:13 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1006B1C001; Tue, 18 Feb 2020 18:24:08 +0100 (CET) Received: from us-smtp-delivery-1.mimecast.com (us-smtp-2.mimecast.com [207.211.31.81]) by dpdk.org (Postfix) with ESMTP id 035D81C000 for ; Tue, 18 Feb 2020 18:24:06 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582046646; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=hx48P68VGw11SBRB3/eaLVMR3MnNl8z9dJXDkoXOBEY=; b=OrZA/kaEw3pdRwzP4+WJzsrP+BS5IYw44+UFAceLeg1iTW9lYn1YmY4BjNLr+9k5TM6VVC bHRr5s/fSLkzkY1jbeNMnwpVJi+nfjiUdkRWWXojX2qZllWNQaDMlM2lgCvQ1ks7TjWVhZ N1+QlhzqxNHn84XQybXXW60luvnoiD8= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-45-V-zyNwZlOUW3d5SeX59Naw-1; Tue, 18 Feb 2020 12:24:03 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 72DF8800D48; Tue, 18 Feb 2020 17:24:02 +0000 (UTC) Received: from localhost.localdomain (ovpn-112-45.ams2.redhat.com [10.36.112.45]) by smtp.corp.redhat.com (Postfix) with ESMTP id 8A4C22CC39; Tue, 18 Feb 2020 17:24:00 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, oda@valinux.co.jp, yinan.wang@intel.com, tiwei.bie@intel.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 18 Feb 2020 18:22:39 +0100 Message-Id: <20200218172240.558516-2-maxime.coquelin@redhat.com> In-Reply-To: <20200218172240.558516-1-maxime.coquelin@redhat.com> References: <20200218172240.558516-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-MC-Unique: V-zyNwZlOUW3d5SeX59Naw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH 1/2] net/vhost: fix Vhost setup error path 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" If for some reason vhost_driver_setup() fails, the list element for the device may be freed without being removed from the internal list of devices. This patch fixes all the error paths, by unregistering the device from Vhost library it has been registered, remove the device from the list, reset device vring_state pointer from the global table and only free vring state if it had been allocated. Fixes: 3d01b759d267 ("net/vhost: delay driver setup") Signed-off-by: Maxime Coquelin Reviewed-by: David Marchand Reviewed-by: Tiwei Bie --- drivers/net/vhost/rte_eth_vhost.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 90263ae77c..4a7b1b608c 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -878,12 +878,12 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev) list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); if (list == NULL) - goto error; + return -1; vring_state = rte_zmalloc_socket(name, sizeof(*vring_state), 0, numa_node); if (vring_state == NULL) - goto error; + goto free_list; list->eth_dev = eth_dev; pthread_mutex_lock(&internal_list_lock); @@ -894,30 +894,37 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev) vring_states[eth_dev->data->port_id] = vring_state; if (rte_vhost_driver_register(internal->iface_name, internal->flags)) - goto error; + goto list_remove; if (internal->disable_flags) { if (rte_vhost_driver_disable_features(internal->iface_name, internal->disable_flags)) - goto error; + goto drv_unreg; } if (rte_vhost_driver_callback_register(internal->iface_name, &vhost_ops) < 0) { VHOST_LOG(ERR, "Can't register callbacks\n"); - goto error; + goto drv_unreg; } if (rte_vhost_driver_start(internal->iface_name) < 0) { VHOST_LOG(ERR, "Failed to start driver for %s\n", internal->iface_name); - goto error; + goto drv_unreg; } return 0; -error: +drv_unreg: + rte_vhost_driver_unregister(internal->iface_name); +list_remove: + vring_states[eth_dev->data->port_id] = NULL; + pthread_mutex_lock(&internal_list_lock); + TAILQ_REMOVE(&internal_list, list, next); + pthread_mutex_unlock(&internal_list_lock); rte_free(vring_state); +free_list: rte_free(list); return -1; From patchwork Tue Feb 18 17:22:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maxime Coquelin X-Patchwork-Id: 65877 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 7562BA054F; Tue, 18 Feb 2020 18:24:22 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6E3E11C013; Tue, 18 Feb 2020 18:24:12 +0100 (CET) Received: from us-smtp-1.mimecast.com (us-smtp-delivery-1.mimecast.com [205.139.110.120]) by dpdk.org (Postfix) with ESMTP id 505381C012 for ; Tue, 18 Feb 2020 18:24:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582046649; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wSG2YArNm9HGkcJLaaZojZt6cvQWopfXkmiEHCqgu1s=; b=KnwtfarXzrvGlt06B9LEiziElqUJMeK+x7PIyWuI7dsiZPA/9BjNsZvJju2dKMCZ922C9b dnD5z8dmXa9pA4WhRQG/jDdBK0/45pE4eYhHjXuvAons4boZnbbh+bHeTaT4HVaF7VO72r C1mpY6xDuTt9USGynwg6/WxJBmZumhs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-50-YdhuBYybMd2RwV8IQgMLjw-1; Tue, 18 Feb 2020 12:24:06 -0500 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E45F5B3DA2; Tue, 18 Feb 2020 17:24:04 +0000 (UTC) Received: from localhost.localdomain (ovpn-112-45.ams2.redhat.com [10.36.112.45]) by smtp.corp.redhat.com (Postfix) with ESMTP id D2F355C13B; Tue, 18 Feb 2020 17:24:02 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, oda@valinux.co.jp, yinan.wang@intel.com, tiwei.bie@intel.com, amorenoz@redhat.com, david.marchand@redhat.com Cc: Maxime Coquelin Date: Tue, 18 Feb 2020 18:22:40 +0100 Message-Id: <20200218172240.558516-3-maxime.coquelin@redhat.com> In-Reply-To: <20200218172240.558516-1-maxime.coquelin@redhat.com> References: <20200218172240.558516-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-MC-Unique: YdhuBYybMd2RwV8IQgMLjw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Subject: [dpdk-dev] [PATCH 2/2] net/vhost: prevent multiple setup on reconfig 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" Ethdev's .dev_configure callback can be called multiple time during a device life-time, but Vhost makes the wrong assumption that it is not the case and try to setup again the device on reconfiguration. This patch ensures the device hasn't been already setup before proceeding. Fixes: 3d01b759d267 ("net/vhost: delay driver setup") Reported-by: Yinan Wang Signed-off-by: Maxime Coquelin Tested-by: Yinan Wang Reviewed-by: David Marchand Reviewed-by: Tiwei Bie --- drivers/net/vhost/rte_eth_vhost.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c index 4a7b1b608c..458ed58f5f 100644 --- a/drivers/net/vhost/rte_eth_vhost.c +++ b/drivers/net/vhost/rte_eth_vhost.c @@ -876,6 +876,11 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev) unsigned int numa_node = eth_dev->device->numa_node; const char *name = eth_dev->device->name; + /* Don't try to setup again if it has already been done. */ + list = find_internal_resource(internal->iface_name); + if (list) + return 0; + list = rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); if (list == NULL) return -1;