[dpdk-dev] [PATCH v4] eal: make hugetlb initialization more robust
Tan, Jianfeng
jianfeng.tan at intel.com
Thu May 19 04:11:16 CEST 2016
Hi Thomas & Sergio,
On 5/18/2016 4:06 PM, Sergio Gonzalez Monroy wrote:
> On 17/05/2016 17:40, Thomas Monjalon wrote:
>> 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?
>
> I do not see any benefit to the old behavior.
> Given that we need the signal handling for the cgroup use case, I
> would be inclined to use
> this method as the default instead of trying to figure out how many
> hugepages we have free, etc.
>
> Thoughts?
I tend to use this method as the default too, with some warning logs as
suggested by David, and return error from rte_eal_memory() when sigbus
is triggered under the case of RTE_EAL_SINGLE_FILE_SEGMENTS.
Thomas, all other trivial issues will be fixed in next version. Thank you!
Thanks,
Jianfeng
>
> Sergio
>
>>> +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".
>>
>
More information about the dev
mailing list