Introduce a new structure, rapl_if_private, to save the private data for different RAPL Interface.
Unified · Split
| @@ -75,6 +75,9 @@ enum unit_type { · 74 unmodified lines | ||
| 75 | 75 | TIME_UNIT, |
| 76 | 76 | }; |
| 77 | 77 | |
| 78 | +/* private data for RAPL MSR Interface */ | |
| 79 | +static struct rapl_if_priv rapl_msr_priv; | |
| 80 | + | |
| 78 | 81 | /* per domain data, some are optional */ |
| 79 | 82 | #define NR_RAW_PRIMITIVES (NR_RAPL_PRIMITIVES - 2) |
| 80 | 83 | |
| @@ -155,17 +158,14 @@ static const char * const rapl_domain_names[] = { · 74 unmodified lines | ||
| 155 | 158 | "psys", |
| 156 | 159 | }; |
| 157 | 160 | |
| 158 | −static struct powercap_control_type *control_type; /* PowerCap Controller */ | |
| 159 | −static struct rapl_domain *platform_rapl_domain; /* Platform (PSys) domain */ | |
| 160 | − | |
| 161 | 161 | /* caller to ensure CPU hotplug lock is held */ |
| 162 | −static struct rapl_package *rapl_find_package_domain(int cpu) | |
| 162 | +static struct rapl_package *rapl_find_package_domain(int cpu, struct rapl_if_priv *priv) | |
| 163 | 163 | { |
| 164 | 164 | int id = topology_logical_die_id(cpu); |
| 165 | 165 | struct rapl_package *rp; |
| 166 | 166 | |
| 167 | 167 | list_for_each_entry(rp, &rapl_packages, plist) { |
| 168 | − if (rp->id == id) | |
| 168 | + if (rp->id == id && rp->priv->control_type == priv->control_type) | |
| 169 | 169 | return rp; |
| 170 | 170 | } |
| 171 | 171 | |
| @@ -1090,12 +1090,12 @@ static void rapl_update_domain_data(struct rapl_package *rp) · 918 unmodified lines | ||
| 1090 | 1090 | |
| 1091 | 1091 | static void rapl_unregister_powercap(void) |
| 1092 | 1092 | { |
| 1093 | − if (platform_rapl_domain) { | |
| 1094 | − powercap_unregister_zone(control_type, | |
| 1095 | − &platform_rapl_domain->power_zone); | |
| 1096 | − kfree(platform_rapl_domain); | |
| 1093 | + if (&rapl_msr_priv.platform_rapl_domain) { | |
| 1094 | + powercap_unregister_zone(rapl_msr_priv.control_type, | |
| 1095 | + &rapl_msr_priv.platform_rapl_domain->power_zone); | |
| 1096 | + kfree(rapl_msr_priv.platform_rapl_domain); | |
| 1097 | 1097 | } |
| 1098 | − powercap_unregister_control_type(control_type); | |
| 1098 | + powercap_unregister_control_type(rapl_msr_priv.control_type); | |
| 1099 | 1099 | } |
| 1100 | 1100 | |
| 1101 | 1101 | static int rapl_package_register_powercap(struct rapl_package *rp) |
| @@ -1113,7 +1113,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp) · 11 unmodified lines | ||
| 1113 | 1113 | nr_pl = find_nr_power_limit(rd); |
| 1114 | 1114 | pr_debug("register package domain %s\n", rp->name); |
| 1115 | 1115 | power_zone = powercap_register_zone(&rd->power_zone, |
| 1116 | − control_type, | |
| 1116 | + rp->priv->control_type, | |
| 1117 | 1117 | rp->name, NULL, |
| 1118 | 1118 | &zone_ops[rd->id], |
| 1119 | 1119 | nr_pl, |
| @@ -1140,7 +1140,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp) · 20 unmodified lines | ||
| 1140 | 1140 | /* number of power limits per domain varies */ |
| 1141 | 1141 | nr_pl = find_nr_power_limit(rd); |
| 1142 | 1142 | power_zone = powercap_register_zone(&rd->power_zone, |
| 1143 | − control_type, rd->name, | |
| 1143 | + rp->priv->control_type, rd->name, | |
| 1144 | 1144 | rp->power_zone, |
| 1145 | 1145 | &zone_ops[rd->id], nr_pl, |
| 1146 | 1146 | &constraint_ops); |
| @@ -1161,7 +1161,7 @@ err_cleanup: · 14 unmodified lines | ||
| 1161 | 1161 | */ |
| 1162 | 1162 | while (--rd >= rp->domains) { |
| 1163 | 1163 | pr_debug("unregister %s domain %s\n", rp->name, rd->name); |
| 1164 | − powercap_unregister_zone(control_type, &rd->power_zone); | |
| 1164 | + powercap_unregister_zone(rp->priv->control_type, &rd->power_zone); | |
| 1165 | 1165 | } |
| 1166 | 1166 | |
| 1167 | 1167 | return ret; |
| @@ -1191,9 +1191,9 @@ static int __init rapl_register_psys(void) · 23 unmodified lines | ||
| 1191 | 1191 | rd->rpl[0].name = pl1_name; |
| 1192 | 1192 | rd->rpl[1].prim_id = PL2_ENABLE; |
| 1193 | 1193 | rd->rpl[1].name = pl2_name; |
| 1194 | − rd->rp = rapl_find_package_domain(0); | |
| 1194 | + rd->rp = rapl_find_package_domain(0, &rapl_msr_priv); | |
| 1195 | 1195 | |
| 1196 | − power_zone = powercap_register_zone(&rd->power_zone, control_type, | |
| 1196 | + power_zone = powercap_register_zone(&rd->power_zone, rapl_msr_priv.control_type, | |
| 1197 | 1197 | "psys", NULL, |
| 1198 | 1198 | &zone_ops[RAPL_DOMAIN_PLATFORM], |
| 1199 | 1199 | 2, &constraint_ops); |
| @@ -1203,17 +1203,17 @@ static int __init rapl_register_psys(void) · 3 unmodified lines | ||
| 1203 | 1203 | return PTR_ERR(power_zone); |
| 1204 | 1204 | } |
| 1205 | 1205 | |
| 1206 | − platform_rapl_domain = rd; | |
| 1206 | + rapl_msr_priv.platform_rapl_domain = rd; | |
| 1207 | 1207 | |
| 1208 | 1208 | return 0; |
| 1209 | 1209 | } |
| 1210 | 1210 | |
| 1211 | 1211 | static int __init rapl_register_powercap(void) |
| 1212 | 1212 | { |
| 1213 | − control_type = powercap_register_control_type(NULL, "intel-rapl", NULL); | |
| 1214 | − if (IS_ERR(control_type)) { | |
| 1213 | + rapl_msr_priv.control_type = powercap_register_control_type(NULL, "intel-rapl", NULL); | |
| 1214 | + if (IS_ERR(rapl_msr_priv.control_type)) { | |
| 1215 | 1215 | pr_debug("failed to register powercap control_type.\n"); |
| 1216 | − return PTR_ERR(control_type); | |
| 1216 | + return PTR_ERR(rapl_msr_priv.control_type); | |
| 1217 | 1217 | } |
| 1218 | 1218 | return 0; |
| 1219 | 1219 | } |
| @@ -1338,16 +1338,16 @@ static void rapl_remove_package(struct rapl_package *rp) · 118 unmodified lines | ||
| 1338 | 1338 | } |
| 1339 | 1339 | pr_debug("remove package, undo power limit on %s: %s\n", |
| 1340 | 1340 | rp->name, rd->name); |
| 1341 | − powercap_unregister_zone(control_type, &rd->power_zone); | |
| 1341 | + powercap_unregister_zone(rp->priv->control_type, &rd->power_zone); | |
| 1342 | 1342 | } |
| 1343 | 1343 | /* do parent zone last */ |
| 1344 | − powercap_unregister_zone(control_type, &rd_package->power_zone); | |
| 1344 | + powercap_unregister_zone(rp->priv->control_type, &rd_package->power_zone); | |
| 1345 | 1345 | list_del(&rp->plist); |
| 1346 | 1346 | kfree(rp); |
| 1347 | 1347 | } |
| 1348 | 1348 | |
| 1349 | 1349 | /* called from CPU hotplug notifier, hotplug lock held */ |
| 1350 | −static struct rapl_package *rapl_add_package(int cpu) | |
| 1350 | +static struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv) | |
| 1351 | 1351 | { |
| 1352 | 1352 | int id = topology_logical_die_id(cpu); |
| 1353 | 1353 | struct rapl_package *rp; |
| @@ -1361,6 +1361,7 @@ static struct rapl_package *rapl_add_package(int cpu) · 7 unmodified lines | ||
| 1361 | 1361 | /* add the new package to the list */ |
| 1362 | 1362 | rp->id = id; |
| 1363 | 1363 | rp->lead_cpu = cpu; |
| 1364 | + rp->priv = priv; | |
| 1364 | 1365 | |
| 1365 | 1366 | if (topology_max_die_per_package() > 1) |
| 1366 | 1367 | snprintf(rp->name, PACKAGE_DOMAIN_NAME_LENGTH, |
| @@ -1399,9 +1400,9 @@ static int rapl_cpu_online(unsigned int cpu) · 32 unmodified lines | ||
| 1399 | 1400 | { |
| 1400 | 1401 | struct rapl_package *rp; |
| 1401 | 1402 | |
| 1402 | − rp = rapl_find_package_domain(cpu); | |
| 1403 | + rp = rapl_find_package_domain(cpu, &rapl_msr_priv); | |
| 1403 | 1404 | if (!rp) { |
| 1404 | − rp = rapl_add_package(cpu); | |
| 1405 | + rp = rapl_add_package(cpu, &rapl_msr_priv); | |
| 1405 | 1406 | if (IS_ERR(rp)) |
| 1406 | 1407 | return PTR_ERR(rp); |
| 1407 | 1408 | } |
| @@ -1414,7 +1415,7 @@ static int rapl_cpu_down_prep(unsigned int cpu) · 6 unmodified lines | ||
| 1414 | 1415 | struct rapl_package *rp; |
| 1415 | 1416 | int lead_cpu; |
| 1416 | 1417 | |
| 1417 | − rp = rapl_find_package_domain(cpu); | |
| 1418 | + rp = rapl_find_package_domain(cpu, &rapl_msr_priv); | |
| 1418 | 1419 | if (!rp) |
| 1419 | 1420 | return 0; |
| 1420 | 1421 | |
| @@ -1427,8 +1428,6 @@ static int rapl_cpu_down_prep(unsigned int cpu) · 6 unmodified lines | ||
| 1427 | 1428 | return 0; |
| 1428 | 1429 | } |
| 1429 | 1430 | |
| 1430 | −static enum cpuhp_state pcap_rapl_online; | |
| 1431 | − | |
| 1432 | 1431 | static void power_limit_state_save(void) |
| 1433 | 1432 | { |
| 1434 | 1433 | struct rapl_package *rp; |
| @@ -1538,7 +1537,7 @@ static int __init rapl_init(void) · 103 unmodified lines | ||
| 1538 | 1537 | rapl_cpu_online, rapl_cpu_down_prep); |
| 1539 | 1538 | if (ret < 0) |
| 1540 | 1539 | goto err_unreg; |
| 1541 | − pcap_rapl_online = ret; | |
| 1540 | + rapl_msr_priv.pcap_rapl_online = ret; | |
| 1542 | 1541 | |
| 1543 | 1542 | /* Don't bail out if PSys is not supported */ |
| 1544 | 1543 | rapl_register_psys(); |
| @@ -1550,7 +1549,7 @@ static int __init rapl_init(void) · 5 unmodified lines | ||
| 1550 | 1549 | return 0; |
| 1551 | 1550 | |
| 1552 | 1551 | err_unreg_all: |
| 1553 | − cpuhp_remove_state(pcap_rapl_online); | |
| 1552 | + cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online); | |
| 1554 | 1553 | |
| 1555 | 1554 | err_unreg: |
| 1556 | 1555 | rapl_unregister_powercap(); |
| @@ -1560,7 +1559,7 @@ err_unreg: · 3 unmodified lines | ||
| 1560 | 1559 | static void __exit rapl_exit(void) |
| 1561 | 1560 | { |
| 1562 | 1561 | unregister_pm_notifier(&rapl_pm_notifier); |
| 1563 | − cpuhp_remove_state(pcap_rapl_online); | |
| 1562 | + cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online); | |
| 1564 | 1563 | rapl_unregister_powercap(); |
| 1565 | 1564 | } |
| 1566 | 1565 | |
| @@ -88,6 +88,20 @@ struct rapl_domain { · 87 unmodified lines | ||
| 88 | 88 | struct rapl_package *rp; |
| 89 | 89 | }; |
| 90 | 90 | |
| 91 | +/** | |
| 92 | + * struct rapl_if_priv: private data for different RAPL interfaces | |
| 93 | + * @control_type: Each RAPL interface must have its own powercap | |
| 94 | + * control type. | |
| 95 | + * @platform_rapl_domain: Optional. Some RAPL interface may have platform | |
| 96 | + * level RAPL control. | |
| 97 | + * @pcap_rapl_online: CPU hotplug state for each RAPL interface. | |
| 98 | + */ | |
| 99 | +struct rapl_if_priv { | |
| 100 | + struct powercap_control_type *control_type; | |
| 101 | + struct rapl_domain *platform_rapl_domain; | |
| 102 | + enum cpuhp_state pcap_rapl_online; | |
| 103 | +}; | |
| 104 | + | |
| 91 | 105 | /* maximum rapl package domain name: package-%d-die-%d */ |
| 92 | 106 | #define PACKAGE_DOMAIN_NAME_LENGTH 30 |
| 93 | 107 | |
| @@ -108,6 +122,7 @@ struct rapl_package { · 14 unmodified lines | ||
| 108 | 122 | /* Track active cpus */ |
| 109 | 123 | struct cpumask cpumask; |
| 110 | 124 | char name[PACKAGE_DOMAIN_NAME_LENGTH]; |
| 125 | + struct rapl_if_priv *priv; | |
| 111 | 126 | }; |
| 112 | 127 | |
| 113 | 128 | #endif /* __INTEL_RAPL_H__ */ |