From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Guo Subject: Re: [PATCH V5 5/7] bus: add helper to handle sigbus Date: Mon, 9 Jul 2018 13:33:37 +0800 Message-ID: <6f6cf180-07e4-1b0e-2cf7-2c433cd5b1b7@intel.com> References: <1498711073-42917-1-git-send-email-jia.guo@intel.com> <1530776333-30318-1-git-send-email-jia.guo@intel.com> <1530776333-30318-6-git-send-email-jia.guo@intel.com> <06569f3a-58f6-d069-5234-4900f0f5f0fb@solarflare.com> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Cc: jblunck@infradead.org, shreyansh.jain@nxp.com, dev@dpdk.org, helin.zhang@intel.com To: Andrew Rybchenko , 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 mga18.intel.com (mga18.intel.com [134.134.136.126]) by dpdk.org (Postfix) with ESMTP id 0323C1B065 for ; Mon, 9 Jul 2018 07:33:42 +0200 (CEST) In-Reply-To: <06569f3a-58f6-d069-5234-4900f0f5f0fb@solarflare.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" hi, andrew Thanks for your reviewing. On 7/8/2018 9:30 PM, Andrew Rybchenko wrote: > On 05.07.2018 10:38, Jeff Guo wrote: >> 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 >> --- >> 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 >> #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); >> } >> - > > Unrelated change. > ok. I am fine to let it left to other specific patch. >> /* >> * 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); > > Shouldn't bus->sigbus_handler be checked here against NULL? > It looks like not all buses implement it. > should be like what you said. >> + 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); > > Empty line is missing after the function. > ok. >> #endif /* _EAL_PRIVATE_H_ */ >