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 A16D942A73; Sat, 6 May 2023 03:32:21 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id F340342D29; Sat, 6 May 2023 03:32:20 +0200 (CEST) Received: from linux.microsoft.com (linux.microsoft.com [13.77.154.182]) by mails.dpdk.org (Postfix) with ESMTP id A8E1B40EDC; Sat, 6 May 2023 03:32:19 +0200 (CEST) Received: by linux.microsoft.com (Postfix, from userid 1004) id CC96120EA296; Fri, 5 May 2023 18:32:18 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com CC96120EA296 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linuxonhyperv.com; s=default; t=1683336738; bh=e5GYsSCrKGLj/92cjUgVcrZVBUxeE6hAhczWD6RxJcc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jk23GeFguGt2oXySn4PiDs9W1zGv35l168CCxBvni6HOjegZM6/0/DdxBjafgE+9E sSBiUJnN6kxVJIWu7HPG8ysw3p2Z0yGquTQU2YEK+3NFDf0HAUE7TvQcNlRJyhuHD4 VYdVoA68vPGPBmaolTohQd1Lo3Qu6pxjgwJzsm4A= From: longli@linuxonhyperv.com To: Ferruh Yigit , Andrew Rybchenko Cc: dev@dpdk.org, Ajay Sharma , Long Li , stable@dpdk.org Subject: [PATCH v2] net/mana: return probe failure if there is no device found Date: Fri, 5 May 2023 18:32:10 -0700 Message-Id: <1683336730-19353-1-git-send-email-longli@linuxonhyperv.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1682561915-7204-1-git-send-email-longli@linuxonhyperv.com> References: <1682561915-7204-1-git-send-email-longli@linuxonhyperv.com> 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 When there is no device found on this PCI device, return probe failure and release allocated resources for this PCI device. Fixes: 517ed6e2d590 ("net/mana: add basic driver with build environment") Cc: stable@dpdk.org Signed-off-by: Long Li --- Change log v2: fixed typo drivers/net/mana/mana.c | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/drivers/net/mana/mana.c b/drivers/net/mana/mana.c index 2463f34c1e..7630118d4f 100644 --- a/drivers/net/mana/mana.c +++ b/drivers/net/mana/mana.c @@ -1343,6 +1343,7 @@ mana_probe_port(struct ibv_device *ibdev, struct ibv_device_attr_ex *dev_attr, /* * Goes through the IB device list to look for the IB port matching the * mac_addr. If found, create a rte_eth_dev for it. + * Return value: number of successfully probed devices */ static int mana_pci_probe_mac(struct rte_pci_device *pci_dev, @@ -1352,8 +1353,9 @@ mana_pci_probe_mac(struct rte_pci_device *pci_dev, int ibv_idx; struct ibv_context *ctx; int num_devices; - int ret = 0; + int ret; uint8_t port; + int count = 0; ibv_list = ibv_get_device_list(&num_devices); for (ibv_idx = 0; ibv_idx < num_devices; ibv_idx++) { @@ -1383,6 +1385,12 @@ mana_pci_probe_mac(struct rte_pci_device *pci_dev, ret = ibv_query_device_ex(ctx, NULL, &dev_attr); ibv_close_device(ctx); + if (ret) { + DRV_LOG(ERR, "Failed to query IB device %s", + ibdev->name); + continue; + } + for (port = 1; port <= dev_attr.orig_attr.phys_port_cnt; port++) { struct rte_ether_addr addr; @@ -1394,15 +1402,17 @@ mana_pci_probe_mac(struct rte_pci_device *pci_dev, continue; ret = mana_probe_port(ibdev, &dev_attr, port, pci_dev, &addr); - if (ret) + if (ret) { DRV_LOG(ERR, "Probe on IB port %u failed %d", port, ret); - else + } else { + count++; DRV_LOG(INFO, "Successfully probed on IB port %u", port); + } } } ibv_free_device_list(ibv_list); - return ret; + return count; } /* @@ -1416,6 +1426,7 @@ mana_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, struct mana_conf conf = {0}; unsigned int i; int ret; + int count = 0; if (args && args->drv_str) { ret = mana_parse_args(args, &conf); @@ -1433,16 +1444,21 @@ mana_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, } /* If there are no driver parameters, probe on all ports */ - if (!conf.index) - return mana_pci_probe_mac(pci_dev, NULL); + if (conf.index) { + for (i = 0; i < conf.index; i++) + count += mana_pci_probe_mac(pci_dev, + &conf.mac_array[i]); + } else { + count = mana_pci_probe_mac(pci_dev, NULL); + } - for (i = 0; i < conf.index; i++) { - ret = mana_pci_probe_mac(pci_dev, &conf.mac_array[i]); - if (ret) - return ret; + if (!count) { + rte_memzone_free(mana_shared_mz); + mana_shared_mz = NULL; + ret = -ENODEV; } - return 0; + return ret; } static int @@ -1475,6 +1491,7 @@ mana_pci_remove(struct rte_pci_device *pci_dev) if (!mana_shared_data->primary_cnt) { DRV_LOG(DEBUG, "free shared memezone data"); rte_memzone_free(mana_shared_mz); + mana_shared_mz = NULL; } rte_spinlock_unlock(&mana_shared_data_lock); -- 2.34.1