mirror of
https://github.com/torvalds/linux.git
synced 2024-11-18 01:51:53 +00:00
PM / devfreq: Restart previous governor if new governor fails to start
If the new governor fails to start, switch back to old governor so that the devfreq state is not left in some weird limbo. [Myungjoo: assume fatal on revert failure and set df->governor to NULL] Signed-off-by: Sibi Sankar <sibis@codeaurora.org> Signed-off-by: Saravana Kannan <skannan@codeaurora.org> Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com> Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
This commit is contained in:
parent
1d1397c3ec
commit
bc658bef97
@ -1124,7 +1124,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
|
|||||||
struct devfreq *df = to_devfreq(dev);
|
struct devfreq *df = to_devfreq(dev);
|
||||||
int ret;
|
int ret;
|
||||||
char str_governor[DEVFREQ_NAME_LEN + 1];
|
char str_governor[DEVFREQ_NAME_LEN + 1];
|
||||||
struct devfreq_governor *governor;
|
const struct devfreq_governor *governor, *prev_governor;
|
||||||
|
|
||||||
ret = sscanf(buf, "%" __stringify(DEVFREQ_NAME_LEN) "s", str_governor);
|
ret = sscanf(buf, "%" __stringify(DEVFREQ_NAME_LEN) "s", str_governor);
|
||||||
if (ret != 1)
|
if (ret != 1)
|
||||||
@ -1153,12 +1153,24 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
prev_governor = df->governor;
|
||||||
df->governor = governor;
|
df->governor = governor;
|
||||||
strncpy(df->governor_name, governor->name, DEVFREQ_NAME_LEN);
|
strncpy(df->governor_name, governor->name, DEVFREQ_NAME_LEN);
|
||||||
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
|
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
|
||||||
if (ret)
|
if (ret) {
|
||||||
dev_warn(dev, "%s: Governor %s not started(%d)\n",
|
dev_warn(dev, "%s: Governor %s not started(%d)\n",
|
||||||
__func__, df->governor->name, ret);
|
__func__, df->governor->name, ret);
|
||||||
|
df->governor = prev_governor;
|
||||||
|
strncpy(df->governor_name, prev_governor->name,
|
||||||
|
DEVFREQ_NAME_LEN);
|
||||||
|
ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(dev,
|
||||||
|
"%s: reverting to Governor %s failed (%d)\n",
|
||||||
|
__func__, df->governor_name, ret);
|
||||||
|
df->governor = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&devfreq_list_lock);
|
mutex_unlock(&devfreq_list_lock);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user