From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Guo Subject: [PATCH V4 5/9] bus: add helper to handle sigbus Date: Fri, 29 Jun 2018 18:30:44 +0800 Message-ID: <1530268248-7328-6-git-send-email-jia.guo@intel.com> References: <1498711073-42917-1-git-send-email-jia.guo@intel.com> <1530268248-7328-1-git-send-email-jia.guo@intel.com> Cc: jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org, jia.guo@intel.com, helin.zhang@intel.com To: stephen@networkplumber.org, bruce.richardson@intel.com, ferruh.yigit@intel.com, konstantin.ananyev@intel.com, gaetan.rivet@6wind.com, jingjing.wu@intel.com, thomas@monjalon.net, motih@mellanox.com, matan@mellanox.com, harry.van.haaren@intel.com, qi.z.zhang@intel.com, shaopeng.he@intel.com, bernard.iremonger@intel.com Return-path: Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id 601891B55C for ; Fri, 29 Jun 2018 12:33:21 +0200 (CEST) In-Reply-To: <1530268248-7328-1-git-send-email-jia.guo@intel.com> List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- v4->v3: split patches to be small and clear. --- lib/librte_eal/common/eal_common_bus.c | 34 +++++++++++++++++++++++++++++++++- lib/librte_eal/common/eal_private.h | 11 +++++++++++ 2 files changed, 44 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..34c4f2d 100644 --- a/lib/librte_eal/common/eal_common_bus.c +++ b/lib/librte_eal/common/eal_common_bus.c @@ -37,6 +37,7 @@ #include #include #include +#include #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,35 @@ rte_bus_get_iommu_class(void) } return mode; } + +static int +bus_handle_sigbus(const struct rte_bus *bus, + const void *failure_addr) +{ + return !(bus->sigbus_handler && bus->sigbus_handler(failure_addr) <= 0); +} + +int +rte_bus_sigbus_handler(const void *failure_addr) +{ + struct rte_bus *bus; + int old_errno = rte_errno; + int ret = 0; + + rte_errno = 0; + + bus = rte_bus_find(NULL, bus_handle_sigbus, failure_addr); + if (bus == NULL) { + RTE_LOG(ERR, EAL, "No bus can handle the sigbus error!"); + ret = -1; + } else if (rte_errno != 0) { + RTE_LOG(ERR, EAL, "Failed to handle the sigbus error!"); + ret = -1; + } + + /* if sigbus not be handled, return back old errno. */ + if (ret) + 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..9517f2b 100644 --- a/lib/librte_eal/common/eal_private.h +++ b/lib/librte_eal/common/eal_private.h @@ -258,4 +258,15 @@ 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 on success. + * -1 on error + */ +int rte_bus_sigbus_handler(const void *failure_addr); #endif /* _EAL_PRIVATE_H_ */ -- 2.7.4