Skip to content

Commit

Permalink
powercap/intel_rapl: fix and tidy up error handling
Browse files Browse the repository at this point in the history
Commit e1399ba ("powercap / RAPL: handle missing MSRs") added
contraint_to_pl() function to return index into an array. But it
can potentially return -EINVAL if powercap layer sends an out of
range constraint ID. This patch adds sanity check.

Unnecessary RAPL domain pointer check is removed since it must be
initialized before calling rapl_unit_xlate().

Fixes: e1399ba ("powercap / RAPL: handle missing MSRs")
Reported-by: Odzioba, Lukasz <[email protected]>
Reported-by: Koss, Marcin <[email protected]>
Signed-off-by: Jacob Pan <[email protected]>
Signed-off-by: Rafael J. Wysocki <[email protected]>
  • Loading branch information
Jacob Pan authored and rafaeljw committed Nov 28, 2016
1 parent b4005e9 commit cb43f81
Showing 1 changed file with 24 additions and 1 deletion.
25 changes: 24 additions & 1 deletion drivers/powercap/intel_rapl.c
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,7 @@ static int contraint_to_pl(struct rapl_domain *rd, int cid)
return i;
}
}
pr_err("Cannot find matching power limit for constraint %d\n", cid);

return -EINVAL;
}
Expand All @@ -444,6 +445,10 @@ static int set_power_limit(struct powercap_zone *power_zone, int cid,
get_online_cpus();
rd = power_zone_to_rapl_domain(power_zone);
id = contraint_to_pl(rd, cid);
if (id < 0) {
ret = id;
goto set_exit;
}

rp = rd->rp;

Expand Down Expand Up @@ -483,6 +488,11 @@ static int get_current_power_limit(struct powercap_zone *power_zone, int cid,
get_online_cpus();
rd = power_zone_to_rapl_domain(power_zone);
id = contraint_to_pl(rd, cid);
if (id < 0) {
ret = id;
goto get_exit;
}

switch (rd->rpl[id].prim_id) {
case PL1_ENABLE:
prim = POWER_LIMIT1;
Expand All @@ -499,6 +509,7 @@ static int get_current_power_limit(struct powercap_zone *power_zone, int cid,
else
*data = val;

get_exit:
put_online_cpus();

return ret;
Expand All @@ -514,6 +525,10 @@ static int set_time_window(struct powercap_zone *power_zone, int cid,
get_online_cpus();
rd = power_zone_to_rapl_domain(power_zone);
id = contraint_to_pl(rd, cid);
if (id < 0) {
ret = id;
goto set_time_exit;
}

switch (rd->rpl[id].prim_id) {
case PL1_ENABLE:
Expand All @@ -525,6 +540,8 @@ static int set_time_window(struct powercap_zone *power_zone, int cid,
default:
ret = -EINVAL;
}

set_time_exit:
put_online_cpus();
return ret;
}
Expand All @@ -539,6 +556,10 @@ static int get_time_window(struct powercap_zone *power_zone, int cid, u64 *data)
get_online_cpus();
rd = power_zone_to_rapl_domain(power_zone);
id = contraint_to_pl(rd, cid);
if (id < 0) {
ret = id;
goto get_time_exit;
}

switch (rd->rpl[id].prim_id) {
case PL1_ENABLE:
Expand All @@ -553,6 +574,8 @@ static int get_time_window(struct powercap_zone *power_zone, int cid, u64 *data)
}
if (!ret)
*data = val;

get_time_exit:
put_online_cpus();

return ret;
Expand Down Expand Up @@ -694,7 +717,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
case ENERGY_UNIT:
scale = ENERGY_UNIT_SCALE;
/* per domain unit takes precedence */
if (rd && rd->domain_energy_unit)
if (rd->domain_energy_unit)
units = rd->domain_energy_unit;
else
units = rp->energy_unit;
Expand Down

0 comments on commit cb43f81

Please sign in to comment.