1. 19 10月, 2010 1 次提交
    • T
      workqueue: remove in_workqueue_context() · daaae6b0
      Tejun Heo 提交于
      Commit a25909a4 (lockdep: Add an in_workqueue_context() lockdep-based
      test function) added in_workqueue_context() but there hasn't been any
      in-kernel user and the lockdep annotation in workqueue is scheduled to
      change.  Remove the unused function.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
      daaae6b0
  2. 11 10月, 2010 1 次提交
    • T
      workqueue: add and use WQ_MEM_RECLAIM flag · 6370a6ad
      Tejun Heo 提交于
      Add WQ_MEM_RECLAIM flag which currently maps to WQ_RESCUER, mark
      WQ_RESCUER as internal and replace all external WQ_RESCUER usages to
      WQ_MEM_RECLAIM.
      
      This makes the API users express the intent of the workqueue instead
      of indicating the internal mechanism used to guarantee forward
      progress.  This is also to make it cleaner to add more semantics to
      WQ_MEM_RECLAIM.  For example, if deemed necessary, memory reclaim
      workqueues can be made highpri.
      
      This patch doesn't introduce any functional change.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Jeff Garzik <jgarzik@pobox.com>
      Cc: Dave Chinner <david@fromorbit.com>
      Cc: Steven Whitehouse <swhiteho@redhat.com>
      6370a6ad
  3. 19 9月, 2010 3 次提交
    • T
      workqueue: implement flush[_delayed]_work_sync() · 09383498
      Tejun Heo 提交于
      Implement flush[_delayed]_work_sync().  These are flush functions
      which also make sure no CPU is still executing the target work from
      earlier queueing instances.  These are similar to
      cancel[_delayed]_work_sync() except that the target work item is
      flushed instead of cancelled.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      09383498
    • T
      workqueue: cleanup flush/cancel functions · 401a8d04
      Tejun Heo 提交于
      Make the following cleanup changes.
      
      * Relocate flush/cancel function prototypes and definitions.
      
      * Relocate wait_on_cpu_work() and wait_on_work() before
        try_to_grab_pending().  These will be used to implement
        flush_work_sync().
      
      * Make all flush/cancel functions return bool instead of int.
      
      * Update wait_on_cpu_work() and wait_on_work() to return %true if they
        actually waited.
      
      * Add / update comments.
      
      This patch doesn't cause any functional changes.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      401a8d04
    • T
      workqueue: implement alloc_ordered_workqueue() · 81dcaf65
      Tejun Heo 提交于
      alloc_ordered_workqueue() creates a workqueue which processes each
      work itemp one by one in the queued order.  This will be used to
      replace create_freezeable_workqueue() and
      create_singlethread_workqueue().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      81dcaf65
  4. 13 9月, 2010 1 次提交
  5. 25 8月, 2010 2 次提交
    • T
      workqueue: fix cwq->nr_active underflow · 8a2e8e5d
      Tejun Heo 提交于
      cwq->nr_active is used to keep track of how many work items are active
      for the cpu workqueue, where 'active' is defined as either pending on
      global worklist or executing.  This is used to implement the
      max_active limit and workqueue freezing.  If a work item is queued
      after nr_active has already reached max_active, the work item doesn't
      increment nr_active and is put on the delayed queue and gets activated
      later as previous active work items retire.
      
      try_to_grab_pending() which is used in the cancellation path
      unconditionally decremented nr_active whether the work item being
      cancelled is currently active or delayed, so cancelling a delayed work
      item makes nr_active underflow.  This breaks max_active enforcement
      and triggers BUG_ON() in destroy_workqueue() later on.
      
      This patch fixes this bug by adding a flag WORK_STRUCT_DELAYED, which
      is set while a work item in on the delayed list and making
      try_to_grab_pending() decrement nr_active iff the work item is
      currently active.
      
      The addition of the flag enlarges cwq alignment to 256 bytes which is
      getting a bit too large.  It's scheduled to be reduced back to 128
      bytes by merging WORK_STRUCT_PENDING and WORK_STRUCT_CWQ in the next
      devel cycle.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Reported-by: NJohannes Berg <johannes@sipsolutions.net>
      8a2e8e5d
    • T
      workqueue: improve destroy_workqueue() debuggability · e41e704b
      Tejun Heo 提交于
      Now that the worklist is global, having works pending after wq
      destruction can easily lead to oops and destroy_workqueue() have
      several BUG_ON()s to catch these cases.  Unfortunately, BUG_ON()
      doesn't tell much about how the work became pending after the final
      flush_workqueue().
      
      This patch adds WQ_DYING which is set before the final flush begins.
      If a work is requested to be queued on a dying workqueue,
      WARN_ON_ONCE() is triggered and the request is ignored.  This clearly
      indicates which caller is trying to queue a work on a dying workqueue
      and keeps the system working in most cases.
      
      Locking rule comment is updated such that the 'I' rule includes
      modifying the field from destruction path.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      e41e704b
  6. 01 8月, 2010 1 次提交
    • S
      workqueue: mark init_workqueues() as early_initcall() · 6ee0578b
      Suresh Siddha 提交于
      Mark init_workqueues() as early_initcall() and thus it will be initialized
      before smp bringup. init_workqueues() registers for the hotcpu notifier
      and thus it should cope with the processors that are brought online after
      the workqueues are initialized.
      
      x86 smp bringup code uses workqueues and uses a workaround for the
      cold boot process (as the workqueues are initialized post smp_init()).
      Marking init_workqueues() as early_initcall() will pave the way for
      cleaning up this code.
      Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Oleg Nesterov <oleg@redhat.com>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      6ee0578b
  7. 23 7月, 2010 1 次提交
  8. 02 7月, 2010 3 次提交
    • T
      workqueue: remove WQ_SINGLE_CPU and use WQ_UNBOUND instead · c7fc77f7
      Tejun Heo 提交于
      WQ_SINGLE_CPU combined with @max_active of 1 is used to achieve full
      ordering among works queued to a workqueue.  The same can be achieved
      using WQ_UNBOUND as unbound workqueues always use the gcwq for
      WORK_CPU_UNBOUND.  As @max_active is always one and benefits from cpu
      locality isn't accessible anyway, serving them with unbound workqueues
      should be fine.
      
      Drop WQ_SINGLE_CPU support and use WQ_UNBOUND instead.  Note that most
      single thread workqueue users will be converted to use multithread or
      non-reentrant instead and only the ones which require strict ordering
      will keep using WQ_UNBOUND + @max_active of 1.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      c7fc77f7
    • T
      workqueue: implement unbound workqueue · f3421797
      Tejun Heo 提交于
      This patch implements unbound workqueue which can be specified with
      WQ_UNBOUND flag on creation.  An unbound workqueue has the following
      properties.
      
      * It uses a dedicated gcwq with a pseudo CPU number WORK_CPU_UNBOUND.
        This gcwq is always online and disassociated.
      
      * Workers are not bound to any CPU and not concurrency managed.  Works
        are dispatched to workers as soon as possible and the only applied
        limitation is @max_active.  IOW, all unbound workqeueues are
        implicitly high priority.
      
      Unbound workqueues can be used as simple execution context provider.
      Contexts unbound to any cpu are served as soon as possible.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Arjan van de Ven <arjan@linux.intel.com>
      Cc: David Howells <dhowells@redhat.com>
      f3421797
    • T
      workqueue: prepare for WQ_UNBOUND implementation · bdbc5dd7
      Tejun Heo 提交于
      In preparation of WQ_UNBOUND addition, make the following changes.
      
      * Add WORK_CPU_* constants for pseudo cpu id numbers used (currently
        only WORK_CPU_NONE) and use them instead of NR_CPUS.  This is to
        allow another pseudo cpu id for unbound cpu.
      
      * Reorder WQ_* flags.
      
      * Make workqueue_struct->cpu_wq a union which contains a percpu
        pointer, regular pointer and an unsigned long value and use
        kzalloc/kfree() in UP allocation path.  This will be used to
        implement unbound workqueues which will use only one cwq on SMPs.
      
      * Move alloc_cwqs() allocation after initialization of wq fields, so
        that alloc_cwqs() has access to wq->flags.
      
      * Trivial relocation of wq local variables in freeze functions.
      
      These changes don't cause any functional change.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      bdbc5dd7
  9. 29 6月, 2010 18 次提交
    • T
      workqueue: implement cpu intensive workqueue · fb0e7beb
      Tejun Heo 提交于
      This patch implements cpu intensive workqueue which can be specified
      with WQ_CPU_INTENSIVE flag on creation.  Works queued to a cpu
      intensive workqueue don't participate in concurrency management.  IOW,
      it doesn't contribute to gcwq->nr_running and thus doesn't delay
      excution of other works.
      
      Note that although cpu intensive works won't delay other works, they
      can be delayed by other works.  Combine with WQ_HIGHPRI to avoid being
      delayed by other works too.
      
      As the name suggests this is useful when using workqueue for cpu
      intensive works.  Workers executing cpu intensive works are not
      considered for workqueue concurrency management and left for the
      scheduler to manage.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      fb0e7beb
    • T
      workqueue: implement high priority workqueue · 649027d7
      Tejun Heo 提交于
      This patch implements high priority workqueue which can be specified
      with WQ_HIGHPRI flag on creation.  A high priority workqueue has the
      following properties.
      
      * A work queued to it is queued at the head of the worklist of the
        respective gcwq after other highpri works, while normal works are
        always appended at the end.
      
      * As long as there are highpri works on gcwq->worklist,
        [__]need_more_worker() remains %true and process_one_work() wakes up
        another worker before it start executing a work.
      
      The above two properties guarantee that works queued to high priority
      workqueues are dispatched to workers and start execution as soon as
      possible regardless of the state of other works.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Andi Kleen <andi@firstfloor.org>
      Cc: Andrew Morton <akpm@linux-foundation.org>
      649027d7
    • T
      workqueue: implement several utility APIs · dcd989cb
      Tejun Heo 提交于
      Implement the following utility APIs.
      
       workqueue_set_max_active()	: adjust max_active of a wq
       workqueue_congested()		: test whether a wq is contested
       work_cpu()			: determine the last / current cpu of a work
       work_busy()			: query whether a work is busy
      
      * Anton Blanchard fixed missing ret initialization in work_busy().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Anton Blanchard <anton@samba.org>
      dcd989cb
    • T
      workqueue: s/__create_workqueue()/alloc_workqueue()/, and add system workqueues · d320c038
      Tejun Heo 提交于
      This patch makes changes to make new workqueue features available to
      its users.
      
      * Now that workqueue is more featureful, there should be a public
        workqueue creation function which takes paramters to control them.
        Rename __create_workqueue() to alloc_workqueue() and make 0
        max_active mean WQ_DFL_ACTIVE.  In the long run, all
        create_workqueue_*() will be converted over to alloc_workqueue().
      
      * To further unify access interface, rename keventd_wq to system_wq
        and export it.
      
      * Add system_long_wq and system_nrt_wq.  The former is to host long
        running works separately (so that flush_scheduled_work() dosen't
        take so long) and the latter guarantees any queued work item is
        never executed in parallel by multiple CPUs.  These will be used by
        future patches to update workqueue users.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      d320c038
    • T
      workqueue: increase max_active of keventd and kill current_is_keventd() · b71ab8c2
      Tejun Heo 提交于
      Define WQ_MAX_ACTIVE and create keventd with max_active set to half of
      it which means that keventd now can process upto WQ_MAX_ACTIVE / 2 - 1
      works concurrently.  Unless some combination can result in dependency
      loop longer than max_active, deadlock won't happen and thus it's
      unnecessary to check whether current_is_keventd() before trying to
      schedule a work.  Kill current_is_keventd().
      
      (Lockdep annotations are broken.  We need lock_map_acquire_read_norecurse())
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Christoph Lameter <cl@linux-foundation.org>
      Cc: Tony Luck <tony.luck@intel.com>
      Cc: Andi Kleen <ak@linux.intel.com>
      Cc: Oleg Nesterov <oleg@redhat.com>
      b71ab8c2
    • T
      workqueue: implement concurrency managed dynamic worker pool · e22bee78
      Tejun Heo 提交于
      Instead of creating a worker for each cwq and putting it into the
      shared pool, manage per-cpu workers dynamically.
      
      Works aren't supposed to be cpu cycle hogs and maintaining just enough
      concurrency to prevent work processing from stalling due to lack of
      processing context is optimal.  gcwq keeps the number of concurrent
      active workers to minimum but no less.  As long as there's one or more
      running workers on the cpu, no new worker is scheduled so that works
      can be processed in batch as much as possible but when the last
      running worker blocks, gcwq immediately schedules new worker so that
      the cpu doesn't sit idle while there are works to be processed.
      
      gcwq always keeps at least single idle worker around.  When a new
      worker is necessary and the worker is the last idle one, the worker
      assumes the role of "manager" and manages the worker pool -
      ie. creates another worker.  Forward-progress is guaranteed by having
      dedicated rescue workers for workqueues which may be necessary while
      creating a new worker.  When the manager is having problem creating a
      new worker, mayday timer activates and rescue workers are summoned to
      the cpu and execute works which might be necessary to create new
      workers.
      
      Trustee is expanded to serve the role of manager while a CPU is being
      taken down and stays down.  As no new works are supposed to be queued
      on a dead cpu, it just needs to drain all the existing ones.  Trustee
      continues to try to create new workers and summon rescuers as long as
      there are pending works.  If the CPU is brought back up while the
      trustee is still trying to drain the gcwq from the previous offlining,
      the trustee will kill all idles ones and tell workers which are still
      busy to rebind to the cpu, and pass control over to gcwq which assumes
      the manager role as necessary.
      
      Concurrency managed worker pool reduces the number of workers
      drastically.  Only workers which are necessary to keep the processing
      going are created and kept.  Also, it reduces cache footprint by
      avoiding unnecessarily switching contexts between different workers.
      
      Please note that this patch does not increase max_active of any
      workqueue.  All workqueues can still only process one work per cpu.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      e22bee78
    • T
      workqueue: implement WQ_NON_REENTRANT · 18aa9eff
      Tejun Heo 提交于
      With gcwq managing all the workers and work->data pointing to the last
      gcwq it was on, non-reentrance can be easily implemented by checking
      whether the work is still running on the previous gcwq on queueing.
      Implement it.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      18aa9eff
    • T
      workqueue: carry cpu number in work data once execution starts · 7a22ad75
      Tejun Heo 提交于
      To implement non-reentrant workqueue, the last gcwq a work was
      executed on must be reliably obtainable as long as the work structure
      is valid even if the previous workqueue has been destroyed.
      
      To achieve this, work->data will be overloaded to carry the last cpu
      number once execution starts so that the previous gcwq can be located
      reliably.  This means that cwq can't be obtained from work after
      execution starts but only gcwq.
      
      Implement set_work_{cwq|cpu}(), get_work_[g]cwq() and
      clear_work_data() to set work data to the cpu number when starting
      execution, access the overloaded work data and clear it after
      cancellation.
      
      queue_delayed_work_on() is updated to preserve the last cpu while
      in-flight in timer and other callers which depended on getting cwq
      from work after execution starts are converted to depend on gcwq
      instead.
      
      * Anton Blanchard fixed compile error on powerpc due to missing
        linux/threads.h include.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Anton Blanchard <anton@samba.org>
      7a22ad75
    • T
      workqueue: make single thread workqueue shared worker pool friendly · 502ca9d8
      Tejun Heo 提交于
      Reimplement st (single thread) workqueue so that it's friendly to
      shared worker pool.  It was originally implemented by confining st
      workqueues to use cwq of a fixed cpu and always having a worker for
      the cpu.  This implementation isn't very friendly to shared worker
      pool and suboptimal in that it ends up crossing cpu boundaries often.
      
      Reimplement st workqueue using dynamic single cpu binding and
      cwq->limit.  WQ_SINGLE_THREAD is replaced with WQ_SINGLE_CPU.  In a
      single cpu workqueue, at most single cwq is bound to the wq at any
      given time.  Arbitration is done using atomic accesses to
      wq->single_cpu when queueing a work.  Once bound, the binding stays
      till the workqueue is drained.
      
      Note that the binding is never broken while a workqueue is frozen.
      This is because idle cwqs may have works waiting in delayed_works
      queue while frozen.  On thaw, the cwq is restarted if there are any
      delayed works or unbound otherwise.
      
      When combined with max_active limit of 1, single cpu workqueue has
      exactly the same execution properties as the original single thread
      workqueue while allowing sharing of per-cpu workers.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      502ca9d8
    • T
      workqueue: reimplement workqueue freeze using max_active · a0a1a5fd
      Tejun Heo 提交于
      Currently, workqueue freezing is implemented by marking the worker
      freezeable and calling try_to_freeze() from dispatch loop.
      Reimplement it using cwq->limit so that the workqueue is frozen
      instead of the worker.
      
      * workqueue_struct->saved_max_active is added which stores the
        specified max_active on initialization.
      
      * On freeze, all cwq->max_active's are quenched to zero.  Freezing is
        complete when nr_active on all cwqs reach zero.
      
      * On thaw, all cwq->max_active's are restored to wq->saved_max_active
        and the worklist is repopulated.
      
      This new implementation allows having single shared pool of workers
      per cpu.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      a0a1a5fd
    • T
      workqueue: implement per-cwq active work limit · 1e19ffc6
      Tejun Heo 提交于
      Add cwq->nr_active, cwq->max_active and cwq->delayed_work.  nr_active
      counts the number of active works per cwq.  A work is active if it's
      flushable (colored) and is on cwq's worklist.  If nr_active reaches
      max_active, new works are queued on cwq->delayed_work and activated
      later as works on the cwq complete and decrement nr_active.
      
      cwq->max_active can be specified via the new @max_active parameter to
      __create_workqueue() and is set to 1 for all workqueues for now.  As
      each cwq has only single worker now, this double queueing doesn't
      cause any behavior difference visible to its users.
      
      This will be used to reimplement freeze/thaw and implement shared
      worker pool.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      1e19ffc6
    • T
      workqueue: reimplement work flushing using linked works · affee4b2
      Tejun Heo 提交于
      A work is linked to the next one by having WORK_STRUCT_LINKED bit set
      and these links can be chained.  When a linked work is dispatched to a
      worker, all linked works are dispatched to the worker's newly added
      ->scheduled queue and processed back-to-back.
      
      Currently, as there's only single worker per cwq, having linked works
      doesn't make any visible behavior difference.  This change is to
      prepare for multiple shared workers per cpu.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      affee4b2
    • T
      workqueue: reimplement workqueue flushing using color coded works · 73f53c4a
      Tejun Heo 提交于
      Reimplement workqueue flushing using color coded works.  wq has the
      current work color which is painted on the works being issued via
      cwqs.  Flushing a workqueue is achieved by advancing the current work
      colors of cwqs and waiting for all the works which have any of the
      previous colors to drain.
      
      Currently there are 16 possible colors, one is reserved for no color
      and 15 colors are useable allowing 14 concurrent flushes.  When color
      space gets full, flush attempts are batched up and processed together
      when color frees up, so even with many concurrent flushers, the new
      implementation won't build up huge queue of flushers which has to be
      processed one after another.
      
      Only works which are queued via __queue_work() are colored.  Works
      which are directly put on queue using insert_work() use NO_COLOR and
      don't participate in workqueue flushing.  Currently only works used
      for work-specific flush fall in this category.
      
      This new implementation leaves only cleanup_workqueue_thread() as the
      user of flush_cpu_workqueue().  Just make its users use
      flush_workqueue() and kthread_stop() directly and kill
      cleanup_workqueue_thread().  As workqueue flushing doesn't use barrier
      request anymore, the comment describing the complex synchronization
      around it in cleanup_workqueue_thread() is removed together with the
      function.
      
      This new implementation is to allow having and sharing multiple
      workers per cpu.
      
      Please note that one more bit is reserved for a future work flag by
      this patch.  This is to avoid shifting bits and updating comments
      later.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      73f53c4a
    • T
      workqueue: update cwq alignement · 0f900049
      Tejun Heo 提交于
      work->data field is used for two purposes.  It points to cwq it's
      queued on and the lower bits are used for flags.  Currently, two bits
      are reserved which is always safe as 4 byte alignment is guaranteed on
      every architecture.  However, future changes will need more flag bits.
      
      On SMP, the percpu allocator is capable of honoring larger alignment
      (there are other users which depend on it) and larger alignment works
      just fine.  On UP, percpu allocator is a thin wrapper around
      kzalloc/kfree() and don't honor alignment request.
      
      This patch introduces WORK_STRUCT_FLAG_BITS and implements
      alloc/free_cwqs() which guarantees max(1 << WORK_STRUCT_FLAG_BITS,
      __alignof__(unsigned long long) alignment both on SMP and UP.  On SMP,
      simply wrapping percpu allocator is enough.  On UP, extra space is
      allocated so that cwq can be aligned and the original pointer can be
      stored after it which is used in the free path.
      
      * Alignment problem on UP is reported by Michal Simek.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Christoph Lameter <cl@linux-foundation.org>
      Cc: Ingo Molnar <mingo@elte.hu>
      Cc: Frederic Weisbecker <fweisbec@gmail.com>
      Reported-by: NMichal Simek <michal.simek@petalogix.com>
      0f900049
    • T
      workqueue: define masks for work flags and conditionalize STATIC flags · 22df02bb
      Tejun Heo 提交于
      Work flags are about to see more traditional mask handling.  Define
      WORK_STRUCT_*_BIT as the bit position constant and redefine
      WORK_STRUCT_* as bit masks.  Also, make WORK_STRUCT_STATIC_* flags
      conditional
      
      While at it, re-define these constants as enums and use
      WORK_STRUCT_STATIC instead of hard-coding 2 in
      WORK_DATA_STATIC_INIT().
      Signed-off-by: NTejun Heo <tj@kernel.org>
      22df02bb
    • T
      workqueue: merge feature parameters into flags · 97e37d7b
      Tejun Heo 提交于
      Currently, __create_workqueue_key() takes @singlethread and
      @freezeable paramters and store them separately in workqueue_struct.
      Merge them into a single flags parameter and field and use
      WQ_FREEZEABLE and WQ_SINGLE_THREAD.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      97e37d7b
    • T
      workqueue: misc/cosmetic updates · 4690c4ab
      Tejun Heo 提交于
      Make the following updates in preparation of concurrency managed
      workqueue.  None of these changes causes any visible behavior
      difference.
      
      * Add comments and adjust indentations to data structures and several
        functions.
      
      * Rename wq_per_cpu() to get_cwq() and swap the position of two
        parameters for consistency.  Convert a direct per_cpu_ptr() access
        to wq->cpu_wq to get_cwq().
      
      * Add work_static() and Update set_wq_data() such that it sets the
        flags part to WORK_STRUCT_PENDING | WORK_STRUCT_STATIC if static |
        @extra_flags.
      
      * Move santiy check on work->entry emptiness from queue_work_on() to
        __queue_work() which all queueing paths share.
      
      * Make __queue_work() take @cpu and @wq instead of @cwq.
      
      * Restructure flush_work() and __create_workqueue_key() to make them
        easier to modify.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      4690c4ab
    • T
      workqueue: kill RT workqueue · c790bce0
      Tejun Heo 提交于
      With stop_machine() converted to use cpu_stop, RT workqueue doesn't
      have any user left.  Kill RT workqueue support.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      c790bce0
  10. 15 6月, 2010 1 次提交
    • P
      lockdep: Add an in_workqueue_context() lockdep-based test function · a25909a4
      Paul E. McKenney 提交于
      Some recent uses of RCU make use of workqueues.  In these uses, execution
      within the context of a specific workqueue takes the place of the usual
      RCU read-side primitives such as rcu_read_lock(), and flushing of workqueues
      takes the place of the usual RCU grace-period primitives.  Checking for
      correct use of rcu_dereference() in such cases requires a test of whether
      the code is executing in the context of a particular workqueue.  This
      commit adds an in_workqueue_context() function that provides this test.
      This new function is only defined when lockdep is enabled, which allows
      it to be used as the second argument of rcu_dereference_check().
      Signed-off-by: NPaul E. McKenney <paulmck@linux.vnet.ibm.com>
      a25909a4
  11. 16 11月, 2009 1 次提交
  12. 15 10月, 2009 2 次提交
  13. 21 9月, 2009 1 次提交
  14. 06 9月, 2009 1 次提交
  15. 03 4月, 2009 1 次提交
  16. 22 1月, 2009 1 次提交
  17. 12 1月, 2009 1 次提交