is a task_struct vfork_done completion special only for kthreads?

Robert P. J. Day rpjday at crashcourse.ca
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
warned.)

  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.

  thoughts?

rday

-- 

========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                        http://crashcourse.ca

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================



More information about the Kernelnewbies mailing list