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 | TIME_UNIT, | 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 | /* per domain data, some are optional */ | 81 | /* per domain data, some are optional */ |
| 79 | #define NR_RAW_PRIMITIVES (NR_RAPL_PRIMITIVES - 2) | 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 | "psys", | 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 | /* caller to ensure CPU hotplug lock is held */ | 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 | int id = topology_logical_die_id(cpu); | 164 | int id = topology_logical_die_id(cpu); |
| 165 | struct rapl_package *rp; | 165 | struct rapl_package *rp; |
| 166 | 166 | ||
| 167 | list_for_each_entry(rp, &rapl_packages, plist) { | 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 | return rp; | 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 | static void rapl_unregister_powercap(void) | 1091 | static void rapl_unregister_powercap(void) |
| 1092 | { | 1092 | { |
| 1093 | if (platform_rapl_domain) { | 1093 | if (&rapl_msr_priv.platform_rapl_domain) { |
| 1094 | powercap_unregister_zone(control_type, | 1094 | powercap_unregister_zone(rapl_msr_priv.control_type, |
| 1095 | &platform_rapl_domain->power_zone); | 1095 | &rapl_msr_priv.platform_rapl_domain->power_zone); |
| 1096 | kfree(platform_rapl_domain); | 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 | static int rapl_package_register_powercap(struct rapl_package *rp) | 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 | nr_pl = find_nr_power_limit(rd); | 1113 | nr_pl = find_nr_power_limit(rd); |
| 1114 | pr_debug("register package domain %s\n", rp->name); | 1114 | pr_debug("register package domain %s\n", rp->name); |
| 1115 | power_zone = powercap_register_zone(&rd->power_zone, | 1115 | power_zone = powercap_register_zone(&rd->power_zone, |
| 1116 | control_type, | 1116 | rp->priv->control_type, |
| 1117 | rp->name, NULL, | 1117 | rp->name, NULL, |
| 1118 | &zone_ops[rd->id], | 1118 | &zone_ops[rd->id], |
| 1119 | nr_pl, | 1119 | nr_pl, |
| @@ -1140,7 +1140,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp) · 20 unmodified lines | |||
| 1140 | /* number of power limits per domain varies */ | 1140 | /* number of power limits per domain varies */ |
| 1141 | nr_pl = find_nr_power_limit(rd); | 1141 | nr_pl = find_nr_power_limit(rd); |
| 1142 | power_zone = powercap_register_zone(&rd->power_zone, | 1142 | power_zone = powercap_register_zone(&rd->power_zone, |
| 1143 | control_type, rd->name, | 1143 | rp->priv->control_type, rd->name, |
| 1144 | rp->power_zone, | 1144 | rp->power_zone, |
| 1145 | &zone_ops[rd->id], nr_pl, | 1145 | &zone_ops[rd->id], nr_pl, |
| 1146 | &constraint_ops); | 1146 | &constraint_ops); |
| @@ -1161,7 +1161,7 @@ err_cleanup: · 14 unmodified lines | |||
| 1161 | */ | 1161 | */ |
| 1162 | while (--rd >= rp->domains) { | 1162 | while (--rd >= rp->domains) { |
| 1163 | pr_debug("unregister %s domain %s\n", rp->name, rd->name); | 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 | return ret; | 1167 | return ret; |
| @@ -1191,9 +1191,9 @@ static int __init rapl_register_psys(void) · 23 unmodified lines | |||
| 1191 | rd->rpl[0].name = pl1_name; | 1191 | rd->rpl[0].name = pl1_name; |
| 1192 | rd->rpl[1].prim_id = PL2_ENABLE; | 1192 | rd->rpl[1].prim_id = PL2_ENABLE; |
| 1193 | rd->rpl[1].name = pl2_name; | 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 | "psys", NULL, | 1197 | "psys", NULL, |
| 1198 | &zone_ops[RAPL_DOMAIN_PLATFORM], | 1198 | &zone_ops[RAPL_DOMAIN_PLATFORM], |
| 1199 | 2, &constraint_ops); | 1199 | 2, &constraint_ops); |
| @@ -1203,17 +1203,17 @@ static int __init rapl_register_psys(void) · 3 unmodified lines | |||
| 1203 | return PTR_ERR(power_zone); | 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 | return 0; | 1208 | return 0; |
| 1209 | } | 1209 | } |
| 1210 | 1210 | ||
| 1211 | static int __init rapl_register_powercap(void) | 1211 | static int __init rapl_register_powercap(void) |
| 1212 | { | 1212 | { |
| 1213 | control_type = powercap_register_control_type(NULL, "intel-rapl", NULL); | 1213 | rapl_msr_priv.control_type = powercap_register_control_type(NULL, "intel-rapl", NULL); |
| 1214 | if (IS_ERR(control_type)) { | 1214 | if (IS_ERR(rapl_msr_priv.control_type)) { |
| 1215 | pr_debug("failed to register powercap control_type.\n"); | 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 | return 0; | 1218 | return 0; |
| 1219 | } | 1219 | } |
| @@ -1338,16 +1338,16 @@ static void rapl_remove_package(struct rapl_package *rp) · 118 unmodified lines | |||
| 1338 | } | 1338 | } |
| 1339 | pr_debug("remove package, undo power limit on %s: %s\n", | 1339 | pr_debug("remove package, undo power limit on %s: %s\n", |
| 1340 | rp->name, rd->name); | 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 | /* do parent zone last */ | 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 | list_del(&rp->plist); | 1345 | list_del(&rp->plist); |
| 1346 | kfree(rp); | 1346 | kfree(rp); |
| 1347 | } | 1347 | } |
| 1348 | 1348 | ||
| 1349 | /* called from CPU hotplug notifier, hotplug lock held */ | 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 | int id = topology_logical_die_id(cpu); | 1352 | int id = topology_logical_die_id(cpu); |
| 1353 | struct rapl_package *rp; | 1353 | struct rapl_package *rp; |
| @@ -1361,6 +1361,7 @@ static struct rapl_package *rapl_add_package(int cpu) · 7 unmodified lines | |||
| 1361 | /* add the new package to the list */ | 1361 | /* add the new package to the list */ |
| 1362 | rp->id = id; | 1362 | rp->id = id; |
| 1363 | rp->lead_cpu = cpu; | 1363 | rp->lead_cpu = cpu; |
| 1364 | rp->priv = priv; | ||
| 1364 | 1365 | ||
| 1365 | if (topology_max_die_per_package() > 1) | 1366 | if (topology_max_die_per_package() > 1) |
| 1366 | snprintf(rp->name, PACKAGE_DOMAIN_NAME_LENGTH, | 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 | struct rapl_package *rp; | 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 | if (!rp) { | 1404 | if (!rp) { |
| 1404 | rp = rapl_add_package(cpu); | 1405 | rp = rapl_add_package(cpu, &rapl_msr_priv); |
| 1405 | if (IS_ERR(rp)) | 1406 | if (IS_ERR(rp)) |
| 1406 | return PTR_ERR(rp); | 1407 | return PTR_ERR(rp); |
| 1407 | } | 1408 | } |
| @@ -1414,7 +1415,7 @@ static int rapl_cpu_down_prep(unsigned int cpu) · 6 unmodified lines | |||
| 1414 | struct rapl_package *rp; | 1415 | struct rapl_package *rp; |
| 1415 | int lead_cpu; | 1416 | int lead_cpu; |
| 1416 | 1417 | ||
| 1417 | rp = rapl_find_package_domain(cpu); | 1418 | rp = rapl_find_package_domain(cpu, &rapl_msr_priv); |
| 1418 | if (!rp) | 1419 | if (!rp) |
| 1419 | return 0; | 1420 | return 0; |
| 1420 | 1421 | ||
| @@ -1427,8 +1428,6 @@ static int rapl_cpu_down_prep(unsigned int cpu) · 6 unmodified lines | |||
| 1427 | return 0; | 1428 | return 0; |
| 1428 | } | 1429 | } |
| 1429 | 1430 | ||
| 1430 | static enum cpuhp_state pcap_rapl_online; | ||
| 1431 | |||
| 1432 | static void power_limit_state_save(void) | 1431 | static void power_limit_state_save(void) |
| 1433 | { | 1432 | { |
| 1434 | struct rapl_package *rp; | 1433 | struct rapl_package *rp; |
| @@ -1538,7 +1537,7 @@ static int __init rapl_init(void) · 103 unmodified lines | |||
| 1538 | rapl_cpu_online, rapl_cpu_down_prep); | 1537 | rapl_cpu_online, rapl_cpu_down_prep); |
| 1539 | if (ret < 0) | 1538 | if (ret < 0) |
| 1540 | goto err_unreg; | 1539 | goto err_unreg; |
| 1541 | pcap_rapl_online = ret; | 1540 | rapl_msr_priv.pcap_rapl_online = ret; |
| 1542 | 1541 | ||
| 1543 | /* Don't bail out if PSys is not supported */ | 1542 | /* Don't bail out if PSys is not supported */ |
| 1544 | rapl_register_psys(); | 1543 | rapl_register_psys(); |
| @@ -1550,7 +1549,7 @@ static int __init rapl_init(void) · 5 unmodified lines | |||
| 1550 | return 0; | 1549 | return 0; |
| 1551 | 1550 | ||
| 1552 | err_unreg_all: | 1551 | err_unreg_all: |
| 1553 | cpuhp_remove_state(pcap_rapl_online); | 1552 | cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online); |
| 1554 | 1553 | ||
| 1555 | err_unreg: | 1554 | err_unreg: |
| 1556 | rapl_unregister_powercap(); | 1555 | rapl_unregister_powercap(); |
| @@ -1560,7 +1559,7 @@ err_unreg: · 3 unmodified lines | |||
| 1560 | static void __exit rapl_exit(void) | 1559 | static void __exit rapl_exit(void) |
| 1561 | { | 1560 | { |
| 1562 | unregister_pm_notifier(&rapl_pm_notifier); | 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 | rapl_unregister_powercap(); | 1563 | rapl_unregister_powercap(); |
| 1565 | } | 1564 | } |
| 1566 | 1565 | ||
| @@ -88,6 +88,20 @@ struct rapl_domain { · 87 unmodified lines | |||
| 88 | struct rapl_package *rp; | 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 | /* maximum rapl package domain name: package-%d-die-%d */ | 105 | /* maximum rapl package domain name: package-%d-die-%d */ |
| 92 | #define PACKAGE_DOMAIN_NAME_LENGTH 30 | 106 | #define PACKAGE_DOMAIN_NAME_LENGTH 30 |
| 93 | 107 | ||
| @@ -108,6 +122,7 @@ struct rapl_package { · 14 unmodified lines | |||
| 108 | /* Track active cpus */ | 122 | /* Track active cpus */ |
| 109 | struct cpumask cpumask; | 123 | struct cpumask cpumask; |
| 110 | char name[PACKAGE_DOMAIN_NAME_LENGTH]; | 124 | char name[PACKAGE_DOMAIN_NAME_LENGTH]; |
| 125 | struct rapl_if_priv *priv; | ||
| 111 | }; | 126 | }; |
| 112 | 127 | ||
| 113 | #endif /* __INTEL_RAPL_H__ */ | 128 | #endif /* __INTEL_RAPL_H__ */ |