is a task_struct vfork_done completion special only for kthreads?

Robert P. J. Day rpjday at
Thu Jun 14 08:03:59 EDT 2012

  (what is probably the first in a plethora of silly questions as i
dig into the ugly details of various kernel features.  you've been

  clawing my way through the kernel code for kthreads and i notice the
following.  in kernel/kthread.c, we have:


struct kthread {
        int should_stop;
        void *data;
        struct completion exited;

#define to_kthread(tsk) \
        container_of((tsk)->vfork_done, struct kthread, exited)


  in other words, the kthread to associated "task_struct" mapping is
based on the fact that this member field in task_struct:

        struct completion *vfork_done;          /* for vfork() */

will point at the "exited" completion object in the corresponding
"struct kthread".

  is the above construct only true for kthreads, in the sense of,
unless you've specifically created a kthread, the vfork_done pointer
in task_struct is to a simple completion.  but if the task is a
kthread, the vfork_done pointer is *still* to a completion, but it's a
completion that's encapsulated in a larger structure that's meant to
be manipulated by kthread routines, obviously.

  as a test, i did this:


$ grep -r "container_of.*vfork_done" *
kernel/kthread.c:	container_of((tsk)->vfork_done, struct kthread, exited)


so it appears that that vfork_done field is only ever "container_of"ed
with respect to kthreads and nowhere else.




Robert P. J. Day                                 Ottawa, Ontario, CANADA


More information about the Kernelnewbies mailing list