From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Monjalon Subject: Re: [PATCH v4] eal: make hugetlb initialization more robust Date: Tue, 17 May 2016 18:40:28 +0200 Message-ID: <1671292.hQI6ccxuUZ@xps13> References: <1457089092-4128-1-git-send-email-jianfeng.tan@intel.com> <1463013881-27985-1-git-send-email-jianfeng.tan@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7Bit Cc: dev@dpdk.org, david.marchand@6wind.com, sergio.gonzalez.monroy@intel.com, nhorman@tuxdriver.com To: Jianfeng Tan Return-path: Received: from mail-wm0-f52.google.com (mail-wm0-f52.google.com [74.125.82.52]) by dpdk.org (Postfix) with ESMTP id 733E45A49 for ; Tue, 17 May 2016 18:40:47 +0200 (CEST) Received: by mail-wm0-f52.google.com with SMTP id g17so40942333wme.1 for ; Tue, 17 May 2016 09:40:47 -0700 (PDT) In-Reply-To: <1463013881-27985-1-git-send-email-jianfeng.tan@intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 2016-05-12 00:44, Jianfeng Tan: > This patch adds an option, --huge-trybest, to use a recover mechanism to > the case that there are not so many hugepages (declared in sysfs), which > can be used. It relys on a mem access to fault-in hugepages, and if fails relys -> relies > with SIGBUS, recover to previously saved stack environment with > siglongjmp(). > > Besides, this solution fixes an issue when hugetlbfs is specified with an > option of size. Currently DPDK does not respect the quota of a hugetblfs > mount. It fails to init the EAL because it tries to map the number of free > hugepages in the system rather than using the number specified in the quota > for that mount. It looks to be a bug. Why adding an option? What is the benefit of the old behaviour, not using --try-best? > +static sigjmp_buf jmpenv; > + > +static void sigbus_handler(int signo __rte_unused) > +{ > + siglongjmp(jmpenv, 1); > +} > + > +/* Put setjmp into a wrap method to avoid compiling error. Any non-volatile, > + * non-static local variable in the stack frame calling sigsetjmp might be > + * clobbered by a call to longjmp. > + */ > +static int wrap_sigsetjmp(void) > +{ > + return sigsetjmp(jmpenv, 1); > +} Please add the word "huge" to these variables and functions. > +static struct sigaction action_old; > +static int need_recover; > + > +static void > +register_sigbus(void) > +{ > + sigset_t mask; > + struct sigaction action; > + > + sigemptyset(&mask); > + sigaddset(&mask, SIGBUS); > + action.sa_flags = 0; > + action.sa_mask = mask; > + action.sa_handler = sigbus_handler; > + > + need_recover = !sigaction(SIGBUS, &action, &action_old); > +} > + > +static void > +recover_sigbus(void) > +{ > + if (need_recover) { > + sigaction(SIGBUS, &action_old, NULL); > + need_recover = 0; > + } > +} Idem, Please add the word "huge".