PM / Runtime: Prevent runtime_resume from racing with probe
This patch (as1475) adds device_lock() and device_unlock() calls to the store methods for the power/control and power/autosuspend_delay_ms sysfs attribute files. We don't want badly timed writes to these files to cause runtime_resume callbacks to occur while a driver is being probed for a device. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
62052ab1d1
commit
69c843b45e
@@ -116,12 +116,14 @@ static ssize_t control_store(struct device * dev, struct device_attribute *attr,
|
|||||||
cp = memchr(buf, '\n', n);
|
cp = memchr(buf, '\n', n);
|
||||||
if (cp)
|
if (cp)
|
||||||
len = cp - buf;
|
len = cp - buf;
|
||||||
|
device_lock(dev);
|
||||||
if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto, len) == 0)
|
if (len == sizeof ctrl_auto - 1 && strncmp(buf, ctrl_auto, len) == 0)
|
||||||
pm_runtime_allow(dev);
|
pm_runtime_allow(dev);
|
||||||
else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on, len) == 0)
|
else if (len == sizeof ctrl_on - 1 && strncmp(buf, ctrl_on, len) == 0)
|
||||||
pm_runtime_forbid(dev);
|
pm_runtime_forbid(dev);
|
||||||
else
|
else
|
||||||
return -EINVAL;
|
n = -EINVAL;
|
||||||
|
device_unlock(dev);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,7 +207,9 @@ static ssize_t autosuspend_delay_ms_store(struct device *dev,
|
|||||||
if (strict_strtol(buf, 10, &delay) != 0 || delay != (int) delay)
|
if (strict_strtol(buf, 10, &delay) != 0 || delay != (int) delay)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
device_lock(dev);
|
||||||
pm_runtime_set_autosuspend_delay(dev, delay);
|
pm_runtime_set_autosuspend_delay(dev, delay);
|
||||||
|
device_unlock(dev);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user