lkml.org 
[lkml]   [2016]   [Jan]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.2.y-ckt 015/211] task_work: remove fifo ordering guarantee
    Date
    4.2.8-ckt1 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Eric Dumazet <edumazet@google.com>

    commit c82199061009d1561e31e17fca5e47a87cb7ff4c upstream.

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

    Later, commit ac3d0da8f329 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: ac3d0da8f329 ("task_work: Make task_work_add() lockless")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Maciej Żenczykowski <maze@google.com>
    Acked-by: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    kernel/task_work.c | 12 ++----------
    1 file changed, 2 insertions(+), 10 deletions(-)

    diff --git a/kernel/task_work.c b/kernel/task_work.c
    index 8727032..53fa971 100644
    --- a/kernel/task_work.c
    +++ b/kernel/task_work.c
    @@ -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
    * try to wake up the @task.
    *
    + * Note: there is no ordering guarantee on works queued here.
    + *
    * RETURNS:
    * 0 if succeeds or -ESRCH.
    */
    @@ -108,16 +110,6 @@ void task_work_run(void)
    raw_spin_unlock_wait(&task->pi_lock);
    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 {
    next = work->next;
    work->func(work);
    --
    1.9.1


    \
     
     \ /
      Last update: 2016-01-05 22:01    [W:4.032 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site