lkml.org 
[lkml]   [2015]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.4 054/146] nfs: fix high load average due to callback thread sleeping
    Date
    From: Jeff Layton <jlayton@poochiereds.net>

    3.4.109-rc1 review patch. If anyone has any objections, please let me know.

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


    commit 5d05e54af3cdbb13cf19c557ff2184781b91a22c upstream.

    Chuck pointed out a problem that crept in with commit 6ffa30d3f734 (nfs:
    don't call blocking operations while !TASK_RUNNING). Linux counts tasks
    in uninterruptible sleep against the load average, so this caused the
    system's load average to be pinned at at least 1 when there was a
    NFSv4.1+ mount active.

    Not a huge problem, but it's probably worth fixing before we get too
    many complaints about it. This patch converts the code back to use
    TASK_INTERRUPTIBLE sleep, simply has it flush any signals on each loop
    iteration. In practice no one should really be signalling this thread at
    all, so I think this is reasonably safe.

    With this change, there's also no need to game the hung task watchdog so
    we can also convert the schedule_timeout call back to a normal schedule.

    Reported-by: Chuck Lever <chuck.lever@oracle.com>
    Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
    Tested-by: Chuck Lever <chuck.lever@oracle.com>
    Fixes: commit 6ffa30d3f734 (“nfs: don't call blocking . . .”)
    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    [lizf: Backported to 3.4: adjust context]
    Signed-off-by: Zefan Li <lizefan@huawei.com>
    ---
    fs/nfs/callback.c | 6 +++---
    1 file changed, 3 insertions(+), 3 deletions(-)

    diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
    index 07c056c..0184e91 100644
    --- a/fs/nfs/callback.c
    +++ b/fs/nfs/callback.c
    @@ -149,7 +149,7 @@ nfs41_callback_svc(void *vrqstp)
    set_freezable();

    while (!kthread_should_stop()) {
    - prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_UNINTERRUPTIBLE);
    + prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE);
    spin_lock_bh(&serv->sv_cb_lock);
    if (!list_empty(&serv->sv_cb_list)) {
    req = list_first_entry(&serv->sv_cb_list,
    @@ -163,10 +163,10 @@ nfs41_callback_svc(void *vrqstp)
    error);
    } else {
    spin_unlock_bh(&serv->sv_cb_lock);
    - /* schedule_timeout to game the hung task watchdog */
    - schedule_timeout(60 * HZ);
    + schedule();
    finish_wait(&serv->sv_cb_waitq, &wq);
    }
    + flush_signals(current);
    }
    return 0;
    }
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-09-15 11:21    [W:4.164 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site