• Andrew Morton's avatar
    [PATCH] create singlethread_workqueue() · bf9e688d
    Andrew Morton authored
    From: Rusty Russell <rusty@rustcorp.com.au>
    
    Workqueues are a great primitive for running things from user context from
    a completely clean environment.  Unfortunately, they currently insist on
    creating one thread per CPU, which is overkill for many situations, so the
    more generic keventd workqueue is used for these.  Recently deadlocks using
    keventd were demonstrated, showing that it is not suitable for all uses.
    
    1) Clean up CPU iterators.  Always a nice touch.
    
    2) Add __create_workqueue() and create_singlethread_workqueue(),
       keeping source compatibility.
    
    3) Put workqueues in workqueue list even if !CONFIG_HOTPLUG_CPU (means
       we need a lock to protect that list).  Now we can tell if a wq is
       single-threaded using list_empty(&wq->list).
    
    4) For single-threaded workqueues, override CPU in queue_work,
       delayed_work_timer_fn and flush_workqueue to be 0.  flush_workqueue
       now does redundant passes for single-threaded workqueues, but the
       code remains simple.
    
    5) Make create_workqueue_thread return the thread, so we can easily
       kthread_bind for multi-threaded workqueues.
    
    
    akpm fixes:
    
    - Fix up is_single_threaded() handling
    
    - single-threaded wq thread does not have "/0" appended.
    bf9e688d
workqueue.c 12 KB