[lkml]   [2012]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Subject[PATCHSET wq/for-3.7] workqueue: implement mod_delayed_work[_on]()
delayed_work has been annoyingly missing the mechanism to modify timer
of a pending delayed_work - ie. mod_timer() counterpart. delayed_work
users have been working around this using several methods - using an
explicit timer + work item, messing directly with delayed_work->timer,
and canceling before re-queueing, all of which are error-prone and/or

Gustavo Padovan posted a RFC implementation[1] of mod_delayed_work() a
while back but it wasn't complete. To properly implement
mod_delayed_work[_on](), it should be able to steal pending work items
which may be on timer or worklist or anywhere inbetween. This is
similar to what __cancel_work_timer() does but it turns out that there
are a lot of holes around this area and try_to_grab_pending() needs
considerable amount of work to be used for other purposes too.

This patchset improves canceling and try_to_grab_pending(), use it to
implement mod_delayed_work[_on](), convert easy ones, and drop
__cancel_delayed_work_sync() which doesn't have relevant users


0001-0003 are preparatory.

0004 removes the possibility of cancel_sync spinning for extended
period of time while another task holding PENDING is preempted.

0005-0007 clean up local queueing handling.

0008-0011 prepare for try_to_grab_pending() improvements.

0012 makes try_to_grab_pending() distinguish transient failure which
can be safely busy-retried and failure because the work item is being
canceled, which may take arbitrary amount of time.

0013 uses the improve try_to_grab_pending() to implement

0014 converts cancel + queue sequences to mod_delayed_work().

0015 drops __cancel_delayed_work() which doesn't have any relevant
user left. Not all conversions are trivial. If you're involved with
edac, thinkpad_acpi, charger-manager, thermal_sys or nic link_watch,
please take a look at the conversion made in 0015.

This patchset is also available at the following git branch.

git:// review-wq-mod_delayed

If nobody objects, I'd like to route this series through wq/for-3.7.
Changes to other subsystems are fairly localized and conflicts, if
they occur, shouldn't be too painful to handle.

Although this ends up adding ~90 LOC, it contains a lot more
documentation, converted only the apparent ones, and IMHO is
worthwhile to have regardless as it removes an annoyance which is
pretty easy to encounter while using delayed_work.


block/blk-core.c | 8
block/blk-throttle.c | 7
block/genhd.c | 6
drivers/block/floppy.c | 5
drivers/edac/edac_mc.c | 17
drivers/infiniband/core/addr.c | 4
drivers/infiniband/core/mad.c | 16
drivers/infiniband/hw/nes/nes_hw.c | 6
drivers/infiniband/hw/nes/nes_nic.c | 5
drivers/input/keyboard/qt2160.c | 3
drivers/input/mouse/synaptics_i2c.c | 7
drivers/net/wireless/ipw2x00/ipw2100.c | 8
drivers/net/wireless/zd1211rw/zd_usb.c | 3
drivers/platform/x86/thinkpad_acpi.c | 20
drivers/power/charger-manager.c | 9
drivers/power/ds2760_battery.c | 9
drivers/power/jz4740-battery.c | 6
drivers/thermal/thermal_sys.c | 15
drivers/video/omap2/dss/dsi.c | 2
fs/afs/callback.c | 4
fs/afs/server.c | 10
fs/afs/vlocation.c | 14
fs/nfs/nfs4renewd.c | 3
include/linux/workqueue.h | 49 +-
kernel/workqueue.c | 690 ++++++++++++++++++++-------------
net/core/dst.c | 4
net/core/link_watch.c | 21 -
net/rfkill/input.c | 3
28 files changed, 521 insertions(+), 433 deletions(-)



 \ /
  Last update: 2012-07-28 02:21    [W:0.076 / U:1.412 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site