Re: Question about the usage of kernel_thread

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/5/05, Yan Zheng <[email protected]> wrote:
>
> I do additional test by follow codes, the result is strange.
>
> ========================================
> #include <linux/kernel.h>
> #include <linux/module.h>
>
> static int noop(void *dummy)
> {
>         int i = 0;
>         while(i++ < 10) {
>                 printk("current->mm = %p\n", current->mm);
>                 printk("current->active_mm = %p\n", current->active_mm);
>                 set_current_state(TASK_INTERRUPTIBLE);
>                 schedule_timeout(HZ);
>         }
>         return 0;
> }
>
> static void create_thread(void *dummy)
> {
>         kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
> }
>
> static struct work_struct work;
>
> static int test_init(void)
> {
>         INIT_WORK(&work, create_thread, NULL);
>         schedule_work(&work);
>         return 0;
> }
> /*
> static int test_init(void)
> {
>         kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD);
>         return 0;
> }
> */
>
> static void test_exit(void) {}
> module_init(test_init);
> module_exit(test_exit);
> ========================================
>
> If use kernel_thread like above. the output is:
> current->mm = 00000000
> current->active_mm = dffd2640
> current->mm = 00000000
> current->active_mm = df4d50e0
> current->mm = 00000000
> current->active_mm = df4463c0
> current->mm = 00000000
> current->active_mm = df4d50e0
> current->mm = 00000000
> current->active_mm = c16ee3e0
> current->mm = 00000000
> current->active_mm = df4463c0
> current->mm = 00000000
> current->active_mm = c16ee3e0
> current->mm = 00000000
> current->active_mm = c16ee3e0
> current->mm = 00000000
> current->active_mm = df796380
> current->mm = 00000000
> current->active_mm = c16ee3e0
>
> if use kernel_thread directly in module_init(...). the output is:
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
> current->mm = df988060
> current->active_mm = df988060
>
> Would you please do some explanation.
>

The thread created from the code above (means from workqueue) are
by-default have init task as a parent process as init_workqueues
function is called during the booting process init
(http://sosdg.org/~coywolf/lxr/source/init/main.c#L657) from the
function do_basic_setup
(http://sosdg.org/~coywolf/lxr/source/init/main.c#L691) so the
workqueues have current->mm = NULL and when you creates a thread from
the workqueue it also get current->mm = NULL as of parent (workqueue
interface) and current->active_mm contains the mm of the previously
running process (running/scheduled before the current process which is
scheduled)

Whereas, when you create a kernel_thread from init_module it gets the
current->mm of the parent process (insmod is process in init_module
case) and during schedule if current->mm != NULL then the
current->active_mm remains same as that of current->mm, so for
creating a pure kernel thread from init_module daemonize must be
called from thread (I think I was wrong in my previous reply as i
wronggly said "the thread created like above is a true kernel thread")
else without calling daemonize (as I saw from your test) I guess you
can't get the full features of the kernel_thread (like not able to
access __complete__ kernel address space) (CMIIW)



--
Fawad Lateef
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux