• T
    workqueue: reimplement WQ_HIGHPRI using a separate worker_pool · 3270476a
    Tejun Heo 提交于
    WQ_HIGHPRI was implemented by queueing highpri work items at the head
    of the global worklist.  Other than queueing at the head, they weren't
    handled differently; unfortunately, this could lead to execution
    latency of a few seconds on heavily loaded systems.
    
    Now that workqueue code has been updated to deal with multiple
    worker_pools per global_cwq, this patch reimplements WQ_HIGHPRI using
    a separate worker_pool.  NR_WORKER_POOLS is bumped to two and
    gcwq->pools[0] is used for normal pri work items and ->pools[1] for
    highpri.  Highpri workers get -20 nice level and has 'H' suffix in
    their names.  Note that this change increases the number of kworkers
    per cpu.
    
    POOL_HIGHPRI_PENDING, pool_determine_ins_pos() and highpri chain
    wakeup code in process_one_work() are no longer used and removed.
    
    This allows proper prioritization of highpri work items and removes
    high execution latency of highpri work items.
    
    v2: nr_running indexing bug in get_pool_nr_running() fixed.
    
    v3: Refreshed for the get_pool_nr_running() update in the previous
        patch.
    Signed-off-by: NTejun Heo <tj@kernel.org>
    Reported-by: NJosh Hunt <joshhunt00@gmail.com>
    LKML-Reference: <CAKA=qzaHqwZ8eqpLNFjxnO2fX-tgAOjmpvxgBFjv6dJeQaOW1w@mail.gmail.com>
    Cc: Tony Luck <tony.luck@intel.com>
    Cc: Fengguang Wu <fengguang.wu@intel.com>
    3270476a
workqueue.txt 14.9 KB