Commit f781ba04 authored by Pavel Emelyanov's avatar Pavel Emelyanov

rst: Rework task_entries to use rst_mem engine

The task_entries is a small structure used to coordinate the
processes restore stages. Currentl we allocate one page for
it and handle one separately. No need in this complexity, actually.
The rst_mem engine is already capable to controll this small object.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent a9484a91
...@@ -95,20 +95,6 @@ static int prepare_signals(int pid); ...@@ -95,20 +95,6 @@ static int prepare_signals(int pid);
static int root_as_sibling; static int root_as_sibling;
static int shmem_remap(void *old_addr, void *new_addr, unsigned long size)
{
void *ret;
ret = mremap(old_addr, size, size,
MREMAP_FIXED | MREMAP_MAYMOVE, new_addr);
if (new_addr != ret) {
pr_perror("mremap failed");
return -1;
}
return 0;
}
static int crtools_prepare_shared(void) static int crtools_prepare_shared(void)
{ {
if (prepare_shared_fdinfo()) if (prepare_shared_fdinfo())
...@@ -822,6 +808,7 @@ static inline int sig_fatal(int sig) ...@@ -822,6 +808,7 @@ static inline int sig_fatal(int sig)
} }
struct task_entries *task_entries; struct task_entries *task_entries;
static unsigned long task_entries_pos;
static int restore_one_zombie(int pid, CoreEntry *core) static int restore_one_zombie(int pid, CoreEntry *core)
{ {
...@@ -1737,13 +1724,15 @@ out: ...@@ -1737,13 +1724,15 @@ out:
return 1; return 1;
} }
static int prepare_task_entries() static int prepare_task_entries(void)
{ {
task_entries = mmap(NULL, TASK_ENTRIES_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, 0, 0); task_entries_pos = rst_mem_cpos(RM_SHREMAP);
if (task_entries == MAP_FAILED) { task_entries = rst_mem_alloc(sizeof(*task_entries), RM_SHREMAP);
if (!task_entries) {
pr_perror("Can't map shmem"); pr_perror("Can't map shmem");
return -1; return -1;
} }
task_entries->nr_threads = 0; task_entries->nr_threads = 0;
task_entries->nr_tasks = 0; task_entries->nr_tasks = 0;
task_entries->nr_helpers = 0; task_entries->nr_helpers = 0;
...@@ -2455,7 +2444,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2455,7 +2444,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
BUILD_BUG_ON(sizeof(struct task_restore_args) & 1); BUILD_BUG_ON(sizeof(struct task_restore_args) & 1);
BUILD_BUG_ON(sizeof(struct thread_restore_args) & 1); BUILD_BUG_ON(sizeof(struct thread_restore_args) & 1);
BUILD_BUG_ON(TASK_ENTRIES_SIZE % PAGE_SIZE);
args_len = round_up(sizeof(*task_args) + sizeof(*thread_args) * current->nr_threads, PAGE_SIZE); args_len = round_up(sizeof(*task_args) + sizeof(*thread_args) * current->nr_threads, PAGE_SIZE);
pr_info("%d threads require %ldK of memory\n", pr_info("%d threads require %ldK of memory\n",
...@@ -2513,7 +2501,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2513,7 +2501,6 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
goto err; goto err;
restore_bootstrap_len = restorer_len + args_len + restore_bootstrap_len = restorer_len + args_len +
TASK_ENTRIES_SIZE +
rst_mem_remap_size(); rst_mem_remap_size();
#ifdef CONFIG_VDSO #ifdef CONFIG_VDSO
...@@ -2594,15 +2581,10 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2594,15 +2581,10 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
*/ */
mem += args_len; mem += args_len;
ret = shmem_remap(task_entries, mem, TASK_ENTRIES_SIZE);
if (ret < 0)
goto err;
mem += TASK_ENTRIES_SIZE;
if (rst_mem_remap(mem)) if (rst_mem_remap(mem))
goto err; goto err;
task_args->task_entries = mem - TASK_ENTRIES_SIZE; 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_remap_size();
......
...@@ -165,8 +165,6 @@ static inline unsigned long restorer_stack(struct thread_restore_args *a) ...@@ -165,8 +165,6 @@ static inline unsigned long restorer_stack(struct thread_restore_args *a)
return RESTORE_ALIGN_STACK((long)a->mem_zone.stack, RESTORE_STACK_SIZE); return RESTORE_ALIGN_STACK((long)a->mem_zone.stack, RESTORE_STACK_SIZE);
} }
#define TASK_ENTRIES_SIZE 4096
enum { enum {
CR_STATE_FAIL = -1, CR_STATE_FAIL = -1,
CR_STATE_RESTORE_NS = 0, /* is used for executing "setup-namespace" scripts */ CR_STATE_RESTORE_NS = 0, /* is used for executing "setup-namespace" scripts */
......
...@@ -1080,7 +1080,6 @@ long __export_restore_task(struct task_restore_args *args) ...@@ -1080,7 +1080,6 @@ long __export_restore_task(struct task_restore_args *args)
restore_posix_timers(args); restore_posix_timers(args);
sys_munmap(args->task_entries, TASK_ENTRIES_SIZE);
sys_munmap(args->rst_mem, args->rst_mem_size); sys_munmap(args->rst_mem, args->rst_mem_size);
/* /*
......
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