From 0f69c57d70c763bf911fa6fe3bfee5720027611f Mon Sep 17 00:00:00 2001 From: Sai Harshini Nimmala Date: Fri, 14 Aug 2020 17:52:02 -0700 Subject: [PATCH] soc: qcom: hyp_core_ctl: Catch uninitialized freq QOS object Currently, the code is not checking if the freq qos object was requested before using it in the undo reservation path. This causes warnings like "freq_qos_update_request() called for unknown object". Fix this by checking freq_qos_init_done flag is set prior to using the qos objects. Change-Id: Ie8009f5ea191f4ad0c199a3fce04376871a5d2c5 Signed-off-by: Sai Harshini Nimmala --- drivers/soc/qcom/hyp_core_ctl.c | 52 +++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/drivers/soc/qcom/hyp_core_ctl.c b/drivers/soc/qcom/hyp_core_ctl.c index 3d7917632476..b3886fce44a5 100644 --- a/drivers/soc/qcom/hyp_core_ctl.c +++ b/drivers/soc/qcom/hyp_core_ctl.c @@ -81,6 +81,7 @@ static struct hyp_core_ctl_cpu_map hh_cpumap[NR_CPUS]; static bool is_vcpu_info_populated; static bool init_done; static int nr_vcpus; +static bool freq_qos_init_done; static inline void hyp_core_ctl_print_status(char *msg) { @@ -111,12 +112,14 @@ static void hyp_core_ctl_undo_reservation(struct hyp_core_ctl_data *hcd) cpumask_clear_cpu(cpu, &hcd->our_isolated_cpus); - qos_req = &per_cpu(qos_min_req, cpu); - ret = freq_qos_update_request(qos_req, - FREQ_QOS_MIN_DEFAULT_VALUE); - if (ret < 0) - pr_err("fail to update min freq for CPU%d ret=%d\n", + if (freq_qos_init_done) { + qos_req = &per_cpu(qos_min_req, cpu); + ret = freq_qos_update_request(qos_req, + FREQ_QOS_MIN_DEFAULT_VALUE); + if (ret < 0) + pr_err("fail to update min freq for CPU%d ret=%d\n", cpu, ret); + } } hyp_core_ctl_print_status("undo_reservation_end"); @@ -279,9 +282,9 @@ static void hyp_core_ctl_do_reservation(struct hyp_core_ctl_data *hcd) cpumask_set_cpu(i, &hcd->our_isolated_cpus); - qos_req = &per_cpu(qos_min_req, i); min_freq = per_cpu(qos_min_freq, i); - if (min_freq) { + if (min_freq && freq_qos_init_done) { + qos_req = &per_cpu(qos_min_req, i); ret = freq_qos_update_request(qos_req, min_freq); if (ret < 0) pr_err("fail to update min freq for CPU%d ret=%d\n", @@ -339,9 +342,9 @@ static void hyp_core_ctl_do_reservation(struct hyp_core_ctl_data *hcd) cpumask_set_cpu(i, &hcd->our_isolated_cpus); - qos_req = &per_cpu(qos_min_req, i); min_freq = per_cpu(qos_min_freq, i); - if (min_freq) { + if (min_freq && freq_qos_init_done) { + qos_req = &per_cpu(qos_min_req, i); ret = freq_qos_update_request(qos_req, min_freq); if (ret < 0) @@ -386,12 +389,14 @@ static void hyp_core_ctl_do_reservation(struct hyp_core_ctl_data *hcd) cpumask_clear_cpu(i, &hcd->our_isolated_cpus); - qos_req = &per_cpu(qos_min_req, i); - ret = freq_qos_update_request(qos_req, + if (freq_qos_init_done) { + qos_req = &per_cpu(qos_min_req, i); + ret = freq_qos_update_request(qos_req, FREQ_QOS_MIN_DEFAULT_VALUE); - if (ret < 0) - pr_err("fail to update min freq for CPU%d ret=%d\n", + if (ret < 0) + pr_err("fail to update min freq for CPU%d ret=%d\n", i, ret); + } if (--unisolate_need == 0) break; @@ -532,12 +537,14 @@ static int hyp_core_ctl_cpu_cooling_cb(struct notifier_block *nb, if (cpumask_test_cpu(cpu, &the_hcd->our_isolated_cpus)) { sched_unisolate_cpu(cpu); cpumask_clear_cpu(cpu, &the_hcd->our_isolated_cpus); - qos_req = &per_cpu(qos_min_req, cpu); - ret = freq_qos_update_request(qos_req, + if (freq_qos_init_done) { + qos_req = &per_cpu(qos_min_req, cpu); + ret = freq_qos_update_request(qos_req, FREQ_QOS_MIN_DEFAULT_VALUE); - if (ret < 0) - pr_err("fail to update min freq for CPU%d ret=%d\n", + if (ret < 0) + pr_err("fail to update min freq for CPU%d ret=%d\n", cpu, ret); + } } } else { /* @@ -597,12 +604,14 @@ static int hyp_core_ctl_hp_offline(unsigned int cpu) */ if (cpumask_test_and_clear_cpu(cpu, &the_hcd->our_isolated_cpus)) { sched_unisolate_cpu_unlocked(cpu); - qos_req = &per_cpu(qos_min_req, cpu); - ret = freq_qos_update_request(qos_req, + if (freq_qos_init_done) { + qos_req = &per_cpu(qos_min_req, cpu); + ret = freq_qos_update_request(qos_req, FREQ_QOS_MIN_DEFAULT_VALUE); - if (ret < 0) - pr_err("fail to update min freq for CPU%d ret=%d\n", + if (ret < 0) + pr_err("fail to update min freq for CPU%d ret=%d\n", cpu, ret); + } } return 0; @@ -799,7 +808,6 @@ static ssize_t status_show(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR_RO(status); -static bool freq_qos_init_done; static int init_freq_qos_req(void) { int cpu, ret;