|
@@ -378,6 +378,19 @@ repeat:
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(kthread_worker_fn);
|
|
|
|
|
|
+/* insert @work before @pos in @worker */
|
|
|
+static void insert_kthread_work(struct kthread_worker *worker,
|
|
|
+ struct kthread_work *work,
|
|
|
+ struct list_head *pos)
|
|
|
+{
|
|
|
+ lockdep_assert_held(&worker->lock);
|
|
|
+
|
|
|
+ list_add_tail(&work->node, pos);
|
|
|
+ work->queue_seq++;
|
|
|
+ if (likely(worker->task))
|
|
|
+ wake_up_process(worker->task);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* queue_kthread_work - queue a kthread_work
|
|
|
* @worker: target kthread_worker
|
|
@@ -395,10 +408,7 @@ bool queue_kthread_work(struct kthread_worker *worker,
|
|
|
|
|
|
spin_lock_irqsave(&worker->lock, flags);
|
|
|
if (list_empty(&work->node)) {
|
|
|
- list_add_tail(&work->node, &worker->work_list);
|
|
|
- work->queue_seq++;
|
|
|
- if (likely(worker->task))
|
|
|
- wake_up_process(worker->task);
|
|
|
+ insert_kthread_work(worker, work, &worker->work_list);
|
|
|
ret = true;
|
|
|
}
|
|
|
spin_unlock_irqrestore(&worker->lock, flags);
|
|
@@ -406,6 +416,18 @@ bool queue_kthread_work(struct kthread_worker *worker,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(queue_kthread_work);
|
|
|
|
|
|
+struct kthread_flush_work {
|
|
|
+ struct kthread_work work;
|
|
|
+ struct completion done;
|
|
|
+};
|
|
|
+
|
|
|
+static void kthread_flush_work_fn(struct kthread_work *work)
|
|
|
+{
|
|
|
+ struct kthread_flush_work *fwork =
|
|
|
+ container_of(work, struct kthread_flush_work, work);
|
|
|
+ complete(&fwork->done);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* flush_kthread_work - flush a kthread_work
|
|
|
* @work: work to flush
|
|
@@ -436,18 +458,6 @@ void flush_kthread_work(struct kthread_work *work)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(flush_kthread_work);
|
|
|
|
|
|
-struct kthread_flush_work {
|
|
|
- struct kthread_work work;
|
|
|
- struct completion done;
|
|
|
-};
|
|
|
-
|
|
|
-static void kthread_flush_work_fn(struct kthread_work *work)
|
|
|
-{
|
|
|
- struct kthread_flush_work *fwork =
|
|
|
- container_of(work, struct kthread_flush_work, work);
|
|
|
- complete(&fwork->done);
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* flush_kthread_worker - flush all current works on a kthread_worker
|
|
|
* @worker: worker to flush
|