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 60296A04B4; Sat, 2 May 2020 09:42:27 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CDD7A1D957; Sat, 2 May 2020 09:42:25 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id B35BD1D951 for ; Sat, 2 May 2020 09:42:24 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 0427e4KA009104; Sat, 2 May 2020 00:42:23 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-type; s=pfpt0818; bh=s4BxIk6MFk0OEPcboi+Og9n6ZxWptPD/yTSrNSdnYUY=; b=n07arFF+sYOBoUXVd5r5VsO+Hm0sWNVNUvc6gnX6E5lpDNwqMk5kcXZwUMWRObCoafcB NQTV1kicQRMOXF8u8cGJxbhCGPQSqztZ9YQqCIs4KDyPvRdDuZ6dGDw4ytpe6iyvsIFF ixRWnoeSZdaRIn5WwmD6FriispxhgMDAQuYRpluKe3ilyItkBC5p+FWz21XfuapYNLyA 6DQehVF6gUGfW0Lcdv4gQVfpB9KFSyj9itz0xF3kpRaHxSg5FT4Q4GLT/8EVLj4wSIPc QC5i/RvrvijcOi2E/3OTXS6tjgvCnv/FXBlHVCoIgSwO2FBnd+ykmkSDjE9y52YKnhdj fg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 30r7em6gd9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sat, 02 May 2020 00:42:23 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sat, 2 May 2020 00:42:21 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sat, 2 May 2020 00:42:22 -0700 Received: from localhost.localdomain (unknown [10.28.34.200]) by maili.marvell.com (Postfix) with ESMTP id 4EEBC3F703F; Sat, 2 May 2020 00:42:20 -0700 (PDT) From: Sunil Kumar Kori To: , , , CC: , Sunil Kumar Kori Date: Sat, 2 May 2020 13:12:05 +0530 Message-ID: <20200502074205.29080-1-skori@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200501113909.26355-1-skori@marvell.com> References: <20200501113909.26355-1-skori@marvell.com> MIME-Version: 1.0 Content-Type: text/plain X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-05-02_04:2020-05-01, 2020-05-02 signatures=0 Subject: [dpdk-dev] [PATCH v5 1/1] bus/pci: optimise scanning with whitelist/blacklist 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" rte_bus_scan API scans all the available PCI devices irrespective of white or black listing parameters then further devices are probed based on white or black listing parameters. So unnecessary CPU cycles are wasted during rte_pci_scan. For Octeontx2 platform with core frequency 2.4 Ghz, rte_bus_scan consumes around 26ms to scan around 90 PCI devices but all may not be used by the application. So for the application which uses 2 NICs, rte_bus_scan consumes few microseconds and rest time is saved with this patch. Patch restricts devices to be scanned as per below mentioned conditions: - All devices will be scanned if no parameters are passed. - Only white listed devices will be scanned if white list is available. - All devices, except black listed, will be scanned if black list is available. Signed-off-by: Sunil Kumar Kori --- v5: - revert devargs->bus->parse changes. v4: - Review comments incorporated (Gaeten and David). - Rebased on top of tree. v3: - Remove __rte_experimental from private function. - Remove entry from map file too. v2: - Added function to validate ignorance of device based on PCI address. - Marked device validation function as experimental. drivers/bus/pci/bsd/pci.c | 12 +++++++++++- drivers/bus/pci/linux/pci.c | 3 +++ drivers/bus/pci/pci_common.c | 29 +++++++++-------------------- drivers/bus/pci/private.h | 11 +++++++++++ 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c index ebbfeb13a..6ec27b4b5 100644 --- a/drivers/bus/pci/bsd/pci.c +++ b/drivers/bus/pci/bsd/pci.c @@ -338,6 +338,7 @@ rte_pci_scan(void) .match_buf_len = sizeof(matches), .matches = &matches[0], }; + struct rte_pci_addr pci_addr; /* for debug purposes, PCI can be disabled */ if (!rte_eal_has_pci()) @@ -357,9 +358,18 @@ rte_pci_scan(void) goto error; } - for (i = 0; i < conf_io.num_matches; i++) + for (i = 0; i < conf_io.num_matches; i++) { + pci_addr.domain = matches[i].pc_sel.pc_domain; + pci_addr.bus = matches[i].pc_sel.pc_bus; + pci_addr.devid = matches[i].pc_sel.pc_dev; + pci_addr.function = matches[i].pc_sel.pc_func; + + if (rte_pci_ignore_device(&pci_addr)) + continue; + if (pci_scan_one(fd, &matches[i]) < 0) goto error; + } dev_count += conf_io.num_matches; } while(conf_io.status == PCI_GETCONF_MORE_DEVS); diff --git a/drivers/bus/pci/linux/pci.c b/drivers/bus/pci/linux/pci.c index ca783b157..da2f55b3a 100644 --- a/drivers/bus/pci/linux/pci.c +++ b/drivers/bus/pci/linux/pci.c @@ -487,6 +487,9 @@ rte_pci_scan(void) if (parse_pci_addr_format(e->d_name, sizeof(e->d_name), &addr) != 0) continue; + if (rte_pci_ignore_device(&addr)) + continue; + snprintf(dirname, sizeof(dirname), "%s/%s", rte_pci_get_sysfs_path(), e->d_name); diff --git a/drivers/bus/pci/pci_common.c b/drivers/bus/pci/pci_common.c index 3f5542076..5da11e4e2 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -42,14 +42,15 @@ const char *rte_pci_get_sysfs_path(void) return path; } -static struct rte_devargs *pci_devargs_lookup(struct rte_pci_device *dev) +static struct rte_devargs * +pci_devargs_lookup(const struct rte_pci_addr *pci_addr) { struct rte_devargs *devargs; struct rte_pci_addr addr; RTE_EAL_DEVARGS_FOREACH("pci", devargs) { devargs->bus->parse(devargs->name, &addr); - if (!rte_pci_addr_cmp(&dev->addr, &addr)) + if (!rte_pci_addr_cmp(pci_addr, &addr)) return devargs; } return NULL; @@ -63,7 +64,7 @@ pci_name_set(struct rte_pci_device *dev) /* Each device has its internal, canonical name set. */ rte_pci_device_name(&dev->addr, dev->name, sizeof(dev->name)); - devargs = pci_devargs_lookup(dev); + devargs = pci_devargs_lookup(&dev->addr); dev->device.devargs = devargs; /* In blacklist mode, if the device is not blacklisted, no * rte_devargs exists for it. @@ -293,23 +294,12 @@ rte_pci_probe(void) { struct rte_pci_device *dev = NULL; size_t probed = 0, failed = 0; - struct rte_devargs *devargs; - int probe_all = 0; int ret = 0; - if (rte_pci_bus.bus.conf.scan_mode != RTE_BUS_SCAN_WHITELIST) - probe_all = 1; - FOREACH_DEVICE_ON_PCIBUS(dev) { probed++; - devargs = dev->device.devargs; - /* probe all or only whitelisted devices */ - if (probe_all) - ret = pci_probe_all_drivers(dev); - else if (devargs != NULL && - devargs->policy == RTE_DEV_WHITELISTED) - ret = pci_probe_all_drivers(dev); + ret = pci_probe_all_drivers(dev); if (ret < 0) { if (ret != -EEXIST) { RTE_LOG(ERR, EAL, "Requested device " @@ -589,10 +579,10 @@ pci_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) return -1; } -static bool -pci_ignore_device(const struct rte_pci_device *dev) +bool +rte_pci_ignore_device(const struct rte_pci_addr *pci_addr) { - struct rte_devargs *devargs = dev->device.devargs; + struct rte_devargs *devargs = pci_devargs_lookup(pci_addr); switch (rte_pci_bus.bus.conf.scan_mode) { case RTE_BUS_SCAN_WHITELIST: @@ -627,8 +617,7 @@ rte_pci_get_iommu_class(void) if (iommu_no_va == -1) iommu_no_va = pci_device_iommu_support_va(dev) ? 0 : 1; - if (pci_ignore_device(dev)) - continue; + if (dev->kdrv == RTE_KDRV_UNKNOWN || dev->kdrv == RTE_KDRV_NONE) continue; diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index a205d4d9f..3a9da7322 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -42,6 +42,17 @@ int rte_pci_scan(void); void pci_name_set(struct rte_pci_device *dev); +/** + * Validate whether a device with given pci address should be ignored or not. + * + * @param pci_addr + * PCI address of device to be validated + * @return + * 1: if device is to be ignored, + * 0: if device is to be scanned, + */ +bool rte_pci_ignore_device(const struct rte_pci_addr *pci_addr); + /** * Add a PCI device to the PCI Bus (append to PCI Device list). This function * also updates the bus references of the PCI Device (and the generic device -- 2.17.1