Commit 8ffbe754 authored by Pavel Emelyanov's avatar Pavel Emelyanov

rst: Lock rst memory allocations earlier

After we got the total remapable rst memory size, we no longer
can allocate from it, otherwise the bootstrap area will not
have enough size.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent d9a9d4c9
...@@ -2639,6 +2639,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2639,6 +2639,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
long ret; long ret;
long restore_bootstrap_len; long restore_bootstrap_len;
long rst_mem_size;
struct task_restore_args *task_args; struct task_restore_args *task_args;
struct thread_restore_args *thread_args; struct thread_restore_args *thread_args;
...@@ -2734,8 +2735,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2734,8 +2735,8 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
if (ret < 0) if (ret < 0)
goto err; goto err;
restore_bootstrap_len = restorer_len + args_len + rst_mem_size = rst_mem_lock();
rst_mem_remap_size(); restore_bootstrap_len = restorer_len + args_len + rst_mem_size;
#ifdef CONFIG_VDSO #ifdef CONFIG_VDSO
/* /*
...@@ -2855,7 +2856,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2855,7 +2856,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
task_args->task_entries = rst_mem_remap_ptr(task_entries_pos, RM_SHREMAP); task_args->task_entries = rst_mem_remap_ptr(task_entries_pos, RM_SHREMAP);
task_args->rst_mem = mem; task_args->rst_mem = mem;
task_args->rst_mem_size = rst_mem_remap_size(); task_args->rst_mem_size = rst_mem_size;
task_args->bootstrap_start = (void *)exec_mem_hint; task_args->bootstrap_start = (void *)exec_mem_hint;
task_args->bootstrap_len = restore_bootstrap_len; task_args->bootstrap_len = restore_bootstrap_len;
...@@ -2972,7 +2973,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2972,7 +2973,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
* since we need it being accessible even when own * since we need it being accessible even when own
* self-vmas are unmaped. * self-vmas are unmaped.
*/ */
mem += rst_mem_remap_size(); mem += rst_mem_size;
task_args->vdso_rt_parked_at = (unsigned long)mem + vdso_rt_delta; task_args->vdso_rt_parked_at = (unsigned long)mem + vdso_rt_delta;
task_args->vdso_sym_rt = vdso_sym_rt; task_args->vdso_sym_rt = vdso_sym_rt;
task_args->vdso_rt_size = vdso_rt_size; task_args->vdso_rt_size = vdso_rt_size;
......
...@@ -62,7 +62,7 @@ extern void rst_mem_free_last(int type); ...@@ -62,7 +62,7 @@ extern void rst_mem_free_last(int type);
/* /*
* Routines to remap SHREMAP and PRIVATE into restorer address space * Routines to remap SHREMAP and PRIVATE into restorer address space
*/ */
extern unsigned long rst_mem_remap_size(void); extern unsigned long rst_mem_lock(void);
extern int rst_mem_remap(void *to); extern int rst_mem_remap(void *to);
#endif /* __CR_RST_MALLOC__H__ */ #endif /* __CR_RST_MALLOC__H__ */
...@@ -169,8 +169,15 @@ void rst_mem_free_last(int type) ...@@ -169,8 +169,15 @@ void rst_mem_free_last(int type)
t->last = 0; /* next free_last would be no-op */ t->last = 0; /* next free_last would be no-op */
} }
unsigned long rst_mem_remap_size(void) unsigned long rst_mem_lock(void)
{ {
/*
* Don't allow further allocations from rst_mem since we're
* going to get the bootstrap area and remap all the stuff
* into it. The SHREMAP and SHARED should be already locked
* in the rst_mem_switch_to_private().
*/
rst_mems[RM_PRIVATE].enabled = false;
return rst_mems[RM_PRIVATE].size + rst_mems[RM_SHREMAP].size; return rst_mems[RM_PRIVATE].size + rst_mems[RM_SHREMAP].size;
} }
...@@ -178,7 +185,7 @@ static int rst_mem_remap_one(struct rst_mem_type_s *t, void *to) ...@@ -178,7 +185,7 @@ static int rst_mem_remap_one(struct rst_mem_type_s *t, void *to)
{ {
void *aux; void *aux;
BUG_ON(!t->remapable); BUG_ON(!t->remapable || t->enabled);
if (!t->buf) if (!t->buf)
/* /*
...@@ -196,7 +203,6 @@ static int rst_mem_remap_one(struct rst_mem_type_s *t, void *to) ...@@ -196,7 +203,6 @@ static int rst_mem_remap_one(struct rst_mem_type_s *t, void *to)
} }
t->buf = aux; t->buf = aux;
t->enabled = false;
return 0; return 0;
} }
......
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