aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/platform
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2012-08-03 13:30:47 -0400
committerTejun Heo <tj@kernel.org>2012-08-13 19:27:37 -0400
commit41f63c5359d14ca995172b8f6eaffd93f60fec54 (patch)
treed3d93dfd25d2e29e8abeae934835f2266b018cb7 /drivers/platform
parent8376fe22c7e79c7e90857d39f82aeae6cad6c4b8 (diff)
workqueue: use mod_delayed_work() instead of cancel + queue
Convert delayed_work users doing cancel_delayed_work() followed by queue_delayed_work() to mod_delayed_work(). Most conversions are straight-forward. Ones worth mentioning are, * drivers/edac/edac_mc.c: edac_mc_workq_setup() converted to always use mod_delayed_work() and cancel loop in edac_mc_reset_delay_period() is dropped. * drivers/platform/x86/thinkpad_acpi.c: No need to remember whether watchdog is active or not. @fan_watchdog_active and related code dropped. * drivers/power/charger-manager.c: Seemingly a lot of delayed_work_pending() abuse going on here. [delayed_]work_pending() are unsynchronized and racy when used like this. I converted one instance in fullbatt_handler(). Please conver the rest so that it invokes workqueue APIs for the intended target state rather than trying to game work item pending state transitions. e.g. if timer should be modified - call mod_delayed_work(), canceled - call cancel_delayed_work[_sync](). * drivers/thermal/thermal_sys.c: thermal_zone_device_set_polling() simplified. Note that round_jiffies() calls in this function are meaningless. round_jiffies() work on absolute jiffies not delta delay used by delayed_work. v2: Tomi pointed out that __cancel_delayed_work() users can't be safely converted to mod_delayed_work(). They could be calling it from irq context and if that happens while delayed_work_timer_fn() is running, it could deadlock. __cancel_delayed_work() users are dropped. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Henrique de Moraes Holschuh <hmh@hmh.eng.br> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Acked-by: Anton Vorontsov <cbouatmailru@gmail.com> Acked-by: David Howells <dhowells@redhat.com> Cc: Tomi Valkeinen <tomi.valkeinen@ti.com> Cc: Jens Axboe <axboe@kernel.dk> Cc: Jiri Kosina <jkosina@suse.cz> Cc: Doug Thompson <dougthompson@xmission.com> Cc: David Airlie <airlied@linux.ie> Cc: Roland Dreier <roland@kernel.org> Cc: "John W. Linville" <linville@tuxdriver.com> Cc: Zhang Rui <rui.zhang@intel.com> Cc: Len Brown <len.brown@intel.com> Cc: "J. Bruce Fields" <bfields@fieldses.org> Cc: Johannes Berg <johannes@sipsolutions.net>
Diffstat (limited to 'drivers/platform')
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index e7f73287636c..06d2502ffb37 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -7682,25 +7682,15 @@ static int fan_set_speed(int speed)
7682 7682
7683static void fan_watchdog_reset(void) 7683static void fan_watchdog_reset(void)
7684{ 7684{
7685 static int fan_watchdog_active;
7686
7687 if (fan_control_access_mode == TPACPI_FAN_WR_NONE) 7685 if (fan_control_access_mode == TPACPI_FAN_WR_NONE)
7688 return; 7686 return;
7689 7687
7690 if (fan_watchdog_active)
7691 cancel_delayed_work(&fan_watchdog_task);
7692
7693 if (fan_watchdog_maxinterval > 0 && 7688 if (fan_watchdog_maxinterval > 0 &&
7694 tpacpi_lifecycle != TPACPI_LIFE_EXITING) { 7689 tpacpi_lifecycle != TPACPI_LIFE_EXITING)
7695 fan_watchdog_active = 1; 7690 mod_delayed_work(tpacpi_wq, &fan_watchdog_task,
7696 if (!queue_delayed_work(tpacpi_wq, &fan_watchdog_task, 7691 msecs_to_jiffies(fan_watchdog_maxinterval * 1000));
7697 msecs_to_jiffies(fan_watchdog_maxinterval 7692 else
7698 * 1000))) { 7693 cancel_delayed_work(&fan_watchdog_task);
7699 pr_err("failed to queue the fan watchdog, "
7700 "watchdog will not trigger\n");
7701 }
7702 } else
7703 fan_watchdog_active = 0;
7704} 7694}
7705 7695
7706static void fan_watchdog_fire(struct work_struct *ignored) 7696static void fan_watchdog_fire(struct work_struct *ignored)