| From bcdefcf0c995410c1481b572cb9929d052c598c7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 21 Jun 2019 18:39:49 -0300 |
| Subject: PM / devfreq: Fix kernel oops on governor module load |
| |
| From: Ezequiel Garcia <ezequiel@collabora.com> |
| |
| [ Upstream commit 7544fd7f384591038646d3cd9efb311ab4509e24 ] |
| |
| A bit unexpectedly (but still documented), request_module may |
| return a positive value, in case of a modprobe error. |
| This is currently causing issues in the devfreq framework. |
| |
| When a request_module exits with a positive value, we currently |
| return that via ERR_PTR. However, because the value is positive, |
| it's not a ERR_VALUE proper, and is therefore treated as a |
| valid struct devfreq_governor pointer, leading to a kernel oops. |
| |
| Fix this by returning -EINVAL if request_module returns a positive |
| value. |
| |
| Fixes: b53b0128052ff ("PM / devfreq: Fix static checker warning in try_then_request_governor") |
| Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> |
| Reviewed-by: Chanwoo Choi <cw00.choi@samsung.com> |
| Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/devfreq/devfreq.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c |
| index ab22bf8a12d69..a0e19802149fc 100644 |
| --- a/drivers/devfreq/devfreq.c |
| +++ b/drivers/devfreq/devfreq.c |
| @@ -254,7 +254,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name) |
| /* Restore previous state before return */ |
| mutex_lock(&devfreq_list_lock); |
| if (err) |
| - return ERR_PTR(err); |
| + return (err < 0) ? ERR_PTR(err) : ERR_PTR(-EINVAL); |
| |
| governor = find_devfreq_governor(name); |
| } |
| -- |
| 2.20.1 |
| |