1. 创建kthread
/**
* kthread_run - create and wake a thread.
* @threadfn: the function to run until signal_pending(current).
* @data: data ptr for @threadfn.
* @namefmt: printf-style name for the thread.
*
* Description: Convenient wrapper for kthread_create() followed by
* wake_up_process(). Returns the kthread or ERR_PTR(-ENOMEM).
*/
example :
static struct task_struct *foo_thread;
static int __init foo_init(void)
{
kthread_run(foo_run, NULL, "kfoo");
if (IS_ERR(foo_thread)) {
err = PTR_ERR(foo_thread);
goto error;
}
/* others */
return 0;
error:
return err;
}
2. 执行
kthread_run API 会自动执行threadfn 直到signal_pending, 其退出有两种形式,
@threadfn() can either call do_exit() directly if it is a
* standalone thread for which no one will call kthread_stop(), or
* return when 'kthread_should_stop()' is true (which means
* kthread_stop() has been called). The return value should be zero
* or a negative error number; it will be passed to kthread_stop().
下面的example使用kthread_should_stop() 的方式:
static int foo_run(void *unused)
{
/* some run once init */
while (!kthread_should_stop()) {
/* Process stuff */
}
return 0;
}
3. 退出
API:
/**
* kthread_stop - stop a thread created by kthread_create().
* @k: thread created by kthread_create().
*
* Sets kthread_should_stop() for @k to return true, wakes it, and
* waits for it to exit. This can also be called after kthread_create()
* instead of calling wake_up_process(): the thread will exit without
* calling threadfn().
*
* If threadfn() may call do_exit() itself, the caller must ensure
* task_struct can't go away.
*
* Returns the result of threadfn(), or %-EINTR if wake_up_process()
* was never called.
*/
int kthread_stop(struct task_struct *k)
example:
static void __exit foo_exit(void)
{
kthread_stop(foo_thread);
}