From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id EDA46A054F; Tue, 18 Feb 2020 15:35:34 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C561A1C133; Tue, 18 Feb 2020 15:35:31 +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 67DEB1C132 for ; Tue, 18 Feb 2020 15:35:30 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1582036529; 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=VzIhRtKFBdvrQuL+dNpwQ2S4FwVOjrNth1NOMdLTi3c=; b=ASM50aGsGv8HsBlpyaRmzgHc7+99m0rL57igAiPQ9TPOfg7wsXcSKpml/LVNBHTKVenkcx ZVQL2l2wWHqSGYseQnlFCcmxnTMMXJMfXnPfSc9ve231ybYWC+wIqGn1nIMw2F/WnxLzBS A88JPHTl93CmV3lSjfOvEJ9PKcSx58c= 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-223-JzDFmHdvNgOLKUAAtbnAgw-1; Tue, 18 Feb 2020 09:35:25 -0500 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 1FB57800D5E; Tue, 18 Feb 2020 14:35:24 +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 8D8E6863CC; Tue, 18 Feb 2020 14:35:22 +0000 (UTC) From: Maxime Coquelin To: dev@dpdk.org, oda@valinux.co.jp, yinan.wang@intel.com, tiwei.bie@intel.com, amorenoz@redhat.com Cc: Maxime Coquelin Date: Tue, 18 Feb 2020 15:35:13 +0100 Message-Id: <20200218143514.553307-2-maxime.coquelin@redhat.com> In-Reply-To: <20200218143514.553307-1-maxime.coquelin@redhat.com> References: <20200218143514.553307-1-maxime.coquelin@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-MC-Unique: JzDFmHdvNgOLKUAAtbnAgw-1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable 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 --- 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..c0056bc8bf 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) =20 =09list =3D rte_zmalloc_socket(name, sizeof(*list), 0, numa_node); =09if (list =3D=3D NULL) -=09=09goto error; +=09=09return -1; =20 =09vring_state =3D rte_zmalloc_socket(name, sizeof(*vring_state), =09=09=09=09=09 0, numa_node); =09if (vring_state =3D=3D NULL) -=09=09goto error; +=09=09goto free_list; =20 =09list->eth_dev =3D eth_dev; =09pthread_mutex_lock(&internal_list_lock); @@ -894,30 +894,37 @@ vhost_driver_setup(struct rte_eth_dev *eth_dev) =09vring_states[eth_dev->data->port_id] =3D vring_state; =20 =09if (rte_vhost_driver_register(internal->iface_name, internal->flags)) -=09=09goto error; +=09=09goto list_remove; =20 =09if (internal->disable_flags) { =09=09if (rte_vhost_driver_disable_features(internal->iface_name, =09=09=09=09=09=09 internal->disable_flags)) -=09=09=09goto error; +=09=09=09goto drv_unreg; =09} =20 =09if (rte_vhost_driver_callback_register(internal->iface_name, =09=09=09=09=09 &vhost_ops) < 0) { =09=09VHOST_LOG(ERR, "Can't register callbacks\n"); -=09=09goto error; +=09=09goto drv_unreg; =09} =20 =09if (rte_vhost_driver_start(internal->iface_name) < 0) { =09=09VHOST_LOG(ERR, "Failed to start driver for %s\n", =09=09=09 internal->iface_name); -=09=09goto error; +=09=09goto drv_unreg; =09} =20 =09return 0; =20 -error: +drv_unreg: +=09rte_vhost_driver_unregister(internal->iface_name); +list_remove: +=09pthread_mutex_lock(&internal_list_lock); +=09TAILQ_REMOVE(&internal_list, list, next); +=09pthread_mutex_unlock(&internal_list_lock); +=09vring_states[eth_dev->data->port_id] =3D NULL; =09rte_free(vring_state); +free_list: =09rte_free(list); =20 =09return -1; --=20 2.24.1