Commit 1296fff7 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

restore: Fetch mmap_minimal_address runtime

We assume that mmap_minimal_address with non-default
setting is not widespread but it's not true. Instead
lets fetch this setting runtime.

travis-ci: success for Fetch mmap_minimal_address and drop MAP_ANON
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 7a6b96ae
......@@ -1969,7 +1969,7 @@ static long restorer_get_vma_hint(struct list_head *tgt_vma_list,
end_vma.e = &end_e;
end_e.start = end_e.end = kdat.task_size;
prev_vma_end = PAGE_SIZE * 0x10; /* CONFIG_LSM_MMAP_MIN_ADDR=65536 */
prev_vma_end = kdat.mmap_min_addr;
s_vma = list_first_entry(self_vma_list, struct vma_area, list);
t_vma = list_first_entry(tgt_vma_list, struct vma_area, list);
......
......@@ -35,6 +35,7 @@ struct kerndat_s {
bool has_loginuid;
enum pagemap_func pmap;
unsigned int has_xtlocks;
unsigned long mmap_min_addr;
};
extern struct kerndat_s kdat;
......
......@@ -8,6 +8,8 @@
#include <errno.h>
#include <sys/syscall.h>
#include <sys/sysmacros.h>
#include <sys/sysmacros.h>
#include <stdint.h>
#include "int.h"
#include "log.h"
......@@ -106,6 +108,39 @@ static int parse_self_maps(unsigned long vm_start, dev_t *device)
return -1;
}
static void kerndat_mmap_min_addr(void)
{
/* From kernel's default CONFIG_LSM_MMAP_MIN_ADDR */
static const unsigned long default_mmap_min_addr = 65536;
uint64_t value;
struct sysctl_req req[] = {
{
.name = "vm/mmap_min_addr",
.arg = &value,
.type = CTL_U64,
},
};
if (sysctl_op(req, ARRAY_SIZE(req), CTL_READ, 0)) {
pr_warn("Can't fetch %s value, use default %#lx\n",
req[0].name, (unsigned long)default_mmap_min_addr);
kdat.mmap_min_addr = default_mmap_min_addr;
return;
}
if (value < default_mmap_min_addr) {
pr_debug("Adjust mmap_min_addr %#lx -> %#lx\n",
(unsigned long)value,
(unsigned long)default_mmap_min_addr);
kdat.mmap_min_addr = default_mmap_min_addr;
} else
kdat.mmap_min_addr = value;
pr_debug("Found mmap_min_addr %#lx\n",
(unsigned long)kdat.mmap_min_addr);
}
static int kerndat_get_shmemdev(void)
{
void *map;
......@@ -483,6 +518,7 @@ int kerndat_init(void)
ret = kerndat_tcp_repair_window();
kerndat_lsm();
kerndat_mmap_min_addr();
return ret;
}
......@@ -514,6 +550,7 @@ int kerndat_init_rst(void)
ret = kerndat_tcp_repair_window();
kerndat_lsm();
kerndat_mmap_min_addr();
return ret;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment