From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-DM3-obe.outbound.protection.outlook.com (mail-dm3nam03on0043.outbound.protection.outlook.com [104.47.41.43]) by dpdk.org (Postfix) with ESMTP id 83A9514EC for ; Tue, 17 Jan 2017 08:21:25 +0100 (CET) Received: from BN3PR03CA0116.namprd03.prod.outlook.com (10.174.66.34) by BN6PR03MB2465.namprd03.prod.outlook.com (10.168.223.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12; Tue, 17 Jan 2017 07:21:24 +0000 Received: from BN1BFFO11FD003.protection.gbl (2a01:111:f400:7c10::1:177) by BN3PR03CA0116.outlook.office365.com (2603:10b6:400:4::34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.845.12 via Frontend Transport; Tue, 17 Jan 2017 07:21:24 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; 6wind.com; dkim=none (message not signed) header.d=none;6wind.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1BFFO11FD003.mail.protection.outlook.com (10.58.144.66) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.803.8 via Frontend Transport; Tue, 17 Jan 2017 07:21:23 +0000 Received: from [10.232.14.39] ([10.232.14.39]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id v0H7LK85022179; Tue, 17 Jan 2017 00:21:21 -0700 To: References: <1484581107-2025-1-git-send-email-shreyansh.jain@nxp.com> <1484581107-2025-9-git-send-email-shreyansh.jain@nxp.com> CC: , From: Shreyansh Jain Message-ID: Date: Tue, 17 Jan 2017 12:54:49 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.6.0 MIME-Version: 1.0 In-Reply-To: <1484581107-2025-9-git-send-email-shreyansh.jain@nxp.com> Content-Type: text/plain; charset="windows-1252"; format=flowed Content-Transfer-Encoding: 7bit X-EOPAttributedMessage: 0 X-Matching-Connectors: 131291112835575408; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(336005)(39400400002)(39380400002)(39410400002)(39850400002)(39860400002)(39840400002)(39450400003)(2980300002)(1110001)(1109001)(339900001)(377454003)(199003)(189002)(24454002)(8936002)(33646002)(2906002)(189998001)(230700001)(4326007)(76176999)(54356999)(86362001)(31696002)(575784001)(4001350100001)(81156014)(81166006)(229853002)(104016004)(626004)(30001)(2351001)(106466001)(23746002)(105606002)(6666003)(50986999)(8676002)(2950100002)(47776003)(97736004)(92566002)(31686004)(6916009)(68736007)(36756003)(54906002)(5660300001)(77096006)(65826007)(38730400001)(5890100001)(83506001)(64126003)(356003)(65956001)(65806001)(305945005)(85426001)(50466002)(110136003); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR03MB2465; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD003; 1:59UBgMO9UI6DXBOe7EqeMCCxtk6hBfiWAzg2g2VRMzO2azTQyOkxd+38OTCdr9QDG2QrL5viWkC+fR8gyycHHGw6INdZLfBgW1u2rR1P1HuEEOGiTR+kVWb9q8/+qKV9E+2VASD9v07NVuj9q2ufqrJUAmD89cknoPg078XPHNbH04Ewt28ihuw6594rtLQAZ63qyfCEcc7YxD9IaONt7mAbY4OndmmbL3+e45bLl1hasEogYzuRg2AbDVABoVe4xqByRu7j1+xxQTKVNE30eQBU6eOp/WORLdeJYmxBj5iSBmIXkpIqMqcX/FPgxuDszYK3XlEQGLeaEb7IGZGrhr/ZbZU8eP/u/PMRinA1CdWSCWStbPnZpbUntUJ/69fDBTBF0ZeL1beSZ9Gkg85gh73NkM3goA679qM2/YVNM6evqjucet89XQ+N4wt3Lw6jaoWd4Ztak3QXujfQ67ypYACTvye+4cdSMCl4b1HyZd2UKRv27cz6mdME39axEjo7laqhn5FJTTjjFc69C0pNI5MiZXHCB1HHy1C9cmnUEydpNzoKyWPAW22Tujgeya9V X-MS-Office365-Filtering-Correlation-Id: aab0fc85-75f8-45b1-ee70-08d43ea97131 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN6PR03MB2465; X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465; 3:u5kGG8ZyxFCNGyMTxBvlCm72yo16dVdONzeWc/4q1FEKlXwPhA2dETRP2G/CrqZXlmrBdf/bvJvkZs6yJ+wm8mlX15QOwzNeKqjiMtfMHCpCgcosBtI2deRDpkfFjZiuuvecQvbpOvmjpMZlmPbfAIVXIUGqILu4E2ZNYh2nlY5d2ywfmyxGdTHtvU5rZh0HrNBiYH3fcxq1Fg+VyjrBhJOOyWOvpEQXflDiqf7qWgYiukENvc8CP15hejA2oBygZwhzel2JlMO671u5PR9xqeDl8pqxrLh2HMFkRZCIZZODBVwT+HPh4DRN3G4nxiHLKAHCPOboNx7woYjlEqMOC0sVG1zRlW+AYHumoftNLEMxhmoFf3IReD5J0xlxpgHX X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465; 25:AtXFcsWZsL6lwSvuYSheQjwNlIGpg+gjTUXGnIw0km7H+7SUEK+rECPwg2dY7qZnmb5CqscEw8e3vBRq14zEAguBIGgzxIHUEXEoKihrgXy2gMv871epCzvB+mW2eZvrUcW6q5Pfs4Cu/sMQ2/mcx34RPt0NabXgwl48gInxaB8dfh3ytX/aczFawAEcNn9nJPS0sEIh16KBkfDQ6x/ICe7KMphf9EQ3i4yFq5HHh3gexP0WfJoGqPqT/Qbxlzp45kV6S9Qvv9O70n4OZQFxgwgYFnOjCPt1Idnz+0+DuYM9pRAs58PxOA94afkA02ohqg+Dscn8fXGiCgfAsV6dK3MAwSqvqJvN3XkQf0iHEqDqhrr+0oUFYQY2dss8wC64fZJjImUBMPs2Ouxrs10zGHv3k1+qWGPZ6BWssO6rjhGyHxPzAWOZ7QAulKI209xteYsthcvCV9vADnTOgQZF/yB8isz/GCdtDxBHRL/0WLWSJ6iOU4Nc3LwKf0nVZ3fZ059jltjH/lefNS/65KiWX69m4ZSit4M2ey4B5InurLoVTa6CEfIhWbnkJ/KMXfXJEirR7b03XXkdK27EebqDbYUr9TQfry7NGojTHHzWH7MqrW72j1DJZbr8sSmfSfGAUt/HqSv3+qJxwNjBPAtE1YQsSXhLCRGjkeOXLnu5uLBehiFPRl5A5Qti4q9HInrhZzfHXoG68J1yBTesApeOSLuGlDv9hhHnz0CjJgdpvtOgL/2uczxWzGSF9M2MrLM6muySHImyYv9CXGKi246VmKD03tedhS5qgXnhcC00yKdSi9TWnXGeyOFnM66XTzwJ X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465; 31:7KM7zENN3hQGvWNjCEmy8fi6ed+z2xuvG7fU0et0tYRfDKah/ka6dJ6aLSE8lk2/Zmd8y3gXgKkfVgr4tftR+X7yr9axPZ6rbFMk6gl7edszwwMyYVSaHxGYYCd+0ClkZ1CoCv9GCUTRec3ajFNprD0fuEwM762+KG73M3yVu+fxFgxRtsB7AHJxdtxeQhT0DDYIWQYx7WufxaUVc94PVKLrJYNJDZj/83P4WyGmkEbIaU78nF2rOH+owhobbPLDalP370AEheviUKTufdeW/j117paze3Z0719VoYSAMBY= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6095060)(601004)(2401047)(8121501046)(5005006)(13023025)(13017025)(13015025)(13024025)(13018025)(10201501046)(3002001)(6055026)(6096035)(20161123565025)(20161123563025)(20161123556025)(20161123559025)(20161123561025); SRVR:BN6PR03MB2465; BCL:0; PCL:0; RULEID:(400006); SRVR:BN6PR03MB2465; X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465; 4:oV1ZWfrXrChI6YAxiQ/zmlW8HtIlzzg6btecHK5qgU4SJBNlt0S/KF4jxVkIbXb8yH3/n5RfawHgGdTFHLi8cT2+zcI7QXAAsEnLV8PhJ3IDrqpYoAlg8QuZswyKbwFM55Ddd1r5GpK1oEzyHgP7MA7OL8tUVqgb1d+VIfVfE1vhK73+3HarYf3SD+G4nksC6amijTzFtpIZQ3TJ77hnjy1ZihgFcWCu9bkzSOMq068DTi+xrzuWnufQIkPT3IpXHnSQntBAtKjBKT+JUICB6dwAcXz58rUKKDf50GpFyMPgsqSHA/v/cZlm5VIv4vwNgfJtjUVG3S3rTXGXwtVirFm8wpWUzySdABjURjfmslFP0LIEngqr62KRnVZb1hFF3FTo3HdCCaGydGYoMOkUTTnlbiw1ggO4rFmy55TVMbAlpInrhCkYv5w+C3F+74YlSuU/mRVvn2se0gshb4ZFLwG79/DsCykso3DylB4ruDRRqR584Sh9hlsCEJzNyVfwZh0tUjMg6u0iODSkAncXMzwAIWjcm9mI+5kEvf7TOtR3Ppym4EtIesKN5GdEube6iz27/EH7460jAVXeWm5o0BJstFCeDCni0LJTTr71tGwMuJ6p88KkiP1WpaR6VG6U7S/vBCdH5lYrr+isB/FCs0S/05lTz6DBPx+Iz7RubXBZlhXnI72AVbRYtxAOW+qkvh8NHapmUVxRBm0i1EKtz7WtOcCV+bC4e0D0JP+I1VAtXcWO/Ez0NC349EaWb2A2 X-Forefront-PRVS: 01901B3451 X-Microsoft-Exchange-Diagnostics: =?Windows-1252?Q?1; BN6PR03MB2465; 23:+VI1aZz/ibJX0QvUR1YuPae94IAqqZJ+Neu3E?= =?Windows-1252?Q?9heepMjrnYsDa4c4D7s9Jsw+8pk2Zy2sltSmuG+BZNaLG94Mt4e/bEIg?= =?Windows-1252?Q?azqiuFDcnW2Jdpm8Z6+lkby5ZkKmSXcMpZzLpmqzyY/BerLrHUoITmCY?= =?Windows-1252?Q?z60XyQ1+fs+fCE4dw8/750gtSegiWocUd4cKBKHcRxAKuvn2iWYitmac?= =?Windows-1252?Q?niGtJRGIHbMS1W/lpxJizd9QQF2fa9emspzSJdwPbPJZqXgJo5Qs12FF?= =?Windows-1252?Q?BZ0UGiVFyyxwaMoIYGEdQmisp/n76CT8lIVINpDwfp1zcetJRBDIZFEa?= =?Windows-1252?Q?ToKA9cit8YEjVbxHp6DkMYIcvhX41t9GRd/ykywQ0K/2OEMnFKPZkbid?= =?Windows-1252?Q?VHWNzPi6fh1gpy/k39lz4lwpxDdfQsi6yQmNdzpYuxkMEE8RZHi8K2Tr?= =?Windows-1252?Q?JAOShoKKZh4Zl2p+C01ffZAMzH4BlwBbh27op+/UiiQsqr20rM4g6i+F?= =?Windows-1252?Q?3HhEbAFvszCzUAzkhfCoGQ8t5DpQjKpoIrkOF1MFvqV3qr50oi7xbrie?= =?Windows-1252?Q?H/8DoEgfJmrzSvGMNJnULV+pr42fEua+IqY7kePsp+E3XfqGIbMlGUDK?= =?Windows-1252?Q?vsp9eU80qg0BHF2pG0GHsan5rhhiJhjuvfiysJd6wRgqeutaQF5K/b5T?= =?Windows-1252?Q?2VHBGwBpweMMfZskQKvb1n78uE1wRTRALLRpMJ8K2njxRSXCLkZR7Oog?= =?Windows-1252?Q?HRp2ZwbnGo+4SGpain3H1i6RqA0BWFcaDe66ZYnoGG/kZwE2tDE0TyOf?= =?Windows-1252?Q?JnX2SxQj24nbkftXfKU4YWkUlUaPMTcFO1DtZKQMx9qqULKOzCnlG7mK?= =?Windows-1252?Q?F+9Ssy8nGA/pq2u8qvO4K55siTg3adYtfRH5MlsT/WAhKl4OqJjbLnVN?= =?Windows-1252?Q?uRKViRa5MiFMYCKzXH8saHMbMkzZJq+Rd5DGj8oF2CVoctkt2IZBfrmn?= =?Windows-1252?Q?0uWZmrDN6z8Bn5yWdp2F+sKkqzp1RO24uEmXIfFjkZLetKXWk3p1Ig4w?= =?Windows-1252?Q?vcKVZ0sTQJxZuwZoN7vGJysbE2XAjBbIqhrTTOLkjz3QmwKOQ3n0/0xp?= =?Windows-1252?Q?L8h5UKeg8GKkB3M8mNM8I+92Rz4ai8UGsaSK7dw35zuQof3FJ8mwUZy+?= =?Windows-1252?Q?li5LzCxwXjsR9RCvWvrIPzkJIMUff/YkW7Clu6y7j06RdiltUPIzjqPZ?= =?Windows-1252?Q?IT7sK/EfUL7JtPMBtU1w/T8GlpPCzj91fy2hY4Gog3GUX2lI8AaEDIbD?= =?Windows-1252?Q?keJ1/WDOS7f6A8CQrS7SQNL0KyxRwt2jMgms3oDNTIPIZy9DUwTgjP1S?= =?Windows-1252?Q?0q6SEfsNP6O3QAky1DRLudU7Ysc3BC0/idQDG7DGyBvFj0ycJxhCocTW?= =?Windows-1252?Q?um7uC6+Ped0LqB0RiWQehHjlutxfkBmmNgaf/PmtaTbaV0R+zIDgfJri?= =?Windows-1252?Q?4lrkwexrSOa+qudBaMhI+aU38Vog+VCPnVqxucQaxHyuc05SQ5M7VoLa?= =?Windows-1252?Q?sNXPhnBZq/HhfiQ4tZvt8+OwEX56F1ZwOmNeAOfT1gVe3YdLQ772DZ25?= =?Windows-1252?Q?vHZDTBCwvXAOtmfKqoI3TNGfXe6CuDhCdOO5CdLq31nBmhhNMVAWTOk2?= =?Windows-1252?Q?Wo9/mClJmxnF6Oo0Bq3sj4jg/7sLgA=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465; 6:4Og7CxLqr6eJENqFdwjBLareoWnhXv2xE0t/xTALIZxRRH9lx5v/o57NAkrar1xK0NM3sdbTVLJTQOuugVvBG+TtdpXM33wZLGETeUn4kAPySlmiJRaEqMyA8Lq0VcrSowdjf38Ya0Lod1yv7zdoURvq4Oq2Sh9dXIG++R5PkMG8tr0LVYeSdlTCGgMsZyt6O3dfhOBvCTcA2SH0FvdBCEXxV0B5AD66XxIaABjtYei3RgPtDPSIPUEjHDtjM0ga//HSUVV3eB/e64OZ1bV0BEuTU5uv+c23dStxH+iKFZ3SLXEEtklcZrXHIGMlopNgUpqH9Rfkyv+RSrBbCH3WK4btsYydOgJG4cXpAD03VIFoC7E5kMr2xAj6wrsvJAZZoqfA7bul4mB3/RWG812ZDnFlSOoP5jwxWJ0dr5+1LNOS/RxFntPj45Gv+FxFl2eu; 5:+utaIFwIwAS5edYfYBbemcavkDUbCNBbRHcfasnxTUkQ6vXwcmnRtcB621km+CvWwRJmQGyAtZxPb6ZxXwV41bLPtFy2E9TzJSnA9p/nTiPsgre5bYiK3OL76TdpQyt2UJqnKN0Q6HQy0DI49WYpskPzCAi5NVyommcZohLXr+cujvPYHdsamFKE4jodwnjt; 24:jO/G+ov2brxWTzKCtZWNpByBeE8/9md9pzWB8gMwKyMT3ovGAar7DjR4rbYa2Ida6qUoSiEQv4a3aW2EWVdNztGQT8DWbvtLiSVGdJm1B0c= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2465; 7:RolB5CKozIEjp5eoB/A5ixtRJIiJnsdh3sFES1xN2IPozViJL2Xg8vISB13MzsK89ovONlhZrTJopC6Yrtqc4/mizWGxG8uWnkHXUSzavrqrfNpcCDDA7B26xEr/WO9HJqjSKQ0JnBhRK9wNVVr6bgz0Nxmmgs6XasKrJ1ly2/Hn0yQxAcrwbPpkTToE/Lbla449AsOAoAzcOmn/3FikknRBgflb1ABWK7gFxEIU/kZ5q4IcB6xNTucpNObflD66HgiIMB7VHek4djfEgVFh1WqNCVUSVhN4Ftufap/MTOGrCFTxXv6aaZGqpwz9bWCBFr1pFDxkXh8HZDyu/MA1q/CgYYcojal9Kp5zwgMq3MlkAst5QeBK4Z3Erady/KSM26OfIWOsScvPdgXUiBToBrgu5RBgKjEI5bhCnEzV/Rq62tl3+6QxXtqYNn8oNIztAnoRMQ76r63bbXO086POrg== X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Jan 2017 07:21:23.3547 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR03MB2465 Subject: Re: [dpdk-dev] [PATCH v6 8/8] eal: enable hotplugging of devices on bus 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: , X-List-Received-Date: Tue, 17 Jan 2017 07:21:26 -0000 On Monday 16 January 2017 09:08 PM, Shreyansh Jain wrote: > Given a bus, attach and detach callbacks allow the implementation to > handles calls from EAL for attaching or detaching a named device. > > Signed-off-by: Shreyansh Jain > --- > lib/librte_eal/bsdapp/eal/eal_pci.c | 2 + > lib/librte_eal/common/eal_common_dev.c | 56 +++++++++++++++++----- > lib/librte_eal/common/eal_common_pci.c | 82 +++++++++++++++++++++++++++++++-- > lib/librte_eal/common/include/rte_bus.h | 35 ++++++++++++++ > lib/librte_eal/common/include/rte_pci.h | 58 +++++++++++++++++++---- > lib/librte_eal/linuxapp/eal/eal_pci.c | 2 + > 6 files changed, 212 insertions(+), 23 deletions(-) > > diff --git a/lib/librte_eal/bsdapp/eal/eal_pci.c b/lib/librte_eal/bsdapp/eal/eal_pci.c > index 48bfe24..17a04d9 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_pci.c > +++ b/lib/librte_eal/bsdapp/eal/eal_pci.c > @@ -678,6 +678,8 @@ struct rte_pci_bus rte_pci_bus = { > .bus = { > .scan = rte_eal_pci_scan, > .probe = rte_eal_pci_probe, > + .attach = rte_eal_pci_attach, > + .detach = rte_eal_pci_detach, > }, > .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list), > .driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list), > diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c > index 4f3b493..b363fa9 100644 > --- a/lib/librte_eal/common/eal_common_dev.c > +++ b/lib/librte_eal/common/eal_common_dev.c > @@ -38,6 +38,7 @@ > #include > > #include > +#include > #include > #include > #include > @@ -106,23 +107,37 @@ rte_eal_dev_init(void) > > int rte_eal_dev_attach(const char *name, const char *devargs) > { > - struct rte_pci_addr addr; > + int ret = 1; > + struct rte_bus *bus; > > if (name == NULL || devargs == NULL) { > RTE_LOG(ERR, EAL, "Invalid device or arguments provided\n"); > return -EINVAL; > } > > - if (eal_parse_pci_DomBDF(name, &addr) == 0) { > - if (rte_eal_pci_probe_one(&addr) < 0) > + FOREACH_BUS(bus) { > + if (!bus->attach) { > + RTE_LOG(DEBUG, EAL, "Bus (%s) doesn't implement" > + " attach.\n", bus->name); > + continue; > + } > + ret = bus->attach(bus, name); > + if (!ret) /* device successfully attached */ > + return ret; > + if (ret > 0) /* device not found on bus */ > + continue; > + else > goto err; > + } > > - } else { > - if (rte_eal_vdev_init(name, devargs)) > + if (ret > 0) { > + /* In case the device was not found on any bus, search VDEV */ > + ret = rte_eal_vdev_init(name, devargs); > + if (ret) > goto err; > } > > - return 0; > + return ret; > > err: > RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", name); > @@ -131,21 +146,38 @@ int rte_eal_dev_attach(const char *name, const char *devargs) > > int rte_eal_dev_detach(const char *name) > { > - struct rte_pci_addr addr; > + int ret = 1; > + struct rte_bus *bus; > > if (name == NULL) { > RTE_LOG(ERR, EAL, "Invalid device provided.\n"); > return -EINVAL; > } > > - if (eal_parse_pci_DomBDF(name, &addr) == 0) { > - if (rte_eal_pci_detach(&addr) < 0) > + FOREACH_BUS(bus) { > + if (!bus->detach) { > + RTE_LOG(DEBUG, EAL, "Bus (%s) doesn't implement" > + " detach.\n", bus->name); > + continue; > + } > + > + ret = bus->detach(bus, name); > + if (!ret) /* device successfully detached */ > + return ret; > + if (ret > 0) /* device not found on the bus */ > + continue; > + else > goto err; > - } else { > - if (rte_eal_vdev_uninit(name)) > + } > + > + if (ret > 0) { > + /* In case the device was not found on any bus, search VDEV */ > + ret = rte_eal_vdev_uninit(name); > + if (ret) > goto err; > } > - return 0; > + > + return ret; > > err: > RTE_LOG(ERR, EAL, "Driver cannot detach the device (%s)\n", name); > diff --git a/lib/librte_eal/common/eal_common_pci.c b/lib/librte_eal/common/eal_common_pci.c > index 1d283d2..1c205bd 100644 > --- a/lib/librte_eal/common/eal_common_pci.c > +++ b/lib/librte_eal/common/eal_common_pci.c > @@ -389,19 +389,95 @@ rte_eal_pci_probe_one(const struct rte_pci_addr *addr) > } > > /* > + * Attach device specific by its name > + */ > +int > +rte_eal_pci_attach(struct rte_bus *bus __rte_unused, const char *device_name) > +{ > + struct rte_pci_device *dev = NULL; > + struct rte_pci_driver *drv = NULL; > + struct rte_pci_addr addr; > + int ret = -1; > + > + if (!device_name) > + return -1; > + > + memset(&addr, 0, sizeof(addr)); > + if (eal_parse_pci_DomBDF(device_name, &addr) == 0) { > + /* Device doesn't match PCI BDF naming format */ > + return -1; > + } > + > + FOREACH_DEVICE_ON_PCIBUS(dev) { > + if (rte_eal_compare_pci_addr(&dev->addr, &addr)) > + continue; > + > + FOREACH_DRIVER_ON_PCIBUS(drv) { > + ret = rte_pci_match(drv, dev); > + if (ret) { > + /* Match of device and driver failed */ > + RTE_LOG(DEBUG, EAL, "Driver (%s) doesn't match" > + " the device (%s)\n", drv->driver.name, > + device_name); > + continue; > + } > + > + RTE_LOG(INFO, EAL, " probe driver: %x:%x %s\n", > + dev->id.vendor_id, dev->id.device_id, > + drv->driver.name); > + > + if (drv->drv_flags & RTE_PCI_DRV_NEED_MAPPING) { > + /* map resources for devices that use > + * igb_uio > + */ > + ret = rte_eal_pci_map_device(dev); > + if (ret != 0) > + goto err_return; > + } > + > + /* reference driver structure */ > + dev->driver = drv; > + > + /* call the driver probe() function */ > + ret = drv->probe(drv, dev); > + if (ret) { > + dev->driver = NULL; > + if (drv->drv_flags & RTE_PCI_DRV_NEED_MAPPING) > + rte_eal_pci_unmap_device(dev); > + } > + } > + } > + > + return ret; > + > +err_return: > + RTE_LOG(WARNING, EAL, "Requested device " PCI_PRI_FMT > + " cannot be used\n", dev->addr.domain, dev->addr.bus, > + dev->addr.devid, dev->addr.function); > + return -1; > +} > + > +/* > * Detach device specified by its pci address. > */ > int > -rte_eal_pci_detach(const struct rte_pci_addr *addr) > +rte_eal_pci_detach(struct rte_bus *bus __rte_unused, const char *device_name) > { > struct rte_pci_device *dev = NULL; > + struct rte_pci_addr addr; > int ret = 0; > > - if (addr == NULL) > + if (!device_name) > return -1; > > + memset(&addr, 0, sizeof(addr)); > + if (eal_parse_pci_DomBDF(device_name, &addr) == 0) { > + /* Device doesn't match PCI BDF naming format */ > + return -1; > + } > + > FOREACH_DEVICE_ON_PCIBUS(dev) { > - if (rte_eal_compare_pci_addr(&dev->addr, addr)) > + if (rte_eal_compare_pci_addr(&dev->addr, &addr)) > continue; > > ret = pci_detach_all_drivers(dev); > diff --git a/lib/librte_eal/common/include/rte_bus.h b/lib/librte_eal/common/include/rte_bus.h > index f1d4c2c..5b7ae0c 100644 > --- a/lib/librte_eal/common/include/rte_bus.h > +++ b/lib/librte_eal/common/include/rte_bus.h > @@ -59,6 +59,8 @@ TAILQ_HEAD(rte_bus_list, rte_bus); > /* Bus list exposed */ > extern struct rte_bus_list rte_bus_list; > > +#define FOREACH_BUS(bus_p) TAILQ_FOREACH(bus_p, &rte_bus_list, next) > + > /** > * Bus specific scan for devices attached on the bus. > * For each bus object, the scan would be reponsible for finding devices and > @@ -94,6 +96,37 @@ typedef int (*rte_bus_scan_t)(void); > typedef int (*rte_bus_probe_t)(void); > > /** > + * Attach a device to a bus, assuming it is 'connected' to the bus. > + * A bus is responsible for scanning for devices. Attaching a new device is > + * for reenabling the device after being detached/removed. > + * > + * @param bus > + * Generic bus object which was registered with EAL > + * @param device_name > + * Name of the device to attach. > + * > + * @return > + * 0 for successful attach > + * !0 for unsuccessful attach (or incorrect device name) > + */ > +typedef int (*rte_bus_attach_t)(struct rte_bus *bus, const char *device_name); > + > +/** > + * Detach a named device from a bus. Implementation would check the existence > + * of device on the bus and detach it. > + * > + * @param bus > + * Generic bus object which was registered with EAL > + * @param device_name > + * Name of the device to detach > + * > + * @return > + * 0 for successful detaching > + * !0 if device not found or can't detach > + */ > +typedef int (*rte_bus_detach_t)(struct rte_bus *bus, const char *device_name); > + > +/** > * A structure describing a generic bus. > */ > struct rte_bus { > @@ -101,6 +134,8 @@ struct rte_bus { > const char *name; /**< Name of the bus */ > rte_bus_scan_t scan; /**< Scan for devices attached to bus */ > rte_bus_probe_t probe; /**< Probe devices on bus */ > + rte_bus_attach_t attach; /**< Attach a named device */ > + rte_bus_detach_t detach; /**< Detach a named device */ > }; > > /** > diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h > index 5f8d679..6369584 100644 > --- a/lib/librte_eal/common/include/rte_pci.h > +++ b/lib/librte_eal/common/include/rte_pci.h > @@ -421,6 +421,40 @@ int > rte_eal_pci_probe(void); > > /** > + * Search and attach a PCI device to PCI Bus > + * Implements rte_bus->attach > + * > + * @param bus > + * Generic bus object representing PCI bus > + * @param device_name > + * Name of the device to search and attach > + * > + * @return > + * 0 for successful removal of device > + * >0 if device not found on bus > + * <0 in case of error in removal. > + */ > +int > +rte_eal_pci_attach(struct rte_bus *bus, const char *device_name); The first argument, rte_bus, is not required. I will remove this in v7. > + > +/** > + * Search and detach a PCI device from PCI Bus > + * Implements rte_bus->detach > + * > + * @param bus > + * Generic bus object representing PCI bus > + * @param device_name > + * Name of the device to search and detach > + * > + * @return > + * 0 for successful detaching of device > + * >0 if device not found on bus > + * <0 in case of error in removal. > + */ > +int > +rte_eal_pci_detach(struct rte_bus *bus, const char *device_name); Same as above, rte_bus argument is not required and will be removed in v7. > + > +/** > * Map the PCI device resources in user space virtual memory address > * > * Note that driver should not call this function when flag > @@ -494,19 +528,27 @@ void pci_unmap_resource(void *requested_addr, size_t size); > int rte_eal_pci_probe_one(const struct rte_pci_addr *addr); > > /** > - * Close the single PCI device. > - * > - * Scan the content of the PCI bus, and find the pci device specified by pci > - * address, then call the remove() function for registered driver that has a > - * matching entry in its id_table for discovered device. > + * Attach a PCI device on PCI Bus > + * @param bus > + * Generic Bus object for PCI Bus. If passed NULL, PCI bus is extracted > + * using Bus APIs. > + * @param device_name > + * Device Name, which would be converted into BDF. > + */ > +int rte_eal_pci_attach(struct rte_bus *bus, const char *device_name); > + > +/** > + * Detach a single PCI device. > * > - * @param addr > - * The PCI Bus-Device-Function address to close. > + * @param bus > + * Generic bus object for PCI bus. > + * @param device_name > + * Device Name, which would be converted into BDF. > * @return > * - 0 on success. > * - Negative on error. > */ > -int rte_eal_pci_detach(const struct rte_pci_addr *addr); > +int rte_eal_pci_detach(struct rte_bus *bus, const char *device_name); > > /** > * Dump the content of the PCI bus. > diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c > index 50ad9f7..8084996 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_pci.c > +++ b/lib/librte_eal/linuxapp/eal/eal_pci.c > @@ -716,6 +716,8 @@ struct rte_pci_bus rte_pci_bus = { > .bus = { > .scan = rte_eal_pci_scan, > .probe = rte_eal_pci_probe, > + .attach = rte_eal_pci_attach, > + .detach = rte_eal_pci_detach, > }, > .device_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.device_list), > .driver_list = TAILQ_HEAD_INITIALIZER(rte_pci_bus.driver_list), >