From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [67.231.154.164]) by dpdk.org (Postfix) with ESMTP id 8B0B11B443 for ; Mon, 9 Jul 2018 15:49:15 +0200 (CEST) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (webmail.solarflare.com [12.187.104.26]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1-us4.ppe-hosted.com (Proofpoint Essentials ESMTP Server) with ESMTPS id C3864B4006A; Mon, 9 Jul 2018 13:49:13 +0000 (UTC) Received: from [192.168.1.16] (85.187.13.33) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1044.25; Mon, 9 Jul 2018 06:49:00 -0700 To: Jeff Guo , , , , , , , , , , , , , , , CC: , , , References: <1498711073-42917-1-git-send-email-jia.guo@intel.com> <1531137666-10351-1-git-send-email-jia.guo@intel.com> <1531137666-10351-6-git-send-email-jia.guo@intel.com> From: Andrew Rybchenko Message-ID: Date: Mon, 9 Jul 2018 16:48:56 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: <1531137666-10351-6-git-send-email-jia.guo@intel.com> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Originating-IP: [85.187.13.33] X-ClientProxiedBy: ocex03.SolarFlarecom.com (10.20.40.36) To ocex03.SolarFlarecom.com (10.20.40.36) X-MDID: 1531144154-Ew7jk_Bl5R_u Subject: Re: [dpdk-dev] [PATCH v7 5/7] bus: add helper to handle sigbus 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: , X-List-Received-Date: Mon, 09 Jul 2018 13:49:15 -0000 On 09.07.2018 15:01, 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 > Acked-by: Shaopeng He > --- > v7->v6: > no change > --- > lib/librte_eal/common/eal_common_bus.c | 42 ++++++++++++++++++++++++++++++++++ > lib/librte_eal/common/eal_private.h | 12 ++++++++++ > 2 files changed, 54 insertions(+) > > diff --git a/lib/librte_eal/common/eal_common_bus.c b/lib/librte_eal/common/eal_common_bus.c > index 0943851..8856adc 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" > > @@ -242,3 +243,44 @@ rte_bus_get_iommu_class(void) > } > return mode; > } > + > +static int > +bus_handle_sigbus(const struct rte_bus *bus, > + const void *failure_addr) > +{ > + int ret; > + > + if (!bus->sigbus_handler) { > + RTE_LOG(ERR, EAL, "Function sigbus_handler not supported by " > + "bus (%s)\n", bus->name); It is not an error. It is OK that some buses cannot handle SIGBUS. > + return -1; > + } > + > + ret = bus->sigbus_handler(failure_addr); > + rte_errno = ret; > + > + return !(bus->sigbus_handler && ret <= 0); There is no point to check bus->sigbus_handler here. It is already checked above. So, it should be just:    return ret > 0; I.e. we should continue search if the address is not handled by any device on the bus (we should stop if it is handled (ret==0) or failed to to handle (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) > + ret = 1; > + else if (rte_errno == -1) I'm still thinking it is bad to keep negative value in rte_errno here. > + return -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..2337e71 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_ */