Commit 653053b4 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

proc: use vma flags for determing vmas with MAP_GROWSDOWN

When a kernel didn't show vma flags, we set MAP_GROWSDOWN for stack
vmas, but it's not reliable. E.g. thread stacks are mapped without
MAP_GROWSDOWN.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 84e84cbb
......@@ -695,8 +695,6 @@ static int dump_task_core_all(struct parasite_ctl *ctl,
if (ret)
goto err_free;
mark_stack_vma(CORE_THREAD_ARCH_INFO(core)->gpregs->sp, &vma_area_list->h);
ret = get_task_futex_robust_list(pid, core->thread_core);
if (ret)
goto err_free;
......
......@@ -1802,9 +1802,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
if (ret < 0)
goto err;
/* required to unmap stack _with_ guard page */
mark_stack_vma((long) &self_vmas, &self_vmas.h);
self_vmas_len = round_up((self_vmas.nr + 1) * sizeof(VmaEntry), PAGE_SIZE);
vmas_len = round_up((rst_vmas.nr + 1) * sizeof(VmaEntry), PAGE_SIZE);
......
......@@ -133,8 +133,6 @@ extern void pr_vma(unsigned int loglevel, const struct vma_area *vma_area);
p__; \
})
extern void mark_stack_vma(unsigned long sp, struct list_head *vma_area_list);
extern int move_img_fd(int *img_fd, int want_fd);
extern int close_safe(int *fd);
......
......@@ -96,9 +96,10 @@ static int parse_vmflags(char *buf, struct vma_area *vma_area)
do {
/* mmap() block */
if (_vmflag_match(tok, "gd"))
if (_vmflag_match(tok, "gd")) {
vma_area->vma.flags |= MAP_GROWSDOWN;
else if (_vmflag_match(tok, "lo"))
vma_area->vma.start -= PAGE_SIZE; /* Guard page */
} else if (_vmflag_match(tok, "lo"))
vma_area->vma.flags |= MAP_LOCKED;
else if (_vmflag_match(tok, "nr"))
vma_area->vma.flags |= MAP_NORESERVE;
......
......@@ -36,26 +36,6 @@
#include "crtools.h"
/* /proc/PID/maps can contain not up to date information about stack */
void mark_stack_vma(unsigned long sp, struct list_head *vma_area_list)
{
struct vma_area *vma_area;
list_for_each_entry(vma_area, vma_area_list, list) {
if (in_vma_area(vma_area, sp)) {
vma_area->vma.status |= VMA_AREA_STACK;
vma_area->vma.flags |= MAP_GROWSDOWN;
/*
* The kernel doesn't show stack guard pages on
* proc output, so add pages here by hands.
*/
vma_area->vma.start -= PAGE_SIZE;
return;
}
}
BUG();
}
#define VMA_OPT_LEN 128
static void vma_opt_str(const struct vma_area *v, char *opt)
......
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