From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id F3CA8460E2; Tue, 28 Jan 2025 02:35:12 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id E047540150; Tue, 28 Jan 2025 02:35:12 +0100 (CET) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id 08BD240144; Tue, 28 Jan 2025 02:35:12 +0100 (CET) Received: by linux.microsoft.com (Postfix, from userid 1202) id 253D32037171; Mon, 27 Jan 2025 17:35:11 -0800 (PST) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 253D32037171 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1738028111; bh=l06wyMMaWAaAYr2DdfDoFnxRas0sLblImLaanlmFk40=; h=From:To:Cc:Subject:Date:From; b=CaTayD+lY8auf8lEE/7zXUiw9ySZ5b7VIwYObOMjTX3TgEf+MaR2FIleSv6olfXFD mx1y/sAeuzsQdFsF7jYof/dZnorKeSqDG14tZXuNWnR+t0OkOQNwNSJmPh+Qewn83E Imt1D7w2zVMvHShZiQzmA88NPScSBLUwyIHTy3HE= From: longli@linuxonhyperv.com To: Ferruh Yigit , Andrew Rybchenko , Wei Hu Cc: dev@dpdk.org, Long Li , stable@dpdk.org Subject: [PATCH 1/4] net/netvsc: scan all net devices under the PCI device Date: Mon, 27 Jan 2025 17:35:03 -0800 Message-Id: <1738028106-25239-1-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org From: Long Li The current code has the wrong assumption that a PCI device can have only one Ethernet device. This is not correct as a PCI device can be multi functional and have multiple Ethernet devices. Fix this by scanning all the devices under a PCI device. Fixes: a2a23a794b3a ("net/netvsc: support VF device hot add/remove") Cc: stable@dpdk.org Signed-off-by: Long Li --- drivers/net/netvsc/hn_ethdev.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/drivers/net/netvsc/hn_ethdev.c b/drivers/net/netvsc/hn_ethdev.c index 1736cb5d07..f848157b49 100644 --- a/drivers/net/netvsc/hn_ethdev.c +++ b/drivers/net/netvsc/hn_ethdev.c @@ -570,7 +570,7 @@ static void netvsc_hotplug_retry(void *args) struct rte_devargs *d = &hot_ctx->da; char buf[256]; - DIR *di; + DIR *di = NULL; struct dirent *dir; struct ifreq req; struct rte_ether_addr eth_addr; @@ -590,7 +590,9 @@ static void netvsc_hotplug_retry(void *args) if (!di) { PMD_DRV_LOG(DEBUG, "%s: can't open directory %s, " "retrying in 1 second", __func__, buf); - goto retry; + /* The device is still being initialized, retry after 1 second */ + rte_eal_alarm_set(1000000, netvsc_hotplug_retry, hot_ctx); + return; } while ((dir = readdir(di))) { @@ -614,10 +616,9 @@ static void netvsc_hotplug_retry(void *args) dir->d_name); break; } - if (req.ifr_hwaddr.sa_family != ARPHRD_ETHER) { - closedir(di); - goto free_hotadd_ctx; - } + if (req.ifr_hwaddr.sa_family != ARPHRD_ETHER) + continue; + memcpy(eth_addr.addr_bytes, req.ifr_hwaddr.sa_data, RTE_DIM(eth_addr.addr_bytes)); @@ -636,22 +637,16 @@ static void netvsc_hotplug_retry(void *args) PMD_DRV_LOG(ERR, "Failed to add PCI device %s", d->name); - break; } + + break; } - /* When the code reaches here, we either have already added - * the device, or its MAC address did not match. - */ - closedir(di); - goto free_hotadd_ctx; } - closedir(di); -retry: - /* The device is still being initialized, retry after 1 second */ - rte_eal_alarm_set(1000000, netvsc_hotplug_retry, hot_ctx); - return; free_hotadd_ctx: + if (di) + closedir(di); + rte_spinlock_lock(&hv->hotadd_lock); LIST_REMOVE(hot_ctx, list); rte_spinlock_unlock(&hv->hotadd_lock); -- 2.34.1