• NeilBrown's avatar
    NFS: switch nfsiod to be an UNBOUND workqueue. · bf701b76
    NeilBrown authored
    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: default avatarNeilBrown <neilb@suse.de>
    Fixes: ada609ee ("workqueue: use WQ_MEM_RECLAIM instead of WQ_RESCUER")
    Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
    bf701b76
inode.c 62.7 KB