Commit 34180538 authored by Eric Dumazet's avatar Eric Dumazet Committed by Luis Henriques

task_work: remove fifo ordering guarantee

commit c8219906 upstream.

In commit f341861f ("task_work: add a scheduling point in
task_work_run()") I fixed a latency problem adding a cond_resched()
call.

Later, commit ac3d0da8 added yet another loop to reverse a list,
bringing back the latency spike :

I've seen in some cases this loop taking 275 ms, if for example a
process with 2,000,000 files is killed.

We could add yet another cond_resched() in the reverse loop, or we
can simply remove the reversal, as I do not think anything
would depend on order of task_work_add() submitted works.

Fixes: ac3d0da8 ("task_work: Make task_work_add() lockless")
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Reported-by: default avatarMaciej Żenczykowski <maze@google.com>
Acked-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 723f683d
...@@ -18,6 +18,8 @@ static struct callback_head work_exited; /* all we need is ->next == NULL */ ...@@ -18,6 +18,8 @@ static struct callback_head work_exited; /* all we need is ->next == NULL */
* This is like the signal handler which runs in kernel mode, but it doesn't * This is like the signal handler which runs in kernel mode, but it doesn't
* try to wake up the @task. * try to wake up the @task.
* *
* Note: there is no ordering guarantee on works queued here.
*
* RETURNS: * RETURNS:
* 0 if succeeds or -ESRCH. * 0 if succeeds or -ESRCH.
*/ */
...@@ -108,16 +110,6 @@ void task_work_run(void) ...@@ -108,16 +110,6 @@ void task_work_run(void)
raw_spin_unlock_wait(&task->pi_lock); raw_spin_unlock_wait(&task->pi_lock);
smp_mb(); smp_mb();
/* Reverse the list to run the works in fifo order */
head = NULL;
do {
next = work->next;
work->next = head;
head = work;
work = next;
} while (work);
work = head;
do { do {
next = work->next; next = work->next;
work->func(work); work->func(work);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment