PM: EM: Check if the get_cost() callback is present in em_compute_costs()
authorLukasz Luba <lukasz.luba@arm.com>
Thu, 8 Feb 2024 11:55:40 +0000 (11:55 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 8 Feb 2024 14:00:26 +0000 (15:00 +0100)
Subsequent changes will introduce a case in which 'cb->get_cost' may
not be set in em_compute_costs(), so add a check to ensure that it is
not NULL before attempting to dereference it.

Reviewed-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
Signed-off-by: Lukasz Luba <lukasz.luba@arm.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
kernel/power/energy_model.c

index 5c47caaf270e69d10a2697aca032059b73165a8d..21d76122325517af440f0d9c32f147362014cb3a 100644 (file)
@@ -116,7 +116,7 @@ static int em_compute_costs(struct device *dev, struct em_perf_state *table,
        for (i = nr_states - 1; i >= 0; i--) {
                unsigned long power_res, cost;
 
-               if (flags & EM_PERF_DOMAIN_ARTIFICIAL) {
+               if ((flags & EM_PERF_DOMAIN_ARTIFICIAL) && cb->get_cost) {
                        ret = cb->get_cost(dev, table[i].frequency, &cost);
                        if (ret || !cost || cost > EM_MAX_POWER) {
                                dev_err(dev, "EM: invalid cost %lu %d\n",