static sigjmp_buf huge_jmpenv;
-static void __rte_unused huge_sigbus_handler(int signo __rte_unused)
+static void huge_sigbus_handler(int signo __rte_unused)
{
siglongjmp(huge_jmpenv, 1);
}
* non-static local variable in the stack frame calling sigsetjmp might be
* clobbered by a call to longjmp.
*/
-static int __rte_unused huge_wrap_sigsetjmp(void)
+static int huge_wrap_sigsetjmp(void)
{
return sigsetjmp(huge_jmpenv, 1);
}
static struct sigaction huge_action_old;
static int huge_need_recover;
-static void __rte_unused
+static void
huge_register_sigbus(void)
{
sigset_t mask;
huge_need_recover = !sigaction(SIGBUS, &action, &huge_action_old);
}
-static void __rte_unused
+static void
huge_recover_sigbus(void)
{
if (huge_need_recover) {
if (fd < 0) {
fd = open(path, O_CREAT | O_RDWR, 0600);
if (fd < 0) {
- RTE_LOG(ERR, EAL, "%s(): open failed: %s\n",
- __func__, strerror(errno));
+ RTE_LOG(ERR, EAL, "%s(): open '%s' failed: %s\n",
+ __func__, path, strerror(errno));
return -1;
}
/* take out a read lock and keep it indefinitely */
fd = open(path, O_CREAT | O_RDWR, 0600);
if (fd < 0) {
- RTE_LOG(DEBUG, EAL, "%s(): open failed: %s\n",
- __func__, strerror(errno));
+ RTE_LOG(ERR, EAL, "%s(): open '%s' failed: %s\n",
+ __func__, path, strerror(errno));
return -1;
}
/* take out a read lock */
mmap_flags = MAP_SHARED | MAP_POPULATE | MAP_FIXED;
}
+ huge_register_sigbus();
+
/*
* map the segment, and populate page tables, the kernel fills
* this segment with zeros if it's a new page.
__func__);
#endif
+ huge_recover_sigbus();
+
ms->addr = addr;
ms->hugepage_sz = alloc_sz;
ms->len = alloc_sz;
mapped:
munmap(addr, alloc_sz);
unmapped:
+ huge_recover_sigbus();
flags = EAL_RESERVE_FORCE_ADDRESS;
new_addr = eal_get_virtual_area(addr, &alloc_sz, alloc_sz, 0, flags);
if (new_addr != addr) {