04 Aug, 2012

11 commits

  • * Use bool @is_dwork instead of @timer and let try_to_grab_pending()
    use to_delayed_work() to determine the delayed_work address.

    * Move timer handling from __cancel_work_timer() to
    try_to_grab_pending().

    * Make try_to_grab_pending() use -EAGAIN instead of -1 for
    busy-looping and drop the ret local variable.

    * Add proper function comment to try_to_grab_pending().

    This makes the code a bit easier to understand and will ease further
    changes. This patch doesn't make any functional change.

    v2: Use @is_dwork instead of @timer.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • This is to prepare for mod_delayed_work[_on]() and doesn't cause any
    functional difference.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Low WORK_STRUCT_FLAG_BITS bits of work_struct->data contain
    WORK_STRUCT_FLAG_* and flush color. If the work item is queued, the
    rest point to the cpu_workqueue with WORK_STRUCT_CWQ set; otherwise,
    WORK_STRUCT_CWQ is clear and the bits contain the last CPU number -
    either a real CPU number or one of WORK_CPU_*.

    Scheduled addition of mod_delayed_work[_on]() requires an additional
    flag, which is used only while a work item is off queue. There are
    more than enough bits to represent off-queue CPU number on both 32 and
    64bits. This patch introduces WORK_OFFQ_FLAG_* which occupy the lower
    part of the @work->data high bits while off queue. This patch doesn't
    define any actual OFFQ flag yet.

    Off-queue CPU number is now shifted by WORK_OFFQ_CPU_SHIFT, which adds
    the number of bits used by OFFQ flags to WORK_STRUCT_FLAG_SHIFT, to
    make room for OFFQ flags.

    To avoid shift width warning with large WORK_OFFQ_FLAG_BITS, ulong
    cast is added to WORK_STRUCT_NO_CPU and, just in case, BUILD_BUG_ON()
    to check that there are enough bits to accomodate off-queue CPU number
    is added.

    This patch doesn't make any functional difference.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • try_to_grab_pending() will be used by to-be-implemented
    mod_delayed_work[_on](). Move try_to_grab_pending() and related
    functions above queueing functions.

    This patch only moves functions around.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • If @delay is zero and the dealyed_work is idle, queue_delayed_work()
    queues it for immediate execution; however, queue_delayed_work_on()
    lacks this logic and always goes through timer regardless of @delay.

    This patch moves 0 @delay handling logic from queue_delayed_work() to
    queue_delayed_work_on() so that both functions behave the same.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Queueing functions have been using different methods to determine the
    local CPU.

    * queue_work() superflously uses get/put_cpu() to acquire and hold the
    local CPU across queue_work_on().

    * delayed_work_timer_fn() uses smp_processor_id().

    * queue_delayed_work() calls queue_delayed_work_on() with -1 @cpu
    which is interpreted as the local CPU.

    * flush_delayed_work[_sync]() were using raw_smp_processor_id().

    * __queue_work() interprets %WORK_CPU_UNBOUND as local CPU if the
    target workqueue is bound one but nobody uses this.

    This patch converts all functions to uniformly use %WORK_CPU_UNBOUND
    to indicate local CPU and use the local binding feature of
    __queue_work(). unlikely() is dropped from %WORK_CPU_UNBOUND handling
    in __queue_work().

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • delayed_work->timer.function is currently initialized during
    queue_delayed_work_on(). Export delayed_work_timer_fn() and set
    delayed_work timer function during delayed_work initialization
    together with other fields.

    This ensures the timer function is always valid on an initialized
    delayed_work. This is to help mod_delayed_work() implementation.

    To detect delayed_work users which diddle with the internal timer,
    trigger WARN if timer function doesn't match on queue.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Queueing operations use WORK_STRUCT_PENDING_BIT to synchronize access
    to the target work item. They first try to claim the bit and proceed
    with queueing only after that succeeds and there's a window between
    PENDING being set and the actual queueing where the task can be
    interrupted or preempted.

    There's also a similar window in process_one_work() when clearing
    PENDING. A work item is dequeued, gcwq->lock is released and then
    PENDING is cleared and the worker might get interrupted or preempted
    between releasing gcwq->lock and clearing PENDING.

    cancel[_delayed]_work_sync() tries to claim or steal PENDING. The
    function assumes that a work item with PENDING is either queued or in
    the process of being [de]queued. In the latter case, it busy-loops
    until either the work item loses PENDING or is queued. If canceling
    coincides with the above described interrupts or preemptions, the
    canceling task will busy-loop while the queueing or executing task is
    preempted.

    This patch keeps irq disabled across claiming PENDING and actual
    queueing and moves PENDING clearing in process_one_work() inside
    gcwq->lock so that busy looping from PENDING && !queued doesn't wait
    for interrupted/preempted tasks. Note that, in process_one_work(),
    setting last CPU and clearing PENDING got merged into single
    operation.

    This removes possible long busy-loops and will allow using
    try_to_grab_pending() from bh and irq contexts.

    v2: __queue_work() was testing preempt_count() to ensure that the
    caller has disabled preemption. This triggers spuriously if
    !CONFIG_PREEMPT_COUNT. Use preemptible() instead. Reported by
    Fengguang Wu.

    v3: Disable irq instead of preemption. IRQ will be disabled while
    grabbing gcwq->lock later anyway and this allows using
    try_to_grab_pending() from bh and irq contexts.

    Signed-off-by: Tejun Heo
    Cc: Oleg Nesterov
    Cc: Fengguang Wu

    Tejun Heo
     
  • WORK_STRUCT_PENDING is used to claim ownership of a work item and
    process_one_work() releases it before starting execution. When
    someone else grabs PENDING, all pre-release updates to the work item
    should be visible and all updates made by the new owner should happen
    afterwards.

    Grabbing PENDING uses test_and_set_bit() and thus has a full barrier;
    however, clearing doesn't have a matching wmb. Given the preceding
    spin_unlock and use of clear_bit, I don't believe this can be a
    problem on an actual machine and there hasn't been any related report
    but it still is theretically possible for clear_pending to permeate
    upwards and happen before work->entry update.

    Add an explicit smp_wmb() before work_clear_pending().

    Signed-off-by: Tejun Heo
    Cc: Oleg Nesterov
    Cc: stable@vger.kernel.org

    Tejun Heo
     
  • All queueing functions return 1 on success, 0 if the work item was
    already pending. Update them to return bool instead. This signifies
    better that they don't return 0 / -errno.

    This is cleanup and doesn't cause any functional difference.

    While at it, fix comment opening for schedule_work_on().

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Currently, queue/schedule[_delayed]_work_on() are located below the
    counterpart without the _on postifx even though the latter is usually
    implemented using the former. Swap them.

    This is cleanup and doesn't cause any functional difference.

    Signed-off-by: Tejun Heo

    Tejun Heo
     

23 Jul, 2012

1 commit

  • 25511a4776 "workqueue: reimplement CPU online rebinding to handle idle
    workers" added CPU locality sanity check in process_one_work(). It
    triggers if a worker is executing on a different CPU without UNBOUND
    or REBIND set.

    This works for all normal workers but rescuers can trigger this
    spuriously when they're serving the unbound or a disassociated
    global_cwq - rescuers don't have either flag set and thus its
    gcwq->cpu can be a different value including %WORK_CPU_UNBOUND.

    Fix it by additionally testing %GCWQ_DISASSOCIATED.

    Signed-off-by: Tejun Heo
    Reported-by: "Paul E. McKenney"
    LKML-Refence:

    Tejun Heo
     

18 Jul, 2012

9 commits

  • With trustee gone, CPU hotplug code can be simplified.

    * gcwq_claim/release_management() now grab and release gcwq lock too
    respectively and gained _and_lock and _and_unlock postfixes.

    * All CPU hotplug logic was implemented in workqueue_cpu_callback()
    which was called by workqueue_cpu_up/down_callback() for the correct
    priority. This was because up and down paths shared a lot of logic,
    which is no longer true. Remove workqueue_cpu_callback() and move
    all hotplug logic into the two actual callbacks.

    This patch doesn't make any functional changes.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • With the previous changes, a disassociated global_cwq now can run as
    an unbound one on its own - it can create workers as necessary to
    drain remaining works after the CPU has been brought down and manage
    the number of workers using the usual idle timer mechanism making
    trustee completely redundant except for the actual unbinding
    operation.

    This patch removes the trustee and let a disassociated global_cwq
    manage itself. Unbinding is moved to a work item (for CPU affinity)
    which is scheduled and flushed from CPU_DONW_PREPARE.

    This patch moves nr_running clearing outside gcwq and manager locks to
    simplify the code. As nr_running is unused at the point, this is
    safe.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • Currently, during CPU offlining, after all pending work items are
    drained, the trustee butchers all workers. Also, on CPU onlining
    failure, workqueue_cpu_callback() ensures that the first idle worker
    is destroyed. Combined, these guarantee that an offline CPU doesn't
    have any worker for it once all the lingering work items are finished.

    This guarantee isn't really necessary and makes CPU on/offlining more
    expensive than needs to be, especially for platforms which use CPU
    hotplug for powersaving.

    This patch lets offline CPUs removes idle worker butchering from the
    trustee and let a CPU which failed onlining keep the created first
    worker. The first worker is created if the CPU doesn't have any
    during CPU_DOWN_PREPARE and started right away. If onlining succeeds,
    the rebind_workers() call in CPU_ONLINE will rebind it like any other
    workers. If onlining fails, the worker is left alone till the next
    try.

    This makes CPU hotplugs cheaper by allowing global_cwqs to keep
    workers across them and simplifies code.

    Note that trustee doesn't re-arm idle timer when it's done and thus
    the disassociated global_cwq will keep all workers until it comes back
    online. This will be improved by further patches.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • Currently, if there are left workers when a CPU is being brough back
    online, the trustee kills all idle workers and scheduled rebind_work
    so that they re-bind to the CPU after the currently executing work is
    finished. This works for busy workers because concurrency management
    doesn't try to wake up them from scheduler callbacks, which require
    the target task to be on the local run queue. The busy worker bumps
    concurrency counter appropriately as it clears WORKER_UNBOUND from the
    rebind work item and it's bound to the CPU before returning to the
    idle state.

    To reduce CPU on/offlining overhead (as many embedded systems use it
    for powersaving) and simplify the code path, workqueue is planned to
    be modified to retain idle workers across CPU on/offlining. This
    patch reimplements CPU online rebinding such that it can also handle
    idle workers.

    As noted earlier, due to the local wakeup requirement, rebinding idle
    workers is tricky. All idle workers must be re-bound before scheduler
    callbacks are enabled. This is achieved by interlocking idle
    re-binding. Idle workers are requested to re-bind and then hold until
    all idle re-binding is complete so that no bound worker starts
    executing work item. Only after all idle workers are re-bound and
    parked, CPU_ONLINE proceeds to release them and queue rebind work item
    to busy workers thus guaranteeing scheduler callbacks aren't invoked
    until all idle workers are ready.

    worker_rebind_fn() is renamed to busy_worker_rebind_fn() and
    idle_worker_rebind() for idle workers is added. Rebinding logic is
    moved to rebind_workers() and now called from CPU_ONLINE after
    flushing trustee. While at it, add CPU sanity check in
    worker_thread().

    Note that now a worker may become idle or the manager between trustee
    release and rebinding during CPU_ONLINE. As the previous patch
    updated create_worker() so that it can be used by regular manager
    while unbound and this patch implements idle re-binding, this is safe.

    This prepares for removal of trustee and keeping idle workers across
    CPU hotplugs.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • Currently, create_worker()'s callers are responsible for deciding
    whether the newly created worker should be bound to the associated CPU
    and create_worker() sets WORKER_UNBOUND only for the workers for the
    unbound global_cwq. Creation during normal operation is always via
    maybe_create_worker() and @bind is true. For workers created during
    hotplug, @bind is false.

    Normal operation path is planned to be used even while the CPU is
    going through hotplug operations or offline and this static decision
    won't work.

    Drop @bind from create_worker() and decide whether to bind by looking
    at GCWQ_DISASSOCIATED. create_worker() will also set WORKER_UNBOUND
    autmatically if disassociated. To avoid flipping GCWQ_DISASSOCIATED
    while create_worker() is in progress, the flag is now allowed to be
    changed only while holding all manager_mutexes on the global_cwq.

    This requires that GCWQ_DISASSOCIATED is not cleared behind trustee's
    back. CPU_ONLINE no longer clears DISASSOCIATED before flushing
    trustee, which clears DISASSOCIATED before rebinding remaining workers
    if asked to release. For cases where trustee isn't around, CPU_ONLINE
    clears DISASSOCIATED after flushing trustee. Also, now, first_idle
    has UNBOUND set on creation which is explicitly cleared by CPU_ONLINE
    while binding it. These convolutions will soon be removed by further
    simplification of CPU hotplug path.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • POOL_MANAGING_WORKERS is used to ensure that at most one worker takes
    the manager role at any given time on a given global_cwq. Trustee
    later hitched on it to assume manager adding blocking wait for the
    bit. As trustee already needed a custom wait mechanism, waiting for
    MANAGING_WORKERS was rolled into the same mechanism.

    Trustee is scheduled to be removed. This patch separates out
    MANAGING_WORKERS wait into per-pool mutex. Workers use
    mutex_trylock() to test for manager role and trustee uses mutex_lock()
    to claim manager roles.

    gcwq_claim/release_management() helpers are added to grab and release
    manager roles of all pools on a global_cwq. gcwq_claim_management()
    always grabs pool manager mutexes in ascending pool index order and
    uses pool index as lockdep subclass.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • Currently, WORKER_UNBOUND is used to mark workers for the unbound
    global_cwq and WORKER_ROGUE is used to mark workers for disassociated
    per-cpu global_cwqs. Both are used to make the marked worker skip
    concurrency management and the only place they make any difference is
    in worker_enter_idle() where WORKER_ROGUE is used to skip scheduling
    idle timer, which can easily be replaced with trustee state testing.

    This patch replaces WORKER_ROGUE with WORKER_UNBOUND and drops
    WORKER_ROGUE. This is to prepare for removing trustee and handling
    disassociated global_cwqs as unbound.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • Workqueue used CPU_DYING notification to mark GCWQ_DISASSOCIATED.
    This was necessary because workqueue's CPU_DOWN_PREPARE happened
    before other DOWN_PREPARE notifiers and workqueue needed to stay
    associated across the rest of DOWN_PREPARE.

    After the previous patch, workqueue's DOWN_PREPARE happens after
    others and can set GCWQ_DISASSOCIATED directly. Drop CPU_DYING and
    let the trustee set GCWQ_DISASSOCIATED after disabling concurrency
    management.

    Signed-off-by: Tejun Heo
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     
  • Currently, all workqueue cpu hotplug operations run off
    CPU_PRI_WORKQUEUE which is higher than normal notifiers. This is to
    ensure that workqueue is up and running while bringing up a CPU before
    other notifiers try to use workqueue on the CPU.

    Per-cpu workqueues are supposed to remain working and bound to the CPU
    for normal CPU_DOWN_PREPARE notifiers. This holds mostly true even
    with workqueue offlining running with higher priority because
    workqueue CPU_DOWN_PREPARE only creates a bound trustee thread which
    runs the per-cpu workqueue without concurrency management without
    explicitly detaching the existing workers.

    However, if the trustee needs to create new workers, it creates
    unbound workers which may wander off to other CPUs while
    CPU_DOWN_PREPARE notifiers are in progress. Furthermore, if the CPU
    down is cancelled, the per-CPU workqueue may end up with workers which
    aren't bound to the CPU.

    While reliably reproducible with a convoluted artificial test-case
    involving scheduling and flushing CPU burning work items from CPU down
    notifiers, this isn't very likely to happen in the wild, and, even
    when it happens, the effects are likely to be hidden by the following
    successful CPU down.

    Fix it by using different priorities for up and down notifiers - high
    priority for up operations and low priority for down operations.

    Workqueue cpu hotplug operations will soon go through further cleanup.

    Signed-off-by: Tejun Heo
    Cc: stable@vger.kernel.org
    Acked-by: "Rafael J. Wysocki"

    Tejun Heo
     

14 Jul, 2012

2 commits

  • 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: Tejun Heo
    Reported-by: Josh Hunt
    LKML-Reference:
    Cc: Tony Luck
    Cc: Fengguang Wu

    Tejun Heo
     
  • Introduce NR_WORKER_POOLS and for_each_worker_pool() and convert code
    paths which need to manipulate all pools in a gcwq to use them.
    NR_WORKER_POOLS is currently one and for_each_worker_pool() iterates
    over only @gcwq->pool.

    Note that nr_running is per-pool property and converted to an array
    with NR_WORKER_POOLS elements and renamed to pool_nr_running. Note
    that get_pool_nr_running() currently assumes 0 index. The next patch
    will make use of non-zero index.

    The changes in this patch are mechanical and don't caues any
    functional difference. This is to prepare for multiple pools per
    gcwq.

    v2: nr_running indexing bug in get_pool_nr_running() fixed.

    v3: Pointer to array is stupid. Don't use it in get_pool_nr_running()
    as suggested by Linus.

    Signed-off-by: Tejun Heo
    Cc: Tony Luck
    Cc: Fengguang Wu
    Cc: Linus Torvalds

    Tejun Heo
     

13 Jul, 2012

4 commits

  • GCWQ_MANAGE_WORKERS, GCWQ_MANAGING_WORKERS and GCWQ_HIGHPRI_PENDING
    are per-pool properties. Add worker_pool->flags and make the above
    three flags per-pool flags.

    The changes in this patch are mechanical and don't caues any
    functional difference. This is to prepare for multiple pools per
    gcwq.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Modify all functions which deal with per-pool properties to pass
    around @pool instead of @gcwq or @cpu.

    The changes in this patch are mechanical and don't caues any
    functional difference. This is to prepare for multiple pools per
    gcwq.

    Signed-off-by: Tejun Heo

    Tejun Heo
     
  • Move worklist and all worker management fields from global_cwq into
    the new struct worker_pool. worker_pool points back to the containing
    gcwq. worker and cpu_workqueue_struct are updated to point to
    worker_pool instead of gcwq too.

    This change is mechanical and doesn't introduce any functional
    difference other than rearranging of fields and an added level of
    indirection in some places. This is to prepare for multiple pools per
    gcwq.

    v2: Comment typo fixes as suggested by Namhyung.

    Signed-off-by: Tejun Heo
    Cc: Namhyung Kim

    Tejun Heo
     
  • Unbound wqs aren't concurrency-managed and try to execute work items
    as soon as possible. This is currently achieved by implicitly setting
    %WQ_HIGHPRI on all unbound workqueues; however, WQ_HIGHPRI
    implementation is about to be restructured and this usage won't be
    valid anymore.

    Add an explicit chain-wakeup path for unbound workqueues in
    process_one_work() instead of piggy backing on %WQ_HIGHPRI.

    Signed-off-by: Tejun Heo

    Tejun Heo
     

15 May, 2012

2 commits

  • Under memory load, on x86_64, with lockdep enabled, the workqueue's
    process_one_work() has been seen to oops in __lock_acquire(), barfing
    on a 0xffffffff00000000 pointer in the lockdep_map's class_cache[].

    Because it's permissible to free a work_struct from its callout function,
    the map used is an onstack copy of the map given in the work_struct: and
    that copy is made without any locking.

    Surprisingly, gcc (4.5.1 in Hugh's case) uses "rep movsl" rather than
    "rep movsq" for that structure copy: which might race with a workqueue
    user's wait_on_work() doing lock_map_acquire() on the source of the
    copy, putting a pointer into the class_cache[], but only in time for
    the top half of that pointer to be copied to the destination map.

    Boom when process_one_work() subsequently does lock_map_acquire()
    on its onstack copy of the lockdep_map.

    Fix this, and a similar instance in call_timer_fn(), with a
    lockdep_copy_map() function which additionally NULLs the class_cache[].

    Note: this oops was actually seen on 3.4-next, where flush_work() newly
    does the racing lock_map_acquire(); but Tejun points out that 3.4 and
    earlier are already vulnerable to the same through wait_on_work().

    * Patch orginally from Peter. Hugh modified it a bit and wrote the
    description.

    Signed-off-by: Peter Zijlstra
    Reported-by: Hugh Dickins
    LKML-Reference:
    Signed-off-by: Tejun Heo

    Peter Zijlstra
     
  • worker_enter_idle() has WARN_ON_ONCE() which triggers if nr_running
    isn't zero when every worker is idle. This can trigger spuriously
    while a cpu is going down due to the way trustee sets %WORKER_ROGUE
    and zaps nr_running.

    It first sets %WORKER_ROGUE on all workers without updating
    nr_running, releases gcwq->lock, schedules, regrabs gcwq->lock and
    then zaps nr_running. If the last running worker enters idle
    inbetween, it would see stale nr_running which hasn't been zapped yet
    and trigger the WARN_ON_ONCE().

    Fix it by performing the sanity check iff the trustee is idle.

    Signed-off-by: Tejun Heo
    Reported-by: "Paul E. McKenney"
    Cc: stable@vger.kernel.org

    Tejun Heo
     

24 Apr, 2012

1 commit

  • If a workqueue is flushed with flush_work() lockdep checking can
    be circumvented. For example:

    static DEFINE_MUTEX(mutex);

    static void my_work(struct work_struct *w)
    {
    mutex_lock(&mutex);
    mutex_unlock(&mutex);
    }

    static DECLARE_WORK(work, my_work);

    static int __init start_test_module(void)
    {
    schedule_work(&work);
    return 0;
    }
    module_init(start_test_module);

    static void __exit stop_test_module(void)
    {
    mutex_lock(&mutex);
    flush_work(&work);
    mutex_unlock(&mutex);
    }
    module_exit(stop_test_module);

    would not always print a warning when flush_work() was called.
    In this trivial example nothing could go wrong since we are
    guaranteed module_init() and module_exit() don't run concurrently,
    but if the work item is schedule asynchronously we could have a
    scenario where the work item is running just at the time flush_work()
    is called resulting in a classic ABBA locking problem.

    Add a lockdep hint by acquiring and releasing the work item
    lockdep_map in flush_work() so that we always catch this
    potential deadlock scenario.

    Signed-off-by: Stephen Boyd
    Reviewed-by: Yong Zhang
    Signed-off-by: Tejun Heo

    Stephen Boyd
     

17 Apr, 2012

1 commit

  • This BUG_ON() can be triggered if you call schedule_work() before
    calling INIT_WORK(). It is a bug definitely, but it's nicer to just
    print a stack trace and return.

    Reported-by: Matt Renzelmann
    Signed-off-by: Dan Carpenter
    Signed-off-by: Tejun Heo

    Dan Carpenter
     

21 Mar, 2012

1 commit


13 Mar, 2012

1 commit


02 Mar, 2012

1 commit

  • This patch (as1519) fixes a bug in the block layer's disk-events
    polling. The polling is done by a work routine queued on the
    system_nrt_wq workqueue. Since that workqueue isn't freezable, the
    polling continues even in the middle of a system sleep transition.

    Obviously, polling a suspended drive for media changes and such isn't
    a good thing to do; in the case of USB mass-storage devices it can
    lead to real problems requiring device resets and even re-enumeration.

    The patch fixes things by creating a new system-wide, non-reentrant,
    freezable workqueue and using it for disk-events polling.

    Signed-off-by: Alan Stern
    CC:
    Acked-by: Tejun Heo
    Acked-by: Rafael J. Wysocki
    Signed-off-by: Jens Axboe

    Alan Stern
     

11 Jan, 2012

1 commit

  • alloc_workqueue() currently expects the passed in @name pointer to remain
    accessible. This is inconvenient and a bit silly given that the whole wq
    is being dynamically allocated. This patch updates alloc_workqueue() and
    friends to take printf format string instead of opaque string and matching
    varargs at the end. The name is allocated together with the wq and
    formatted.

    alloc_ordered_workqueue() is converted to a macro to unify varargs
    handling with alloc_workqueue(), and, while at it, add comment to
    alloc_workqueue().

    None of the current in-kernel users pass in string with '%' as constant
    name and this change shouldn't cause any problem.

    [akpm@linux-foundation.org: use __printf]
    Signed-off-by: Tejun Heo
    Suggested-by: Christoph Hellwig
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Tejun Heo
     

31 Oct, 2011

1 commit

  • The changed files were only including linux/module.h for the
    EXPORT_SYMBOL infrastructure, and nothing else. Revector them
    onto the isolated export header for faster compile times.

    Nothing to see here but a whole lot of instances of:

    -#include
    +#include

    This commit is only changing the kernel dir; next targets
    will probably be mm, fs, the arch dirs, etc.

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     

15 Sep, 2011

1 commit

  • Take cwq->gcwq->lock to avoid racing between drain_workqueue checking to
    make sure the workqueues are empty and cwq_dec_nr_in_flight decrementing
    and then incrementing nr_active when it activates a delayed work.

    We discovered this when a corner case in one of our drivers resulted in
    us trying to destroy a workqueue in which the remaining work would
    always requeue itself again in the same workqueue. We would hit this
    race condition and trip the BUG_ON on workqueue.c:3080.

    Signed-off-by: Thomas Tuttle
    Acked-by: Tejun Heo
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Thomas Tuttle
     

23 Jul, 2011

1 commit


25 May, 2011

1 commit


20 May, 2011

1 commit

  • There are users which want to drain workqueues without destroying it.
    Separate out drain functionality from destroy_workqueue() into
    drain_workqueue() and make it accessible to workqueue users.

    To guarantee forward-progress, only chain queueing is allowed while
    drain is in progress. If a new work item which isn't chained from the
    running or pending work items is queued while draining is in progress,
    WARN_ON_ONCE() is triggered.

    Signed-off-by: Tejun Heo
    Cc: James Bottomley

    Tejun Heo