Coindicentally I also got it to run. The prototype is in agreement
with the usual clone() prototype.

#if defined(__i386__) && defined(__NR_clone_with_pids)
/*
 * libc doesn't support clone_with_pid() yet...
 * (see: http://lkml.indiana.edu/hypermail/linux/kernel/9604.3/0204.html)
 */
static int clone_with_pids(int (*fn)(void *), void *child_stack, int flags,
                           struct target_pid_set *target_pids, void *arg)
{
        long retval;
        void **newstack;

        /*
         * Set up the stack for child:
         *  - the (void *) arg will be the argument for the child function
         *  - the fn pointer will be loaded into ebx after the clone
         */
        newstack = (void **) child_stack;
        *--newstack = arg;
        *--newstack = fn;

        __asm__  __volatile__(
                 "movl %0, %%ebx\n\t"           /* flags -> 1st (ebx) */
                 "movl %1, %%ecx\n\t"           /* newstack -> 2nd (ecx)*/
                 "xorl %%edi, %%edi\n\t"        /* 0 -> edi */
                 "xorl %%edx, %%edx\n\t"        /* 0 -> edx */
                 "pushl %%ebp\n\t"              /* save value of ebp */
                 "movl %2, %%ebp\n\t"           /* flags -> 6th (ebp) */
                :
                :"b" (flags),
                 "c" (newstack),
                 "r" (target_pids)
                );

        __asm__ __volatile__(
                 "int $0x80\n\t"        /* Linux/i386 system call */
                 "testl %0,%0\n\t"      /* check return value */
                 "jne 1f\n\t"           /* jump if parent */
                 "popl %%ebx\n\t"       /* get subthread function */
                 "call *%%ebx\n\t"      /* start subthread function */
                 "movl %2,%0\n\t"
                 "int $0x80\n"          /* exit system call: exit subthread */
                 "1:\n\t"
                 "popl %%ebp\t"         /* restore parent's ebp */
                :"=a" (retval)
                :"0" (__NR_clone_with_pids), "i" (__NR_exit)
                :"ebx", "ecx"
                );

        if (retval < 0) {
                errno = -retval;
                retval = -1;
        }
        return retval;
}
#endif

I added it to mktree.c and commited to user-cr.git :: ckpt-v16-dev,
I also added the clone_with_pids patches to linux-cr.git :: ckpt-v16-dev

It works well when not in a new namespace (mktree --pids < ckpt.image)
assuming the the pids are avaiable.

It doesn't work yet when in a new namespace, as the kernel code needs
to be adjusted (for the restarting tasks to find the coordintor in an
ancestor namespace).

Oren.


On Fri, 5 Jun 2009, Sukadev Bhattiprolu wrote:

> 
> Attached are two files -
> 
>       cwp.c           - implements clone_with_pids() library interface
>       cwp-test.c      - a simple program to test the interface
> 
> There maybe more optimal ways of implementing it though :-)
> 
> If it makes sense, will submit as a patch to user-cr tree.
> 
> Sukadev
> 
_______________________________________________
Containers mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
[email protected]
https://openvz.org/mailman/listinfo/devel

Reply via email to