aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/workqueue.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/workqueue.h')
-rw-r--r--include/linux/workqueue.h171
1 files changed, 152 insertions, 19 deletions
diff --git a/include/linux/workqueue.h b/include/linux/workqueue.h
index 8afab27cdbc2..623488fdc1f5 100644
--- a/include/linux/workqueue.h
+++ b/include/linux/workqueue.h
@@ -11,6 +11,7 @@
11#include <linux/lockdep.h> 11#include <linux/lockdep.h>
12#include <linux/threads.h> 12#include <linux/threads.h>
13#include <linux/atomic.h> 13#include <linux/atomic.h>
14#include <linux/cpumask.h>
14 15
15struct workqueue_struct; 16struct workqueue_struct;
16 17
@@ -68,7 +69,7 @@ enum {
68 WORK_STRUCT_COLOR_BITS, 69 WORK_STRUCT_COLOR_BITS,
69 70
70 /* data contains off-queue information when !WORK_STRUCT_PWQ */ 71 /* data contains off-queue information when !WORK_STRUCT_PWQ */
71 WORK_OFFQ_FLAG_BASE = WORK_STRUCT_FLAG_BITS, 72 WORK_OFFQ_FLAG_BASE = WORK_STRUCT_COLOR_SHIFT,
72 73
73 WORK_OFFQ_CANCELING = (1 << WORK_OFFQ_FLAG_BASE), 74 WORK_OFFQ_CANCELING = (1 << WORK_OFFQ_FLAG_BASE),
74 75
@@ -91,6 +92,9 @@ enum {
91 /* bit mask for work_busy() return values */ 92 /* bit mask for work_busy() return values */
92 WORK_BUSY_PENDING = 1 << 0, 93 WORK_BUSY_PENDING = 1 << 0,
93 WORK_BUSY_RUNNING = 1 << 1, 94 WORK_BUSY_RUNNING = 1 << 1,
95
96 /* maximum string length for set_worker_desc() */
97 WORKER_DESC_LEN = 24,
94}; 98};
95 99
96struct work_struct { 100struct work_struct {
@@ -115,6 +119,20 @@ struct delayed_work {
115 int cpu; 119 int cpu;
116}; 120};
117 121
122/*
123 * A struct for workqueue attributes. This can be used to change
124 * attributes of an unbound workqueue.
125 *
126 * Unlike other fields, ->no_numa isn't a property of a worker_pool. It
127 * only modifies how apply_workqueue_attrs() select pools and thus doesn't
128 * participate in pool hash calculations or equality comparisons.
129 */
130struct workqueue_attrs {
131 int nice; /* nice level */
132 cpumask_var_t cpumask; /* allowed CPUs */
133 bool no_numa; /* disable NUMA affinity */
134};
135
118static inline struct delayed_work *to_delayed_work(struct work_struct *work) 136static inline struct delayed_work *to_delayed_work(struct work_struct *work)
119{ 137{
120 return container_of(work, struct delayed_work, work); 138 return container_of(work, struct delayed_work, work);
@@ -283,9 +301,10 @@ enum {
283 WQ_MEM_RECLAIM = 1 << 3, /* may be used for memory reclaim */ 301 WQ_MEM_RECLAIM = 1 << 3, /* may be used for memory reclaim */
284 WQ_HIGHPRI = 1 << 4, /* high priority */ 302 WQ_HIGHPRI = 1 << 4, /* high priority */
285 WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */ 303 WQ_CPU_INTENSIVE = 1 << 5, /* cpu instensive workqueue */
304 WQ_SYSFS = 1 << 6, /* visible in sysfs, see wq_sysfs_register() */
286 305
287 WQ_DRAINING = 1 << 6, /* internal: workqueue is draining */ 306 __WQ_DRAINING = 1 << 16, /* internal: workqueue is draining */
288 WQ_RESCUER = 1 << 7, /* internal: workqueue has rescuer */ 307 __WQ_ORDERED = 1 << 17, /* internal: workqueue is ordered */
289 308
290 WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */ 309 WQ_MAX_ACTIVE = 512, /* I like 512, better ideas? */
291 WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */ 310 WQ_MAX_UNBOUND_PER_CPU = 4, /* 4 * #cpus for unbound wq */
@@ -388,7 +407,7 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active,
388 * Pointer to the allocated workqueue on success, %NULL on failure. 407 * Pointer to the allocated workqueue on success, %NULL on failure.
389 */ 408 */
390#define alloc_ordered_workqueue(fmt, flags, args...) \ 409#define alloc_ordered_workqueue(fmt, flags, args...) \
391 alloc_workqueue(fmt, WQ_UNBOUND | (flags), 1, ##args) 410 alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | (flags), 1, ##args)
392 411
393#define create_workqueue(name) \ 412#define create_workqueue(name) \
394 alloc_workqueue((name), WQ_MEM_RECLAIM, 1) 413 alloc_workqueue((name), WQ_MEM_RECLAIM, 1)
@@ -399,30 +418,23 @@ __alloc_workqueue_key(const char *fmt, unsigned int flags, int max_active,
399 418
400extern void destroy_workqueue(struct workqueue_struct *wq); 419extern void destroy_workqueue(struct workqueue_struct *wq);
401 420
421struct workqueue_attrs *alloc_workqueue_attrs(gfp_t gfp_mask);
422void free_workqueue_attrs(struct workqueue_attrs *attrs);
423int apply_workqueue_attrs(struct workqueue_struct *wq,
424 const struct workqueue_attrs *attrs);
425
402extern bool queue_work_on(int cpu, struct workqueue_struct *wq, 426extern bool queue_work_on(int cpu, struct workqueue_struct *wq,
403 struct work_struct *work); 427 struct work_struct *work);
404extern bool queue_work(struct workqueue_struct *wq, struct work_struct *work);
405extern bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq, 428extern bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
406 struct delayed_work *work, unsigned long delay); 429 struct delayed_work *work, unsigned long delay);
407extern bool queue_delayed_work(struct workqueue_struct *wq,
408 struct delayed_work *work, unsigned long delay);
409extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq, 430extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq,
410 struct delayed_work *dwork, unsigned long delay); 431 struct delayed_work *dwork, unsigned long delay);
411extern bool mod_delayed_work(struct workqueue_struct *wq,
412 struct delayed_work *dwork, unsigned long delay);
413 432
414extern void flush_workqueue(struct workqueue_struct *wq); 433extern void flush_workqueue(struct workqueue_struct *wq);
415extern void drain_workqueue(struct workqueue_struct *wq); 434extern void drain_workqueue(struct workqueue_struct *wq);
416extern void flush_scheduled_work(void); 435extern void flush_scheduled_work(void);
417 436
418extern bool schedule_work_on(int cpu, struct work_struct *work);
419extern bool schedule_work(struct work_struct *work);
420extern bool schedule_delayed_work_on(int cpu, struct delayed_work *work,
421 unsigned long delay);
422extern bool schedule_delayed_work(struct delayed_work *work,
423 unsigned long delay);
424extern int schedule_on_each_cpu(work_func_t func); 437extern int schedule_on_each_cpu(work_func_t func);
425extern int keventd_up(void);
426 438
427int execute_in_process_context(work_func_t fn, struct execute_work *); 439int execute_in_process_context(work_func_t fn, struct execute_work *);
428 440
@@ -435,8 +447,122 @@ extern bool cancel_delayed_work_sync(struct delayed_work *dwork);
435 447
436extern void workqueue_set_max_active(struct workqueue_struct *wq, 448extern void workqueue_set_max_active(struct workqueue_struct *wq,
437 int max_active); 449 int max_active);
438extern bool workqueue_congested(unsigned int cpu, struct workqueue_struct *wq); 450extern bool current_is_workqueue_rescuer(void);
451extern bool workqueue_congested(int cpu, struct workqueue_struct *wq);
439extern unsigned int work_busy(struct work_struct *work); 452extern unsigned int work_busy(struct work_struct *work);
453extern __printf(1, 2) void set_worker_desc(const char *fmt, ...);
454extern void print_worker_info(const char *log_lvl, struct task_struct *task);
455
456/**
457 * queue_work - queue work on a workqueue
458 * @wq: workqueue to use
459 * @work: work to queue
460 *
461 * Returns %false if @work was already on a queue, %true otherwise.
462 *
463 * We queue the work to the CPU on which it was submitted, but if the CPU dies
464 * it can be processed by another CPU.
465 */
466static inline bool queue_work(struct workqueue_struct *wq,
467 struct work_struct *work)
468{
469 return queue_work_on(WORK_CPU_UNBOUND, wq, work);
470}
471
472/**
473 * queue_delayed_work - queue work on a workqueue after delay
474 * @wq: workqueue to use
475 * @dwork: delayable work to queue
476 * @delay: number of jiffies to wait before queueing
477 *
478 * Equivalent to queue_delayed_work_on() but tries to use the local CPU.
479 */
480static inline bool queue_delayed_work(struct workqueue_struct *wq,
481 struct delayed_work *dwork,
482 unsigned long delay)
483{
484 return queue_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay);
485}
486
487/**
488 * mod_delayed_work - modify delay of or queue a delayed work
489 * @wq: workqueue to use
490 * @dwork: work to queue
491 * @delay: number of jiffies to wait before queueing
492 *
493 * mod_delayed_work_on() on local CPU.
494 */
495static inline bool mod_delayed_work(struct workqueue_struct *wq,
496 struct delayed_work *dwork,
497 unsigned long delay)
498{
499 return mod_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay);
500}
501
502/**
503 * schedule_work_on - put work task on a specific cpu
504 * @cpu: cpu to put the work task on
505 * @work: job to be done
506 *
507 * This puts a job on a specific cpu
508 */
509static inline bool schedule_work_on(int cpu, struct work_struct *work)
510{
511 return queue_work_on(cpu, system_wq, work);
512}
513
514/**
515 * schedule_work - put work task in global workqueue
516 * @work: job to be done
517 *
518 * Returns %false if @work was already on the kernel-global workqueue and
519 * %true otherwise.
520 *
521 * This puts a job in the kernel-global workqueue if it was not already
522 * queued and leaves it in the same position on the kernel-global
523 * workqueue otherwise.
524 */
525static inline bool schedule_work(struct work_struct *work)
526{
527 return queue_work(system_wq, work);
528}
529
530/**
531 * schedule_delayed_work_on - queue work in global workqueue on CPU after delay
532 * @cpu: cpu to use
533 * @dwork: job to be done
534 * @delay: number of jiffies to wait
535 *
536 * After waiting for a given time this puts a job in the kernel-global
537 * workqueue on the specified CPU.
538 */
539static inline bool schedule_delayed_work_on(int cpu, struct delayed_work *dwork,
540 unsigned long delay)
541{
542 return queue_delayed_work_on(cpu, system_wq, dwork, delay);
543}
544
545/**
546 * schedule_delayed_work - put work task in global workqueue after delay
547 * @dwork: job to be done
548 * @delay: number of jiffies to wait or 0 for immediate execution
549 *
550 * After waiting for a given time this puts a job in the kernel-global
551 * workqueue.
552 */
553static inline bool schedule_delayed_work(struct delayed_work *dwork,
554 unsigned long delay)
555{
556 return queue_delayed_work(system_wq, dwork, delay);
557}
558
559/**
560 * keventd_up - is workqueue initialized yet?
561 */
562static inline bool keventd_up(void)
563{
564 return system_wq != NULL;
565}
440 566
441/* 567/*
442 * Like above, but uses del_timer() instead of del_timer_sync(). This means, 568 * Like above, but uses del_timer() instead of del_timer_sync(). This means,
@@ -466,12 +592,12 @@ static inline bool __deprecated flush_delayed_work_sync(struct delayed_work *dwo
466} 592}
467 593
468#ifndef CONFIG_SMP 594#ifndef CONFIG_SMP
469static inline long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) 595static inline long work_on_cpu(int cpu, long (*fn)(void *), void *arg)
470{ 596{
471 return fn(arg); 597 return fn(arg);
472} 598}
473#else 599#else
474long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg); 600long work_on_cpu(int cpu, long (*fn)(void *), void *arg);
475#endif /* CONFIG_SMP */ 601#endif /* CONFIG_SMP */
476 602
477#ifdef CONFIG_FREEZER 603#ifdef CONFIG_FREEZER
@@ -480,4 +606,11 @@ extern bool freeze_workqueues_busy(void);
480extern void thaw_workqueues(void); 606extern void thaw_workqueues(void);
481#endif /* CONFIG_FREEZER */ 607#endif /* CONFIG_FREEZER */
482 608
609#ifdef CONFIG_SYSFS
610int workqueue_sysfs_register(struct workqueue_struct *wq);
611#else /* CONFIG_SYSFS */
612static inline int workqueue_sysfs_register(struct workqueue_struct *wq)
613{ return 0; }
614#endif /* CONFIG_SYSFS */
615
483#endif 616#endif