[dpdk-dev] [PATCH v3 1/3] eal: add API for bus close

Sachin Saxena (OSS) sachin.saxena at oss.nxp.com
Tue Sep 29 06:33:03 CEST 2020



On 26-Aug-20 11:22 AM, rohit.raj at nxp.com wrote:
> From: Rohit Raj <rohit.raj at nxp.com>
>
> 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 <rohit.raj at nxp.com>
> ---
>
> 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 <stdio.h>
> @@ -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();
Since this is common framework change, we should introduce similar call 
for "rte_bus_close" in FreeBSD and Windows version also.

>   	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 {



More information about the dev mailing list