To support application checkpoint/restart, a task must have the same pid it had when it was checkpointed. When containers are nested, the tasks within the containers exist in multiple pid namespaces and hence have multiple pids to specify during restart.
This patchset implements a new system call, clone_with_pids() that lets a process specify the pids of the child process. Patches 1 through 6 are helpers and we believe they are needed for application restart, regardless of the kernel implementation of application restart. Patch 8/8 defines a prototype of the new system call. Changelog[v5]: - Make 'pid_max' a property of pid_ns (Integrated Serge Hallyn's patch into this set) - (Eric Biederman): Avoid the new function, set_pidmap() - added couple of checks on 'target_pid' in alloc_pidmap() itself. === IMPORTANT TODO: clone() system call has another limitation - all available bits in clone-flags are in use and any new clone-flag will need a variant of the clone() system call. It appears to make sense to try and extend this new system call to address this limitation as well. The basic requirements of a new clone system call could then be summarized as: - do everything clone() does today, and - give application an ability to choose pids for the child process in all ancestor pid namespaces, and - allow more clone_flags Contstraints: - system-calls are restricted to 6 parameters and clone() already takes 5 parameters, any extension to clone() interface would require one or more copy_from_user(). - does copy_from_user() of a few words have a significant impact on the total cost of clone() ? Based on these requirements and constraints, we have been exploring a couple of system call interfaces and appreciate any iput. 1. ===== #if 64bit #define CLONE_FLAGS_WORDS 1 #else #define CLONE_FLAGS_WORDS 2 #endif struct pid_set { int num_pids; pid_t *pids; }; typedef struct { unsigned long flags[CLONE_FLAGS_WORDS]; } clone_flags_t; int clone_extended(clone_flags_t *flags, void *child_stack, int *unused, int *parent_tid, int *child_tid, struct pid_set *pid_set); Pros: - extendible clone_flags (like sigset_t) Cons: - copy_from_user() needed on all architectures (we maybe able to play some tricks with 'clone_flags_t' to avoid the copy on 64-bit archtitectures till N_CLONE_FLAGS exceeds 64). - Both applications and kernel must use interfaces equivalent to sigsetops(3) to test/set/clear clone flags. 2. ====== struct clone_info { int num_clone_high_words; int *flags_high; struct pid_set pid_set; } int clone_extended(int flags_low, void *child_stack, void *unused, int *parent_tid, int *child_tid, struct clone_info *clone_info); Pros: - copy_from_user() needed only for new flags and pid_set Cons: - splitting the high and low clone-flags is awkward ? Signed-off-by: Sukadev Bhattiprolu <suka...@us.ibm.com> _______________________________________________ Containers mailing list contain...@lists.linux-foundation.org https://lists.linux-foundation.org/mailman/listinfo/containers _______________________________________________ Devel mailing list Devel@openvz.org https://openvz.org/mailman/listinfo/devel