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, NUMA_NO_NODE, 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);
  41void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask);
  42int kthread_stop(struct task_struct *k);
  43bool kthread_should_stop(void);
  44bool kthread_should_park(void);
  45bool kthread_freezable_should_stop(bool *was_frozen);
  46void *kthread_data(struct task_struct *k);
  47void *probe_kthread_data(struct task_struct *k);
  48int kthread_park(struct task_struct *k);
  49void kthread_unpark(struct task_struct *k);
  50void kthread_parkme(void);
  51
  52int kthreadd(void *unused);
  53extern struct task_struct *kthreadd_task;
  54extern int tsk_fork_get_node(struct task_struct *tsk);
  55
  56/*
  57 * Simple work processor based on kthread.
  58 *
  59 * This provides easier way to make use of kthreads.  A kthread_work
  60 * can be queued and flushed using queue/flush_kthread_work()
  61 * respectively.  Queued kthread_works are processed by a kthread
  62 * running kthread_worker_fn().
  63 */
  64struct kthread_work;
  65typedef void (*kthread_work_func_t)(struct kthread_work *work);
  66
  67struct kthread_worker {
  68        spinlock_t              lock;
  69        struct list_head        work_list;
  70        struct task_struct      *task;
  71        struct kthread_work     *current_work;
  72};
  73
  74struct kthread_work {
  75        struct list_head        node;
  76        kthread_work_func_t     func;
  77        struct kthread_worker   *worker;
  78};
  79
  80#define KTHREAD_WORKER_INIT(worker)     {                               \
  81        .lock = __SPIN_LOCK_UNLOCKED((worker).lock),                    \
  82        .work_list = LIST_HEAD_INIT((worker).work_list),                \
  83        }
  84
  85#define KTHREAD_WORK_INIT(work, fn)     {                               \
  86        .node = LIST_HEAD_INIT((work).node),                            \
  87        .func = (fn),                                                   \
  88        }
  89
  90#define DEFINE_KTHREAD_WORKER(worker)                                   \
  91        struct kthread_worker worker = KTHREAD_WORKER_INIT(worker)
  92
  93#define DEFINE_KTHREAD_WORK(work, fn)                                   \
  94        struct kthread_work work = KTHREAD_WORK_INIT(work, fn)
  95
  96/*
  97 * kthread_worker.lock needs its own lockdep class key when defined on
  98 * stack with lockdep enabled.  Use the following macros in such cases.
  99 */
 100#ifdef CONFIG_LOCKDEP
 101# define KTHREAD_WORKER_INIT_ONSTACK(worker)                            \
 102        ({ init_kthread_worker(&worker); worker; })
 103# define DEFINE_KTHREAD_WORKER_ONSTACK(worker)                          \
 104        struct kthread_worker worker = KTHREAD_WORKER_INIT_ONSTACK(worker)
 105#else
 106# define DEFINE_KTHREAD_WORKER_ONSTACK(worker) DEFINE_KTHREAD_WORKER(worker)
 107#endif
 108
 109extern void __init_kthread_worker(struct kthread_worker *worker,
 110                        const char *name, struct lock_class_key *key);
 111
 112#define init_kthread_worker(worker)                                     \
 113        do {                                                            \
 114                static struct lock_class_key __key;                     \
 115                __init_kthread_worker((worker), "("#worker")->lock", &__key); \
 116        } while (0)
 117
 118#define init_kthread_work(work, fn)                                     \
 119        do {                                                            \
 120                memset((work), 0, sizeof(struct kthread_work));         \
 121                INIT_LIST_HEAD(&(work)->node);                          \
 122                (work)->func = (fn);                                    \
 123        } while (0)
 124
 125int kthread_worker_fn(void *worker_ptr);
 126
 127bool queue_kthread_work(struct kthread_worker *worker,
 128                        struct kthread_work *work);
 129void flush_kthread_work(struct kthread_work *work);
 130void flush_kthread_worker(struct kthread_worker *worker);
 131
 132#endif /* _LINUX_KTHREAD_H */
 133