|
@@ -417,28 +417,16 @@ int apply_workqueue_attrs(struct workqueue_struct *wq,
|
|
|
|
|
|
extern bool queue_work_on(int cpu, struct workqueue_struct *wq,
|
|
|
struct work_struct *work);
|
|
|
-extern bool queue_work(struct workqueue_struct *wq, struct work_struct *work);
|
|
|
extern bool queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
|
|
struct delayed_work *work, unsigned long delay);
|
|
|
-extern bool queue_delayed_work(struct workqueue_struct *wq,
|
|
|
- struct delayed_work *work, unsigned long delay);
|
|
|
extern bool mod_delayed_work_on(int cpu, struct workqueue_struct *wq,
|
|
|
struct delayed_work *dwork, unsigned long delay);
|
|
|
-extern bool mod_delayed_work(struct workqueue_struct *wq,
|
|
|
- struct delayed_work *dwork, unsigned long delay);
|
|
|
|
|
|
extern void flush_workqueue(struct workqueue_struct *wq);
|
|
|
extern void drain_workqueue(struct workqueue_struct *wq);
|
|
|
extern void flush_scheduled_work(void);
|
|
|
|
|
|
-extern bool schedule_work_on(int cpu, struct work_struct *work);
|
|
|
-extern bool schedule_work(struct work_struct *work);
|
|
|
-extern bool schedule_delayed_work_on(int cpu, struct delayed_work *work,
|
|
|
- unsigned long delay);
|
|
|
-extern bool schedule_delayed_work(struct delayed_work *work,
|
|
|
- unsigned long delay);
|
|
|
extern int schedule_on_each_cpu(work_func_t func);
|
|
|
-extern int keventd_up(void);
|
|
|
|
|
|
int execute_in_process_context(work_func_t fn, struct execute_work *);
|
|
|
|
|
@@ -455,6 +443,117 @@ extern bool current_is_workqueue_rescuer(void);
|
|
|
extern bool workqueue_congested(int cpu, struct workqueue_struct *wq);
|
|
|
extern unsigned int work_busy(struct work_struct *work);
|
|
|
|
|
|
+/**
|
|
|
+ * queue_work - queue work on a workqueue
|
|
|
+ * @wq: workqueue to use
|
|
|
+ * @work: work to queue
|
|
|
+ *
|
|
|
+ * Returns %false if @work was already on a queue, %true otherwise.
|
|
|
+ *
|
|
|
+ * We queue the work to the CPU on which it was submitted, but if the CPU dies
|
|
|
+ * it can be processed by another CPU.
|
|
|
+ */
|
|
|
+static inline bool queue_work(struct workqueue_struct *wq,
|
|
|
+ struct work_struct *work)
|
|
|
+{
|
|
|
+ return queue_work_on(WORK_CPU_UNBOUND, wq, work);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * queue_delayed_work - queue work on a workqueue after delay
|
|
|
+ * @wq: workqueue to use
|
|
|
+ * @dwork: delayable work to queue
|
|
|
+ * @delay: number of jiffies to wait before queueing
|
|
|
+ *
|
|
|
+ * Equivalent to queue_delayed_work_on() but tries to use the local CPU.
|
|
|
+ */
|
|
|
+static inline bool queue_delayed_work(struct workqueue_struct *wq,
|
|
|
+ struct delayed_work *dwork,
|
|
|
+ unsigned long delay)
|
|
|
+{
|
|
|
+ return queue_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * mod_delayed_work - modify delay of or queue a delayed work
|
|
|
+ * @wq: workqueue to use
|
|
|
+ * @dwork: work to queue
|
|
|
+ * @delay: number of jiffies to wait before queueing
|
|
|
+ *
|
|
|
+ * mod_delayed_work_on() on local CPU.
|
|
|
+ */
|
|
|
+static inline bool mod_delayed_work(struct workqueue_struct *wq,
|
|
|
+ struct delayed_work *dwork,
|
|
|
+ unsigned long delay)
|
|
|
+{
|
|
|
+ return mod_delayed_work_on(WORK_CPU_UNBOUND, wq, dwork, delay);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * schedule_work_on - put work task on a specific cpu
|
|
|
+ * @cpu: cpu to put the work task on
|
|
|
+ * @work: job to be done
|
|
|
+ *
|
|
|
+ * This puts a job on a specific cpu
|
|
|
+ */
|
|
|
+static inline bool schedule_work_on(int cpu, struct work_struct *work)
|
|
|
+{
|
|
|
+ return queue_work_on(cpu, system_wq, work);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * schedule_work - put work task in global workqueue
|
|
|
+ * @work: job to be done
|
|
|
+ *
|
|
|
+ * Returns %false if @work was already on the kernel-global workqueue and
|
|
|
+ * %true otherwise.
|
|
|
+ *
|
|
|
+ * This puts a job in the kernel-global workqueue if it was not already
|
|
|
+ * queued and leaves it in the same position on the kernel-global
|
|
|
+ * workqueue otherwise.
|
|
|
+ */
|
|
|
+static inline bool schedule_work(struct work_struct *work)
|
|
|
+{
|
|
|
+ return queue_work(system_wq, work);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * schedule_delayed_work_on - queue work in global workqueue on CPU after delay
|
|
|
+ * @cpu: cpu to use
|
|
|
+ * @dwork: job to be done
|
|
|
+ * @delay: number of jiffies to wait
|
|
|
+ *
|
|
|
+ * After waiting for a given time this puts a job in the kernel-global
|
|
|
+ * workqueue on the specified CPU.
|
|
|
+ */
|
|
|
+static inline bool schedule_delayed_work_on(int cpu, struct delayed_work *dwork,
|
|
|
+ unsigned long delay)
|
|
|
+{
|
|
|
+ return queue_delayed_work_on(cpu, system_wq, dwork, delay);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * schedule_delayed_work - put work task in global workqueue after delay
|
|
|
+ * @dwork: job to be done
|
|
|
+ * @delay: number of jiffies to wait or 0 for immediate execution
|
|
|
+ *
|
|
|
+ * After waiting for a given time this puts a job in the kernel-global
|
|
|
+ * workqueue.
|
|
|
+ */
|
|
|
+static inline bool schedule_delayed_work(struct delayed_work *dwork,
|
|
|
+ unsigned long delay)
|
|
|
+{
|
|
|
+ return queue_delayed_work(system_wq, dwork, delay);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * keventd_up - is workqueue initialized yet?
|
|
|
+ */
|
|
|
+static inline bool keventd_up(void)
|
|
|
+{
|
|
|
+ return system_wq != NULL;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Like above, but uses del_timer() instead of del_timer_sync(). This means,
|
|
|
* if it returns 0 the timer function may be running and the queueing is in
|