This patch aim to add a helper to iterate all buses to find the corresponding bus to handle the sigbus error.
Signed-off-by: Jeff Guo <jia....@intel.com> --- v5->v4: refine the errno restore logic --- lib/librte_eal/common/eal_common_bus.c | 36 +++++++++++++++++++++++++++++++++- lib/librte_eal/common/eal_private.h | 12 ++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c index 0943851..c9f3566 100644 --- a/lib/librte_eal/common/eal_common_bus.c +++ b/lib/librte_eal/common/eal_common_bus.c @@ -37,6 +37,7 @@ #include <rte_bus.h> #include <rte_debug.h> #include <rte_string_fns.h> +#include <rte_errno.h> #include "eal_private.h" @@ -220,7 +221,6 @@ rte_bus_find_by_device_name(const char *str) return rte_bus_find(NULL, bus_can_parse, name); } - /* * Get iommu class of devices on the bus. */ @@ -242,3 +242,37 @@ rte_bus_get_iommu_class(void) } return mode; } + +static int +bus_handle_sigbus(const struct rte_bus *bus, + const void *failure_addr) +{ + int ret; + + ret = bus->sigbus_handler(failure_addr); + rte_errno = ret; + + return !(bus->sigbus_handler && ret <= 0); +} + +int +rte_bus_sigbus_handler(const void *failure_addr) +{ + struct rte_bus *bus; + + int ret = 0; + int old_errno = rte_errno; + rte_errno = 0; + + bus = rte_bus_find(NULL, bus_handle_sigbus, failure_addr); + /* failed to handle the sigbus, pass the new errno. */ + if (bus && rte_errno == -1) + return -1; + else if (!bus) + ret = 1; + + /* otherwise restore the old errno. */ + rte_errno = old_errno; + + return ret; +} diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h index bdadc4d..a91c4b5 100644 --- a/lib/librte_eal/common/eal_private.h +++ b/lib/librte_eal/common/eal_private.h @@ -258,4 +258,16 @@ int rte_mp_channel_init(void); */ void dev_callback_process(char *device_name, enum rte_dev_event_type event); + +/** + * Iterate all buses to find the corresponding bus, to handle the sigbus error. + * @param failure_addr + * Pointer of the fault address of the sigbus error. + * + * @return + * 0 success to handle the sigbus. + * -1 failed to handle the sigbus + * 1 no bus can handler the sigbus + */ +int rte_bus_sigbus_handler(const void *failure_addr); #endif /* _EAL_PRIVATE_H_ */ -- 2.7.4