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 A9BF3A0577; Tue, 7 Apr 2020 11:29:11 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7E4AD1BE80; Tue, 7 Apr 2020 11:29:09 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 7441D2BD8 for ; Tue, 7 Apr 2020 11:29:07 +0200 (CEST) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 0379Q1jK009923; Tue, 7 Apr 2020 02:29:06 -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=2wUWgEl7ezNJG1ysCjx/9dGTxzA4+gJVDeLNshzdOas=; b=Ig8HS8pZoncFWOE7fMe5ndR50mOzPNUkok8ok0f7I56MUhHA21vaVjnDH8twdqb+bjgc lU1uaKY6B0HVeh4vQWxap/k3FQsDnVE4CfSqXV4jc3k4SjPhtWO3sDbc/kaX8fBsyMEG Mel3J9Itu6BRpfswiEgxwyhAvU50s1DYgGYjWUER1fspbL5mfLKbjNyjUf/w6dGas6Q4 OCqwLDczOqHHry/svXUECNhFlM8mWcSWiYhklpjfSZJzneun7oJdch+PpB89FYYwUUXM CzXYyFcpG4gbrEUwmkAVF3WCUyeC0SFr1Fy+YK5PSVQlCpIm/edZFRuUq4uFVt7yCujW hA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 306srm9jg4-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Tue, 07 Apr 2020 02:29:06 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 7 Apr 2020 02:29:04 -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; Tue, 7 Apr 2020 02:29:04 -0700 Received: from localhost.localdomain (unknown [10.28.34.200]) by maili.marvell.com (Postfix) with ESMTP id 9002B3F704D; Tue, 7 Apr 2020 02:29:02 -0700 (PDT) From: Sunil Kumar Kori To: , , CC: , Sunil Kumar Kori Date: Tue, 7 Apr 2020 14:58:56 +0530 Message-ID: <20200407092856.554-1-skori@marvell.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191216075501.15669-1-skori@marvell.com> References: <20191216075501.15669-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-04-07_01:2020-04-07, 2020-04-07 signatures=0 Subject: [dpdk-dev] [PATCH v2 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 --- v2: - Added function to validate ignorance of device based on PCI address. - Marked device validation function as experimental. drivers/bus/pci/bsd/pci.c | 15 ++++++++++- drivers/bus/pci/linux/pci.c | 3 +++ drivers/bus/pci/pci_common.c | 34 +++++++++++++++++++++++++ drivers/bus/pci/private.h | 12 +++++++++ drivers/bus/pci/rte_bus_pci_version.map | 5 ++++ 5 files changed, 68 insertions(+), 1 deletion(-) diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c index ebbfeb13a..074f4556e 100644 --- a/drivers/bus/pci/bsd/pci.c +++ b/drivers/bus/pci/bsd/pci.c @@ -338,6 +338,9 @@ rte_pci_scan(void) .match_buf_len = sizeof(matches), .matches = &matches[0], }; + struct rte_pci_addr pci_addr; + + memset(&pci_addr, 0, sizeof(struct rte_pci_addr)); /* for debug purposes, PCI can be disabled */ if (!rte_eal_has_pci()) @@ -357,9 +360,19 @@ 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; + + /* Check that device should be ignored or not */ + if (pci_addr_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 71b0a3053..92bdad826 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 (pci_addr_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..a350a1993 100644 --- a/drivers/bus/pci/pci_common.c +++ b/drivers/bus/pci/pci_common.c @@ -589,6 +589,40 @@ pci_dma_unmap(struct rte_device *dev, void *addr, uint64_t iova, size_t len) return -1; } +static struct rte_devargs * +pci_addr_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(pci_addr, &addr)) + return devargs; + } + return NULL; +} + +bool +pci_addr_ignore_device(const struct rte_pci_addr *pci_addr) +{ + struct rte_devargs *devargs = pci_addr_devargs_lookup(pci_addr); + + switch (rte_pci_bus.bus.conf.scan_mode) { + case RTE_BUS_SCAN_WHITELIST: + if (devargs && devargs->policy == RTE_DEV_WHITELISTED) + return false; + break; + case RTE_BUS_SCAN_UNDEFINED: + case RTE_BUS_SCAN_BLACKLIST: + if (devargs == NULL || + devargs->policy != RTE_DEV_BLACKLISTED) + return false; + break; + } + return true; +} + static bool pci_ignore_device(const struct rte_pci_device *dev) { diff --git a/drivers/bus/pci/private.h b/drivers/bus/pci/private.h index a205d4d9f..25075b806 100644 --- a/drivers/bus/pci/private.h +++ b/drivers/bus/pci/private.h @@ -42,6 +42,18 @@ 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, + */ +__rte_experimental +bool pci_addr_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 diff --git a/drivers/bus/pci/rte_bus_pci_version.map b/drivers/bus/pci/rte_bus_pci_version.map index 012d817e1..da4ae2640 100644 --- a/drivers/bus/pci/rte_bus_pci_version.map +++ b/drivers/bus/pci/rte_bus_pci_version.map @@ -16,3 +16,8 @@ DPDK_20.0 { local: *; }; + +EXPERIMENTAL { + # added in 20.05 + pci_addr_ignore_device; +}; -- 2.17.1