• Tejun Heo's avatar
    workqueue: include workqueue info when printing debug dump of a worker task · 3d1cb205
    Tejun Heo authored
    One of the problems that arise when converting dedicated custom
    threadpool to workqueue is that the shared worker pool used by workqueue
    anonimizes each worker making it more difficult to identify what the
    worker was doing on which target from the output of sysrq-t or debug
    dump from oops, BUG() and friends.
    
    This patch implements set_worker_desc() which can be called from any
    workqueue work function to set its description.  When the worker task is
    dumped for whatever reason - sysrq-t, WARN, BUG, oops, lockdep assertion
    and so on - the description will be printed out together with the
    workqueue name and the worker function pointer.
    
    The printing side is implemented by print_worker_info() which is called
    from functions in task dump paths - sched_show_task() and
    dump_stack_print_info().  print_worker_info() can be safely called on
    any task in any state as long as the task struct itself is accessible.
    It uses probe_*() functions to access worker fields.  It may print
    garbage if something went very wrong, but it wouldn't cause (another)
    oops.
    
    The description is currently limited to 24bytes including the
    terminating \0.  worker->desc_valid and workder->desc[] are added and
    the 64 bytes marker which was already incorrect before adding the new
    fields is moved to the correct position.
    
    Here's an example dump with writeback updated to set the bdi name as
    worker desc.
    
     Hardware name: Bochs
     Modules linked in:
     Pid: 7, comm: kworker/u9:0 Not tainted 3.9.0-rc1-work+ #1
     Workqueue: writeback bdi_writeback_workfn (flush-8:0)
      ffffffff820a3ab0 ffff88000f6e9cb8 ffffffff81c61845 ffff88000f6e9cf8
      ffffffff8108f50f 0000000000000000 0000000000000000 ffff88000cde16b0
      ffff88000cde1aa8 ffff88001ee19240 ffff88000f6e9fd8 ffff88000f6e9d08
     Call Trace:
      [<ffffffff81c61845>] dump_stack+0x19/0x1b
      [<ffffffff8108f50f>] warn_slowpath_common+0x7f/0xc0
      [<ffffffff8108f56a>] warn_slowpath_null+0x1a/0x20
      [<ffffffff81200150>] bdi_writeback_workfn+0x2a0/0x3b0
     ...
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Acked-by: default avatarJan Kara <jack@suse.cz>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Dave Chinner <david@fromorbit.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    3d1cb205
workqueue_internal.h 2.11 KB