Commit 061f3806 authored by Viresh Kumar's avatar Viresh Kumar Committed by Sebastian Reichel

power-supply: Mark 'if' blocks in power_supply_changed_work() with 'likely'

The 'if' statements in power_supply_changed_work() are mostly there for taking
care of races and normally they will always evaluate to true. Optimize them for
fast execution with 'likely' statements.

Also there is need to have better comments in code to mention about the races
clearly. Get them in place.

Cc: Zoran Markovic <zrn.markovic@gmail.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
parent 1c42a389
...@@ -78,7 +78,14 @@ static void power_supply_changed_work(struct work_struct *work) ...@@ -78,7 +78,14 @@ static void power_supply_changed_work(struct work_struct *work)
dev_dbg(psy->dev, "%s\n", __func__); dev_dbg(psy->dev, "%s\n", __func__);
spin_lock_irqsave(&psy->changed_lock, flags); spin_lock_irqsave(&psy->changed_lock, flags);
if (psy->changed) { /*
* Check 'changed' here to avoid issues due to race between
* power_supply_changed() and this routine. In worst case
* power_supply_changed() can be called again just before we take above
* lock. During the first call of this routine we will mark 'changed' as
* false and it will stay false for the next call as well.
*/
if (likely(psy->changed)) {
psy->changed = false; psy->changed = false;
spin_unlock_irqrestore(&psy->changed_lock, flags); spin_unlock_irqrestore(&psy->changed_lock, flags);
class_for_each_device(power_supply_class, NULL, psy, class_for_each_device(power_supply_class, NULL, psy,
...@@ -89,12 +96,13 @@ static void power_supply_changed_work(struct work_struct *work) ...@@ -89,12 +96,13 @@ static void power_supply_changed_work(struct work_struct *work)
kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE); kobject_uevent(&psy->dev->kobj, KOBJ_CHANGE);
spin_lock_irqsave(&psy->changed_lock, flags); spin_lock_irqsave(&psy->changed_lock, flags);
} }
/* /*
* Dependent power supplies (e.g. battery) may have changed state * Hold the wakeup_source until all events are processed.
* as a result of this event, so poll again and hold the * power_supply_changed() might have called again and have set 'changed'
* wakeup_source until all events are processed. * to true.
*/ */
if (!psy->changed) if (likely(!psy->changed))
pm_relax(psy->dev); pm_relax(psy->dev);
spin_unlock_irqrestore(&psy->changed_lock, flags); spin_unlock_irqrestore(&psy->changed_lock, flags);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment