From ebced8158b49486bf9666620cfe8a42b6d395047 Mon Sep 17 00:00:00 2001 From: Lina Iyer Date: Mon, 11 May 2020 11:14:16 -0600 Subject: [PATCH] drivers: cpuidle: lpm-levels: check for valid LPM stats When DEBUG_FS is not defined, the cluster->stats may be initialized to an error value. Check for valid stats pointer before updating the start and end times. Change-Id: I126766a017ebd9a84bd40f19ab3ff47877615429 Signed-off-by: Lina Iyer --- drivers/cpuidle/lpm-levels.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c index 8964462d5e17..b2c958a79eaa 100644 --- a/drivers/cpuidle/lpm-levels.c +++ b/drivers/cpuidle/lpm-levels.c @@ -1234,7 +1234,8 @@ static void cluster_prepare(struct lpm_cluster *cluster, if (cluster_configure(cluster, i, from_idle, predicted)) goto failed; - cluster->stats->sleep_time = start_time; + if (!IS_ERR_OR_NULL(cluster->stats)) + cluster->stats->sleep_time = start_time; cluster_prepare(cluster->parent, &cluster->num_children_in_sync, i, from_idle, start_time); @@ -1242,7 +1243,8 @@ static void cluster_prepare(struct lpm_cluster *cluster, return; failed: spin_unlock(&cluster->sync_lock); - cluster->stats->sleep_time = 0; + if (!IS_ERR_OR_NULL(cluster->stats)) + cluster->stats->sleep_time = 0; } static void cluster_unprepare(struct lpm_cluster *cluster, @@ -1281,7 +1283,7 @@ static void cluster_unprepare(struct lpm_cluster *cluster, if (!first_cpu || cluster->last_level == cluster->default_level) goto unlock_return; - if (cluster->stats->sleep_time) + if (!IS_ERR_OR_NULL(cluster->stats) && cluster->stats->sleep_time) cluster->stats->sleep_time = end_time - cluster->stats->sleep_time; lpm_stats_cluster_exit(cluster->stats, cluster->last_level, success); @@ -1723,6 +1725,9 @@ static void register_cluster_lpm_stats(struct lpm_cluster *cl, cl->stats = lpm_stats_config_level(cl->cluster_name, level_name, cl->nlevels, parent ? parent->stats : NULL, NULL); + if (IS_ERR_OR_NULL(cl->stats)) + pr_info("Cluster (%s) stats not registered\n", + cl->cluster_name); kfree(level_name);