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 04919A04B1; Wed, 26 Aug 2020 07:52:52 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2C0A758C4; Wed, 26 Aug 2020 07:52:44 +0200 (CEST) Received: from inva020.nxp.com (inva020.nxp.com [92.121.34.13]) by dpdk.org (Postfix) with ESMTP id 275752AB for ; Wed, 26 Aug 2020 07:52:42 +0200 (CEST) Received: from inva020.nxp.com (localhost [127.0.0.1]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id CFDC91A0826; Wed, 26 Aug 2020 07:52:41 +0200 (CEST) Received: from invc005.ap-rdc01.nxp.com (invc005.ap-rdc01.nxp.com [165.114.16.14]) by inva020.eu-rdc02.nxp.com (Postfix) with ESMTP id 9D38F1A0190; Wed, 26 Aug 2020 07:52:39 +0200 (CEST) Received: from lsv03196.swis.in-blr01.nxp.com (lsv03196.swis.in-blr01.nxp.com [92.120.146.192]) by invc005.ap-rdc01.nxp.com (Postfix) with ESMTP id EFC884024E; Wed, 26 Aug 2020 07:52:36 +0200 (CEST) From: rohit.raj@nxp.com To: Ray Kinsella , Neil Horman Cc: dev@dpdk.org, Rohit Raj Date: Wed, 26 Aug 2020 11:22:31 +0530 Message-Id: <20200826055233.26075-1-rohit.raj@nxp.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200824082414.30535-1-rohit.raj@nxp.com> References: <20200824082414.30535-1-rohit.raj@nxp.com> X-Virus-Scanned: ClamAV using ClamSMTP Subject: [dpdk-dev] [PATCH v3 1/3] eal: add API for bus close 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" From: Rohit Raj As per the current code we have API for bus probe, but the bus close API is missing. This breaks the multi process scenarios as objects are not cleaned while terminating the secondary processes. This patch adds a new API rte_bus_close() for cleanup of bus objects which were acquired during probe. Signed-off-by: Rohit Raj --- v3: * nit: combined nested if statements v2: * Moved rte_bus_close call to rte_eal_cleanup path. lib/librte_eal/common/eal_common_bus.c | 32 +++++++++++++++++++++++++- lib/librte_eal/include/rte_bus.h | 25 +++++++++++++++++++- lib/librte_eal/linux/eal.c | 1 + lib/librte_eal/rte_eal_version.map | 3 +++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c index baa5b532a..5fd7cf6c5 100644 --- a/lib/librte_eal/common/eal_common_bus.c +++ b/lib/librte_eal/common/eal_common_bus.c @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2016 NXP + * Copyright 2016,2020 NXP */ #include @@ -56,6 +56,36 @@ rte_bus_scan(void) return 0; } +int +rte_bus_close(void) +{ + int ret; + struct rte_bus *bus, *vbus = NULL; + + TAILQ_FOREACH(bus, &rte_bus_list, next) { + if (!strcmp(bus->name, "vdev")) { + vbus = bus; + continue; + } + + if (bus->close) { + ret = bus->close(); + if (ret) + RTE_LOG(ERR, EAL, "Bus (%s) close failed.\n", + bus->name); + } + } + + if (vbus && vbus->close) { + ret = vbus->close(); + if (ret) + RTE_LOG(ERR, EAL, "Bus (%s) close failed.\n", + vbus->name); + } + + return 0; +} + /* Probe all devices of all buses */ int rte_bus_probe(void) diff --git a/lib/librte_eal/include/rte_bus.h b/lib/librte_eal/include/rte_bus.h index d3034d0ed..af4787b18 100644 --- a/lib/librte_eal/include/rte_bus.h +++ b/lib/librte_eal/include/rte_bus.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: BSD-3-Clause - * Copyright 2016 NXP + * Copyright 2016,2020 NXP */ #ifndef _RTE_BUS_H_ @@ -67,6 +67,18 @@ typedef int (*rte_bus_scan_t)(void); */ typedef int (*rte_bus_probe_t)(void); +/** + * Implementation specific close function which is responsible for closing + * devices on that bus. + * + * This is called while iterating over each registered bus. + * + * @return + * 0 for successful close + * !0 for any error while closing + */ +typedef int (*rte_bus_close_t)(void); + /** * Device iterator to find a device on a bus. * @@ -248,6 +260,7 @@ 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_close_t close; /**< Close devices on bus */ rte_bus_find_device_t find_device; /**< Find a device on the bus */ rte_bus_plug_t plug; /**< Probe single device for drivers */ rte_bus_unplug_t unplug; /**< Remove single device from driver */ @@ -301,6 +314,16 @@ int rte_bus_scan(void); */ int rte_bus_probe(void); +/** + * For each device on the buses, call the device specific close. + * + * @return + * 0 for successful close + * !0 otherwise + */ +__rte_experimental +int rte_bus_close(void); + /** * Dump information of all the buses registered with EAL. * diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c index 0960f01d0..a8a63d8ca 100644 --- a/lib/librte_eal/linux/eal.c +++ b/lib/librte_eal/linux/eal.c @@ -1357,6 +1357,7 @@ rte_eal_cleanup(void) if (rte_eal_process_type() == RTE_PROC_PRIMARY) rte_memseg_walk(mark_freeable, NULL); + rte_bus_close(); rte_service_finalize(); rte_mp_channel_cleanup(); rte_trace_save(); diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 0b18e2ef8..dc5266f22 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -397,6 +397,9 @@ EXPERIMENTAL { rte_mp_disable; rte_thread_register; rte_thread_unregister; + + # added in 20.11 + rte_bus_close; }; INTERNAL { -- 2.17.1