pmalloc: always lock pages
Type: feature
Change-Id: I5bbf37969c9c51e40a013d1fc3ab966838eeb80d
Signed-off-by: Damjan Marion <damarion@cisco.com>
(cherry picked from commit 801c7016ad
)
This commit is contained in:

committed by
Andrew Yourtchenko

parent
5ec78926b6
commit
5b2eea6e07
@ -49,6 +49,11 @@ I: vppinfra
|
|||||||
M: Dave Barach <dave@barachs.net>
|
M: Dave Barach <dave@barachs.net>
|
||||||
F: src/vppinfra/
|
F: src/vppinfra/
|
||||||
|
|
||||||
|
Physical Memory Allocator
|
||||||
|
I: pmalloc
|
||||||
|
M: Damjan Marion <damarion@cisco.com>
|
||||||
|
F: src/vppinfra/pmalloc.[ch]
|
||||||
|
|
||||||
Vector Library
|
Vector Library
|
||||||
I: vlib
|
I: vlib
|
||||||
M: Dave Barach <dave@barachs.net>
|
M: Dave Barach <dave@barachs.net>
|
||||||
|
@ -261,11 +261,10 @@ pmalloc_map_pages (clib_pmalloc_main_t * pm, clib_pmalloc_arena_t * a,
|
|||||||
{
|
{
|
||||||
clib_pmalloc_page_t *pp = 0;
|
clib_pmalloc_page_t *pp = 0;
|
||||||
int status, rv, i, mmap_flags;
|
int status, rv, i, mmap_flags;
|
||||||
void *va;
|
void *va = MAP_FAILED;
|
||||||
int old_mpol = -1;
|
int old_mpol = -1;
|
||||||
long unsigned int mask[16] = { 0 };
|
long unsigned int mask[16] = { 0 };
|
||||||
long unsigned int old_mask[16] = { 0 };
|
long unsigned int old_mask[16] = { 0 };
|
||||||
uword page_size = 1ULL << a->log2_subpage_sz;
|
|
||||||
uword size = (uword) n_pages << pm->def_log2_page_sz;
|
uword size = (uword) n_pages << pm->def_log2_page_sz;
|
||||||
|
|
||||||
clib_error_free (pm->error);
|
clib_error_free (pm->error);
|
||||||
@ -304,9 +303,6 @@ pmalloc_map_pages (clib_pmalloc_main_t * pm, clib_pmalloc_arena_t * a,
|
|||||||
|
|
||||||
mmap_flags = MAP_FIXED;
|
mmap_flags = MAP_FIXED;
|
||||||
|
|
||||||
if ((pm->flags & CLIB_PMALLOC_F_NO_PAGEMAP) == 0)
|
|
||||||
mmap_flags |= MAP_LOCKED;
|
|
||||||
|
|
||||||
if (a->flags & CLIB_PMALLOC_ARENA_F_SHARED_MEM)
|
if (a->flags & CLIB_PMALLOC_ARENA_F_SHARED_MEM)
|
||||||
{
|
{
|
||||||
mmap_flags |= MAP_SHARED;
|
mmap_flags |= MAP_SHARED;
|
||||||
@ -338,24 +334,11 @@ pmalloc_map_pages (clib_pmalloc_main_t * pm, clib_pmalloc_arena_t * a,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if huge page is not allocated,
|
if (a->log2_subpage_sz != pm->sys_log2_page_sz && mlock (va, size) != 0)
|
||||||
wrong allocation will generate the SIGBUS */
|
|
||||||
if (a->log2_subpage_sz != pm->sys_log2_page_sz)
|
|
||||||
{
|
{
|
||||||
for (int i = 0; i < n_pages; i++)
|
pm->error = clib_error_return_unix (0, "Unable to lock pages");
|
||||||
{
|
|
||||||
unsigned char flag;
|
|
||||||
mincore (va + i * page_size, 1, &flag);
|
|
||||||
// flag is 1 if the page was successfully allocated and in memory
|
|
||||||
if (!flag)
|
|
||||||
{
|
|
||||||
pm->error =
|
|
||||||
clib_error_return_unix (0,
|
|
||||||
"Unable to fulfill huge page allocation request");
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
clib_memset (va, 0, size);
|
clib_memset (va, 0, size);
|
||||||
|
|
||||||
@ -377,10 +360,6 @@ pmalloc_map_pages (clib_pmalloc_main_t * pm, clib_pmalloc_arena_t * a,
|
|||||||
clib_error_return (0, "page allocated on wrong node, numa node "
|
clib_error_return (0, "page allocated on wrong node, numa node "
|
||||||
"%u status %d", numa_node, status);
|
"%u status %d", numa_node, status);
|
||||||
|
|
||||||
/* unmap & reesrve */
|
|
||||||
munmap (va, size);
|
|
||||||
mmap (va, size, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
|
|
||||||
-1, 0);
|
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -410,6 +389,13 @@ pmalloc_map_pages (clib_pmalloc_main_t * pm, clib_pmalloc_arena_t * a,
|
|||||||
return pp - (n_pages - 1);
|
return pp - (n_pages - 1);
|
||||||
|
|
||||||
error:
|
error:
|
||||||
|
if (va != MAP_FAILED)
|
||||||
|
{
|
||||||
|
/* unmap & reserve */
|
||||||
|
munmap (va, size);
|
||||||
|
mmap (va, size, PROT_NONE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
|
||||||
|
-1, 0);
|
||||||
|
}
|
||||||
if (a->fd != -1)
|
if (a->fd != -1)
|
||||||
close (a->fd);
|
close (a->fd);
|
||||||
return 0;
|
return 0;
|
||||||
|
Reference in New Issue
Block a user