From nobody Tue Jun 30 01:44:54 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3457CC433F5 for ; Fri, 28 Jan 2022 04:51:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346088AbiA1Evw (ORCPT ); Thu, 27 Jan 2022 23:51:52 -0500 Received: from mail-bn7nam10on2087.outbound.protection.outlook.com ([40.107.92.87]:40033 "EHLO NAM10-BN7-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S233856AbiA1Evv (ORCPT ); Thu, 27 Jan 2022 23:51:51 -0500 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Y3eSArA+uQIc7xm0WYIyOr3C3Kqe3fPj/654j4zYIumr6EwFpKqtUXxLYgWMluj/SyS3n157GuqtCwNAMETB5WrwfgMPjddxBnWkuC4ECJiGQomzCNySx8t4XvH7udZ5BTkBZCnRDI0hyf5zyDFUyOBYdhX7aW0+af3qs0RgPOdYV5cqs3P4kdChWU0xzSIPPhRFqU6BOfy9MJQ6YnXsAMNQa/QT1Bd5gOccsnCqWUIY7goMAGgzLkYHeNtAfYmmaU4uyvFwQFr46g2Nw8eJybcWn7Up67S9yg+tn8KdrbjSxKadH65v4l2eL8sWsUOJKGUa1yNsYsFAAJnQ+vpGkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xRmuRZQ7taDj5dm61nEZcfulTYLHCRrh/RenQj2h47s=; b=eoWs4gU9ED1TXVIToR1iuCa9M2YWlMVyokWs3Ir9qqRz77QJa64g7+T+EOxhmxK70tH2cdxofO7hv/GqgVW5uP4laesv4FkD/hamlbGMOOOxdoT62NWqFS9zpvXhXLMd9SHN0Xi2kQcHrPEHE/K9ie086UH8KNAkSnubpeuPnXo3qWR4BiBJhJ41xFCfI3hlTCVhwycmhExcQsj5rwpSHpB42zXrNkMrxr1EUySLEei52GI6APSeacu+QmPC/ckod4bX+hCTxUTR6yGbdGBYOV+h52L7Lal3xzUZ7utxKV5w/uVUlmErjWhq3zApF3Fgv9DoK75eM/eAPBAckEN4Lg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vmware.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xRmuRZQ7taDj5dm61nEZcfulTYLHCRrh/RenQj2h47s=; b=hzIL/40xjxrsYv5ND1ReWnB0LW50LVfPp9BM7CaWl7jvJxnY0kC8JbZ4M3VvWC97Bkvf5d02I3QLlSaWIQfUS0Jc+mcdhT5EnJe7sgdpxonrX7i8XSO6a7oqhyGp0N+Q8KLxV0SRTHr9hHc0HFffiZzxL7+4fDgghaVRA71PUnE= Received: from BY3PR05MB8497.namprd05.prod.outlook.com (2603:10b6:a03:3c8::23) by DM6PR05MB6922.namprd05.prod.outlook.com (2603:10b6:5:14e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4951.6; Fri, 28 Jan 2022 04:51:43 +0000 Received: from BY3PR05MB8497.namprd05.prod.outlook.com ([fe80::a1ad:f4ce:d76:96c1]) by BY3PR05MB8497.namprd05.prod.outlook.com ([fe80::a1ad:f4ce:d76:96c1%6]) with mapi id 15.20.4930.017; Fri, 28 Jan 2022 04:51:43 +0000 From: Vikash Bansal To: "bhelgaas@google.com" CC: "linux-pci@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "gregkh@linuxfoundation.org" , Srivatsa Bhat , "srivatsa@csail.mit.edu" , Alexey Makhalov , Srinidhi Rao , Vikash Bansal , Anish Swaminathan , Vasavi Sirnapalli , Ajay Kaher Subject: [PATCH v2] PCI: Speed up device init by parsing capabilities all at once Thread-Topic: [PATCH v2] PCI: Speed up device init by parsing capabilities all at once Thread-Index: AQHYFAK+oPrtukqCvUK9dsIHNG2zPA== Date: Fri, 28 Jan 2022 04:51:43 +0000 Message-ID: <2A631B59-B3BD-4B3C-9DDD-795B7843333B@vmware.com> Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Microsoft-MacOutlook/16.56.21121100 authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=vmware.com; x-ms-publictraffictype: Email x-ms-office365-filtering-correlation-id: e79883cf-c9f5-4cbf-07da-08d9e219e1a0 x-ms-traffictypediagnostic: DM6PR05MB6922:EE_ x-ld-processed: b39138ca-3cee-4b4a-a4d6-cd83d9dd62f0,ExtAddr x-ms-exchange-atpmessageproperties: SA|SL x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:8882; x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: IUuWvv2Iv55XVJQ/1+nR5OoHQj/UglvEqRILgp7P5h1iAiBLtZjLkl/GShKhz9GXiJy83xDqK3uSAE3QVvfz7qQxt8hZnhSeGZ9ERHwr6tjcibBNv+rYtDxTQNnDQssGG0aqFwaQonYR43lYLMrnedFJVvzrOjzbedBJCdETIQHUleFrfFr9tQWAgzLZPZuTyxu9Y0y6UswGX6n4bH69ADlpLi5/aH7bw5InaLuYU9W/t9/47byz5bCjXtmizfs59/M1Og+l27EX6Fo79BrSXwpqf9+Dxm36blCJWSFKDVxl1ejK2qrySwxtlIraznVwA/t14rA/r4gOoLgghquikBO0O5iqQS8tXfE+cBGjkBhcyzW8WbEtYujEg91DOtnX8LjddAdMs7bHTm4knm0PP8qAv5G8p5nLtrjYgNf6ylzHmejnG/+c+MckQwNm8NIkNNylkC6vPpW878a2jezWO5uO7QBhPSdyWb+HlLKhwmz5MSCcQ0A2BxqP7swVOlPT8LiK07E/YX4u3urSIPE6f/7IwDfCF9fHgLYO7XluA7/3wpu/u65sqQGoHoaPVTEDcwBXEj6dKwRb0Nzuz0V1HGBQleB4j8SrKvHEd1uj892Lt4+ovVG54pn8OUgSuTscepCUL3MphHkFAVFWmnPH8bedBoswupKVodNVF78md7AimGpYFxaoeIL7sauHxeRimqncicOcrX5AfgPcjgjdU/lc/KSwySfHCAsddkPa/58tYPrSb2Ss49aZ2us0Aibz x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BY3PR05MB8497.namprd05.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230001)(4636009)(366004)(8676002)(107886003)(8936002)(64756008)(66446008)(66556008)(66476007)(76116006)(186003)(66946007)(26005)(2616005)(2906002)(71200400001)(6916009)(316002)(54906003)(91956017)(4326008)(83380400001)(36756003)(5660300002)(33656002)(38070700005)(122000001)(38100700002)(55236004)(6486002)(86362001)(508600001)(6506007)(6512007)(45980500001)(20210929001);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?B?bDM5TUdTOXdyMUtOekdacW1uVXVnRXVRRWlhSDlpbW9XQWFsYmRqY3Z4Ymx6?= =?utf-8?B?bWtON2ZzVm4yZkFYeTl5UU8wU1A4cjFlNlBrR3hmK3F2SEZvOHRSLzJSaEhn?= =?utf-8?B?ZzRvQU40TTdkN2hZZzJPOWJlNE1sK1JNY0Y2RVdKbU1QU0VzdldicklrRDNW?= =?utf-8?B?Rk5FZTZYNHZNbG1xVnErbHFGMGxYakpUTWVzMlZPYkl4Zmh2T1JSRnpsU3Q4?= =?utf-8?B?dTNuNk91ZVJFNy8wbGRvZXpGbzZDMDNUd2VIV1pKMDM2bTViYUNEV0IyWUpy?= =?utf-8?B?NG85anlmZHNFbzhpOWw0TER5eHNoaGFKSXVEUCtjMWJjNXlMTU5DTjFJWDJ2?= =?utf-8?B?L1R6S1RHaG15Y003Zk9JenNwM3FCSVJKbjVsWWEvSFJ6RmtoVks2Qm5Wbmww?= =?utf-8?B?bjcxZU14RkhuSFRiM0Rxak9oOG8xaVdDc2gyUnlPWUNXTmE0UHJLL3dHVm9Q?= =?utf-8?B?WnJPcUY2TWVzQlFGUjlXdnNmb2lqUmVsRkxQbDZ5RGJhQXE2T0w5R3U4T3dY?= =?utf-8?B?dENzVXRBYXU2cHN3WGxDQVp6SUduU2g5VVM1UlhyZlJQdEJsY0dxelRvSjVK?= =?utf-8?B?L3lpd2pJQnh2NnhOWnlJTkJqN2IySkh1VDh4ek9HTWozcUZvRVBpamRRNVRZ?= =?utf-8?B?UDNHVGJCcktQeGtuWE5XUGNmS0NoeU5RbDg0Q0c3L3Z6eUZaTzhHaDZLblV4?= =?utf-8?B?SjBsOHF1TVQwczU3dUJNODRzZkQyZDcwMEIyUkFtc2x0dXlKcUcxbU5Hb04y?= =?utf-8?B?T25YKzhMbXl5ZEZ6WWVURkYzTFpQSXRRcTBRbjBFNDg4V1hWSFVCUU56bTJ3?= =?utf-8?B?Z0xDY1pDWjBRajZlUVVTdlJuTi9qNXIxalZ5NS9td3ZnOEdtVHAvM1RFYkZh?= =?utf-8?B?RVB4bTI0QVNFZGxWOWIrWTlOb1lMakQ5dWhBaVhHb1huQzF1Yjhmdjg1VTUr?= =?utf-8?B?NVZSVHNoM3RmYUtVT0s3WUxubXYrenNwWFZLeTI0SkZDcnZ4eXhQc0V5VmtF?= =?utf-8?B?ME0rTnlHSDBQYkxucDlwYWZtc05VYTVqTVo3clBmbm9GQ05pOVNVYmlpYXNn?= =?utf-8?B?YUlaTFp5cXJHYXZIaEJuay9oYUI3Q2lSNEJsL2V4alNYR3RXNlpBVmM1Sjdq?= =?utf-8?B?WERqakZlby83UklNNnM0cWhOZ3B3Y3BHbGkwa0FuZi85dE1ZNWo5TVh3VzYr?= =?utf-8?B?WlRpd29raUZ6UUc3N3N4TmtyQmZIa2NJVzh0ZitOVWxtV1BxTUJlTmxTc25Z?= =?utf-8?B?aFkwZzhtZTdtUmZjTFY5WFMyaEZnSHBkWXUzTG56K2ExVDVxZDYrejNFaS9Y?= =?utf-8?B?K25JV0ppNUJhWnJRWVVGNGxEcVJvZHNSbHRYa3crQTI0eU9LR3NIQnF1NXJB?= =?utf-8?B?ZGt4cmNiRVpGbS9RVWFKby9yN3M5SWJ6dkl6OXdvUi9mMkMzNjBESmQrWjFu?= =?utf-8?B?dVhxbEIxREVRaUI2dnFjWXFETlRNSGFIa0JQL1pYRzloNitNRnNyNFZiQkFL?= =?utf-8?B?UTYwSXM5RmNQTDQxUDh0OHlWNThKNXNqMXZKcnJmOEVCeFh0K0ErWU1vNXpw?= =?utf-8?B?ZzJSRi9BT3VnM3dyU0ZNeEZKZXkvVytwK2M2akM4WGRKZGxxME9OL2pEUHNq?= =?utf-8?B?ZVB3TDJBbDExamtMNUxSdGJEV3hxYU9Hd3E4M0oxQ3hQR09WS2tWYWJMbDNv?= =?utf-8?B?ZFNIS2hYT2NUVUtMOTJDTXIxN2lYTkpJY1pvUmsxOXlnZVpId1ZFV2w2M1BK?= =?utf-8?B?T3czR2dweFZtNE1ISWZRemtpblIzMmpkQllsM0tTcHRLajBRcGY5eUxMalpZ?= =?utf-8?B?WWNWRDIwdllPTkMvbXZBdktVRkI0b0VJc2VQa3pIbXp5cEEwanNZR3RFbVVv?= =?utf-8?B?SHZvVTRQZjdiK082OXg0USt5Zzk2R3Jac0JtcmJkVW12Nko5OEEyYmpXemtU?= =?utf-8?B?UWxzNGYzNU50WEVodEtyRHNVa05xazl3K3UyZHN2dklKUWVpaTlVWTA4OUZB?= =?utf-8?B?SU83TjZQZkJGWHNEMEhyeSszQXZMNWNVWCtwV0xqTDlJdEtFK1RLVXlyZ0Er?= =?utf-8?B?bHJJa0FrMHZpQ2F3QTg1aU1RS1R5Q2JRbjhEcVR4eCtPV2ptM3EvUEsxc3Bw?= =?utf-8?B?eTRWS0MzK3FSNUdidmJ5cEQrZisxRThrQzY3YVd2Y1ROR2g1anVOcWxBZkda?= =?utf-8?Q?tEdj/qZgroEL3uHimCzCBYn4Dyvk/iwo8tRvM5DPTY1E?= Content-Type: text/plain; charset="utf-8" Content-ID: <8EFCF293D1B3AE49BBE775C54C9D99D5@namprd05.prod.outlook.com> Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: vmware.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BY3PR05MB8497.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: e79883cf-c9f5-4cbf-07da-08d9e219e1a0 X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jan 2022 04:51:43.4180 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: b39138ca-3cee-4b4a-a4d6-cd83d9dd62f0 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: lkY581xw8jfzw0t6fAjef98p1DH8gYLeGLJy/gcBrm7xpfMixuGMZFD/CuwF7wEs15fIlFrrN4rnYyx2U4dlNA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR05MB6922 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the current implementation, the PCI capability list is parsed from the beginning to find each capability, which results in a large number of redundant PCI reads. Instead, we can parse the complete list just once, store it in the pci_dev structure, and get the offset of each capability directly from the pci_dev structure. This implementation improves pci devices initialization time by ~2-3% (from 270ms to 261ms) in case of bare metal and 7-8% (From 201ms to 184ms) in case of VM running on ESXi. It also adds a memory overhead of 20bytes (value of PCI_CAP_ID_MAX) per PCI device. Ran pahole for pci_dev structure. This patch is not adding any padding bytes. Signed-off-by: Vikash Bansal --- Changes in v2: - Ran pahole tool. - Modified comments to add "clock time". - Removed comments before call to pci_find_all_capabilities. drivers/pci/pci.c | 43 ++++++++++++++++++++++++++++++++++++------- drivers/pci/probe.c | 1 + include/linux/pci.h | 2 ++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 9ecce435fb3f..b361788bcc27 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -468,6 +468,41 @@ static u8 __pci_bus_find_cap_start(struct pci_bus *bus, return 0; } + +/** + * pci_find_all_capabilities - Read all capabilities + * @dev: the PCI device + * + * Read all capabilities and store offsets in cap_off + * array in pci_dev structure. + */ +void pci_find_all_capabilities(struct pci_dev *dev) +{ + int ttl =3D PCI_FIND_CAP_TTL; + u16 ent; + u8 pos; + u8 id; + + pos =3D __pci_bus_find_cap_start(dev->bus, dev->devfn, dev->hdr_type); + if (!pos) + return; + pci_bus_read_config_byte(dev->bus, dev->devfn, pos, &pos); + while (ttl--) { + if (pos < 0x40) + break; + pos &=3D ~3; + pci_bus_read_config_word(dev->bus, dev->devfn, pos, &ent); + id =3D ent & 0xff; + if (id =3D=3D 0xff) + break; + + /* Read first instance of capability */ + if (!(dev->cap_off[id])) + dev->cap_off[id] =3D pos; + pos =3D (ent >> 8); + } +} + /** * pci_find_capability - query for devices' capabilities * @dev: PCI device to query @@ -489,13 +524,7 @@ static u8 __pci_bus_find_cap_start(struct pci_bus *bus, */ u8 pci_find_capability(struct pci_dev *dev, int cap) { - u8 pos; - - pos =3D __pci_bus_find_cap_start(dev->bus, dev->devfn, dev->hdr_type); - if (pos) - pos =3D __pci_find_next_cap(dev->bus, dev->devfn, pos, cap); - - return pos; + return dev->cap_off[cap]; } EXPORT_SYMBOL(pci_find_capability); diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 17a969942d37..b2fa5b2c42f6 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1831,6 +1831,7 @@ int pci_setup_device(struct pci_dev *dev) dev->hdr_type =3D hdr_type & 0x7f; dev->multifunction =3D !!(hdr_type & 0x80); dev->error_state =3D pci_channel_io_normal; + pci_find_all_capabilities(dev); set_pcie_port_type(dev); pci_set_of_node(dev); diff --git a/include/linux/pci.h b/include/linux/pci.h index 8253a5413d7c..abcf7fdc4c98 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -335,6 +335,7 @@ struct pci_dev { unsigned int class; /* 3 bytes: (base,sub,prog-if) */ u8 revision; /* PCI revision, low byte of class word */ u8 hdr_type; /* PCI header type (`multi' flag masked out) */ + u8 cap_off[PCI_CAP_ID_MAX]; /* Offsets of all pci capabiliti= es */ #ifdef CONFIG_PCIEAER u16 aer_cap; /* AER capability offset */ struct aer_stats *aer_stats; /* AER stats for this device */ @@ -1140,6 +1141,7 @@ void pci_sort_breadthfirst(void); u8 pci_bus_find_capability(struct pci_bus *bus, unsigned int devfn, int cap= ); u8 pci_find_capability(struct pci_dev *dev, int cap); +void pci_find_all_capabilities(struct pci_dev *dev); u8 pci_find_next_capability(struct pci_dev *dev, u8 pos, int cap); u8 pci_find_ht_capability(struct pci_dev *dev, int ht_cap); u8 pci_find_next_ht_capability(struct pci_dev *dev, u8 pos, int ht_cap); -- 2.30.0