--- ./include/linux/container.h.vpsinfo 2006-02-06 22:35:36.000000000 +0300 +++ ./include/linux/container.h 2006-02-07 00:52:57.000000000 +0300 @@ -0,0 +1,59 @@ +#ifndef __LINUX_CONTAINER_H__ +#define __LINUX_CONTAINER_H__ + +#include +#include +#include + +struct task_struct; + +struct container { + u32 id; + struct task_struct *init_task; + atomic_t refcnt; +}; + +extern struct container init_container; + +#ifdef CONFIG_CONTAINER + +static inline struct container *get_container(struct container *cont) +{ + atomic_inc(&cont->refcnt); + return cont; +} + +static inline void put_container(struct container *cont) +{ + atomic_dec(&container->refcnt); +} + +#include +#include + +static inline struct container *set_econtainer(struct container *cont) +{ + struct container *ret; + + ret = current->econtainer; + current->econtainer = cont; + return ret; +} + +#define econtainer() (current->econtainer) + +extern void init_containers(void); + +#else /* CONFIG_CONTAINER */ + +#define get_container(cont) (NULL) +#define put_container(cont) do { } while (0) + +#define set_econtainer(cont) ((struct container *)NULL) +#define econtainer() (NULL) + +#define init_containers() do { } while (0) + +#endif /* CONFIG_CONTAINER */ + +#endif --- ./include/linux/init_task.h.vpsinfo 2006-01-03 06:21:10.000000000 +0300 +++ ./include/linux/init_task.h 2006-02-07 00:52:52.000000000 +0300 @@ -3,6 +3,7 @@ #include #include +#include #define INIT_FDTABLE \ { \ @@ -131,5 +132,7 @@ extern struct group_info init_groups; LIST_HEAD_INIT(cpu_timers[2]), \ } +#define INIT_CONTAINER(cont) \ + .refcnt = ATOMIC_INIT(1) #endif --- ./include/linux/sched.h.vpsinfo 2006-02-06 22:15:05.000000000 +0300 +++ ./include/linux/sched.h 2006-02-07 00:53:32.000000000 +0300 @@ -687,6 +687,7 @@ static inline void prefetch_stack(struct struct audit_context; /* See audit.c */ struct mempolicy; +struct container; struct task_struct { volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */ @@ -846,6 +847,11 @@ struct task_struct { struct io_context *io_context; +#ifdef CONFIG_CONTAINER + struct container *container; + struct container *econtainer; /* effective container */ +#endif + unsigned long ptrace_message; siginfo_t *last_siginfo; /* For ptrace use. */ /* --- ./init/main.c.vpsinfo 2006-02-06 22:15:06.000000000 +0300 +++ ./init/main.c 2006-02-07 00:46:12.000000000 +0300 @@ -47,6 +47,7 @@ #include #include #include +#include #include #include @@ -603,6 +604,8 @@ static void __init do_initcalls(void) */ static void __init do_basic_setup(void) { + init_containers(); + /* drivers will send hotplug events */ init_workqueues(); usermodehelper_init(); --- ./kernel/Makefile.vpsinfo 2006-02-06 22:15:06.000000000 +0300 +++ ./kernel/Makefile 2006-02-07 00:46:12.000000000 +0300 @@ -34,6 +34,7 @@ obj-$(CONFIG_DETECT_SOFTLOCKUP) += softl obj-$(CONFIG_GENERIC_HARDIRQS) += irq/ obj-$(CONFIG_SECCOMP) += seccomp.o obj-$(CONFIG_RCU_TORTURE_TEST) += rcutorture.o +obj-$(CONFIG_CONTAINER) += container.c ifneq ($(CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER),y) # According to Alan Modra , the -fno-omit-frame-pointer is --- ./kernel/container.c.vpsinfo 2006-02-07 00:01:21.000000000 +0300 +++ ./kernel/container.c 2006-02-07 00:46:12.000000000 +0300 @@ -0,0 +1,16 @@ +#include + +/* + * Initial container. + * + * All tasks and other resources initially belong to it + */ +struct container init_container = INIT_CONTAINER(init_container); + +EXPORT_SYMBOL(init_container); + +void init_containers(void) +{ + /* remember who is init in container */ + init_container.init_task = child_reaper; +} --- ./kernel/exit.c.vpsinfo 2006-02-06 22:15:06.000000000 +0300 +++ ./kernel/exit.c 2006-02-07 00:46:12.000000000 +0300 @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -107,6 +108,7 @@ repeat: spin_unlock(&p->proc_lock); proc_pid_flush(proc_dentry); release_thread(p); + put_container(p->container); put_task_struct(p); p = leader; --- ./kernel/fork.c.vpsinfo 2006-02-06 22:15:06.000000000 +0300 +++ ./kernel/fork.c 2006-02-07 00:46:12.000000000 +0300 @@ -44,6 +44,7 @@ #include #include #include +#include #include #include @@ -1132,6 +1133,7 @@ static task_t *copy_process(unsigned lon p->ioprio = current->ioprio; SET_LINKS(p); + (void)get_container(p->container); if (unlikely(p->ptrace & PT_PTRACED)) __ptrace_link(p, current->parent);