linux/include/linux/kthread.h
<<
>>
Prefs
   1#ifndef _LINUX_KTHREAD_H
   2#define _LINUX_KTHREAD_H
   3/* Simple interface for creating and stopping kernel threads without mess. */
   4#include <linux/err.h>
   5#include <linux/sched.h>
   6
   7__printf(4, 5)
   8struct task_struct *kthread_create_on_node(int (*threadfn)(void *data),
   9                                           void *data,
  10                                           int node,
  11                                           const char namefmt[], ...);
  12
  13#define kthread_create(threadfn, data, namefmt, arg...) \
  14        kthread_create_on_node(threadfn, data, -1, namefmt, ##arg)
  15
  16
  17struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
  18                                          void *data,
  19                                          unsigned int cpu,
  20                                          const char *namefmt);
  21
  22/**
  23 * kthread_run - create and wake a thread.
  24 * @threadfn: the function to run until signal_pending(current).
  25 * @data: data ptr for @threadfn.
  26 * @namefmt: printf-style name for the thread.
  27 *
  28 * Description: Convenient wrapper for kthread_create() followed by
  29 * wake_up_process().  Returns the kthread or ERR_PTR(-ENOMEM).
  30 */
  31#define kthread_run(threadfn, data, namefmt, ...)                          \
  32({                                                                         \
  33        struct task_struct *__k                                            \
  34                = kthread_create(threadfn, data, namefmt, ## __VA_ARGS__); \
  35        if (!IS_ERR(__k))                                                  \
  36                wake_up_process(__k);                                      \
  37        __k;                                                               \
  38})
  39
  40void kthread_bind(struct task_struct *k, unsigned int cpu);
  41int kthread_stop(struct task_struct *k);
  42bool kthread_should_stop(void);
  43bool kthread_should_park(void);
  44bool kthread_freezable_should_stop(bool *was_frozen);
  45void *kthread_data(struct task_struct *k);
  46void *probe_kthread_data(struct task_struct *k);
  47int kthread_park(struct task_struct *k);
  48void kthread_unpark(struct task_struct *k);
  49void kthread_parkme(void);
  50
  51int kthreadd(void *unused);
  52extern struct task_struct *kthreadd_task;
  53extern int tsk_fork_get_node(struct task_struct *tsk);
  54
  55/*
  56 * Simple work processor based on kthread.
  57 *
  58 * This provides easier way to make use of kthreads.  A kthread_work
  59 * can be queued and flushed using queue/flush_kthread_work()
  60 * respectively.  Queued kthread_works are processed by a kthread
  61 * running kthread_worker_fn().
  62 */
  63struct kthread_work;
  64typedef void (*kthread_work_func_t)(struct kthread_work *work);
  65
  66struct kthread_worker {
  67        spinlock_t              lock;
  68        struct list_head        work_list;
  69        struct task_struct      *task;
  70        struct kthread_work     *current_work;
  71};
  72
  73struct kthread_work {
  74        struct list_head        node;
  75        kthread_work_func_t     func;
  76        struct kthread_worker   *worker;
  77};
  78
  79#define KTHREAD_WORKER_INIT(worker)     {                               \
  80        .lock = __SPIN_LOCK_UNLOCKED((worker).lock),                    \
  81        .work_list = LIST_HEAD_INIT((worker).work_list),                \
  82        }
  83
  84#define KTHREAD_WORK_INIT(work, fn)     {                               \
  85        .node = LIST_HEAD_INIT((work).node),                            \
  86        .func = (fn),                                                   \
  87        }
  88
  89#define DEFINE_KTHREAD_WORKER(worker)                                   \
  90        struct kthread_worker worker = KTHREAD_WORKER_INIT(worker)
  91
  92#define DEFINE_KTHREAD_WORK(work, fn)                                   \
  93        struct kthread_work work = KTHREAD_WORK_INIT(work, fn)
  94
  95/*
  96 * kthread_worker.lock needs its own lockdep class key when defined on
  97 * stack with lockdep enabled.  Use the following macros in such cases.
  98 */
  99#ifdef CONFIG_LOCKDEP
 100# define KTHREAD_WORKER_INIT_ONSTACK(worker)                            \
 101        ({ init_kthread_worker(&worker); worker; })
 102# define DEFINE_KTHREAD_WORKER_ONSTACK(worker)                          \
 103        struct kthread_worker worker = KTHREAD_WORKER_INIT_ONSTACK(worker)
 104#else
 105# define DEFINE_KTHREAD_WORKER_ONSTACK(worker) DEFINE_KTHREAD_WORKER(worker)
 106#endif
 107
 108extern void __init_kthread_worker(struct kthread_worker *worker,
 109                        const char *name, struct lock_class_key *key);
 110
 111#define init_kthread_worker(worker)                                     \
 112        do {                                                            \
 113                static struct lock_class_key __key;                     \
 114                __init_kthread_worker((worker), "("#worker")->lock", &__key); \
 115        } while (0)
 116
 117#define init_kthread_work(work, fn)                                     \
 118        do {                                                            \
 119                memset((work), 0, sizeof(struct kthread_work));         \
 120                INIT_LIST_HEAD(&(work)->node);                          \
 121                (work)->func = (fn);                                    \
 122        } while (0)
 123
 124int kthread_worker_fn(void *worker_ptr);
 125
 126bool queue_kthread_work(struct kthread_worker *worker,
 127                        struct kthread_work *work);
 128void flush_kthread_work(struct kthread_work *work);
 129void flush_kthread_worker(struct kthread_worker *worker);
 130
 131#endif /* _LINUX_KTHREAD_H */
 132