lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 062/132] NFS: switch nfsiod to be an UNBOUND workqueue.
    Date
    From: NeilBrown <neilb@suse.de>

    [ Upstream commit bf701b765eaa82dd164d65edc5747ec7288bb5c3 ]

    nfsiod is currently a concurrency-managed workqueue (CMWQ).
    This means that workitems scheduled to nfsiod on a given CPU are queued
    behind all other work items queued on any CMWQ on the same CPU. This
    can introduce unexpected latency.

    Occaionally nfsiod can even cause excessive latency. If the work item
    to complete a CLOSE request calls the final iput() on an inode, the
    address_space of that inode will be dismantled. This takes time
    proportional to the number of in-memory pages, which on a large host
    working on large files (e.g.. 5TB), can be a large number of pages
    resulting in a noticable number of seconds.

    We can avoid these latency problems by switching nfsiod to WQ_UNBOUND.
    This causes each concurrent work item to gets a dedicated thread which
    can be scheduled to an idle CPU.

    There is precedent for this as several other filesystems use WQ_UNBOUND
    workqueue for handling various async events.

    Signed-off-by: NeilBrown <neilb@suse.de>
    Fixes: ada609ee2ac2 ("workqueue: use WQ_MEM_RECLAIM instead of WQ_RESCUER")
    Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfs/inode.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
    index d25b55ceb9d58..b152366411917 100644
    --- a/fs/nfs/inode.c
    +++ b/fs/nfs/inode.c
    @@ -1964,7 +1964,7 @@ static int nfsiod_start(void)
    {
    struct workqueue_struct *wq;
    dprintk("RPC: creating workqueue nfsiod\n");
    - wq = alloc_workqueue("nfsiod", WQ_MEM_RECLAIM, 0);
    + wq = alloc_workqueue("nfsiod", WQ_MEM_RECLAIM | WQ_UNBOUND, 0);
    if (wq == NULL)
    return -ENOMEM;
    nfsiod_workqueue = wq;
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 17:47    [W:2.822 / U:0.964 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site