cpufreq: cppc: Set fie_disabled to FIE_DISABLED if fails to create kworker_fie
authorLiao Chang <liaochang1@huawei.com>
Thu, 17 Aug 2023 07:47:56 +0000 (07:47 +0000)
committerViresh Kumar <viresh.kumar@linaro.org>
Thu, 17 Aug 2023 08:54:58 +0000 (14:24 +0530)
The function cppc_freq_invariance_init() may failed to create
kworker_fie, make it more robust by setting fie_disabled to FIE_DISBALED
to prevent an invalid pointer dereference in kthread_destroy_worker(),
which called from cppc_freq_invariance_exit().

Signed-off-by: Liao Chang <liaochang1@huawei.com>
Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
drivers/cpufreq/cppc_cpufreq.c

index 0564275..fe08ca4 100644 (file)
@@ -249,15 +249,19 @@ static void __init cppc_freq_invariance_init(void)
                return;
 
        kworker_fie = kthread_create_worker(0, "cppc_fie");
-       if (IS_ERR(kworker_fie))
+       if (IS_ERR(kworker_fie)) {
+               pr_warn("%s: failed to create kworker_fie: %ld\n", __func__,
+                       PTR_ERR(kworker_fie));
+               fie_disabled = FIE_DISABLED;
                return;
+       }
 
        ret = sched_setattr_nocheck(kworker_fie->task, &attr);
        if (ret) {
                pr_warn("%s: failed to set SCHED_DEADLINE: %d\n", __func__,
                        ret);
                kthread_destroy_worker(kworker_fie);
-               return;
+               fie_disabled = FIE_DISABLED;
        }
 }
 
@@ -267,7 +271,6 @@ static void cppc_freq_invariance_exit(void)
                return;
 
        kthread_destroy_worker(kworker_fie);
-       kworker_fie = NULL;
 }
 
 #else