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, ...@@ -695,8 +695,6 @@ static int dump_task_core_all(struct parasite_ctl *ctl,
if (ret) if (ret)
goto err_free; 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); ret = get_task_futex_robust_list(pid, core->thread_core);
if (ret) if (ret)
goto err_free; goto err_free;
......
...@@ -1802,9 +1802,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -1802,9 +1802,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
if (ret < 0) if (ret < 0)
goto err; 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); 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); 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); ...@@ -133,8 +133,6 @@ extern void pr_vma(unsigned int loglevel, const struct vma_area *vma_area);
p__; \ 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 move_img_fd(int *img_fd, int want_fd);
extern int close_safe(int *fd); extern int close_safe(int *fd);
......
...@@ -96,9 +96,10 @@ static int parse_vmflags(char *buf, struct vma_area *vma_area) ...@@ -96,9 +96,10 @@ static int parse_vmflags(char *buf, struct vma_area *vma_area)
do { do {
/* mmap() block */ /* mmap() block */
if (_vmflag_match(tok, "gd")) if (_vmflag_match(tok, "gd")) {
vma_area->vma.flags |= MAP_GROWSDOWN; 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; vma_area->vma.flags |= MAP_LOCKED;
else if (_vmflag_match(tok, "nr")) else if (_vmflag_match(tok, "nr"))
vma_area->vma.flags |= MAP_NORESERVE; vma_area->vma.flags |= MAP_NORESERVE;
......
...@@ -36,26 +36,6 @@ ...@@ -36,26 +36,6 @@
#include "crtools.h" #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 #define VMA_OPT_LEN 128
static void vma_opt_str(const struct vma_area *v, char *opt) 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