History

intel_rapl: introduce struct rapl_if_private

Introduce a new structure, rapl_if_private, to save the private data for different RAPL Interface.

Zhang Rui committed 7 years ago

Commit 7ebf8ef1 parent ff956822 files · +44 −30Browse files

Unified · Split

2 files
  1. drivers/powercap/intel_rapl.c +29 −30
  2. include/linux/intel_rapl.h +15 −0
drivers/powercap/intel_rapl.c+29−30
@@ -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 */
79static 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
158static struct powercap_control_type *control_type; /* PowerCap Controller */
159static 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 */
162static struct rapl_package *rapl_find_package_domain(int cpu)162static 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
1091static void rapl_unregister_powercap(void)1091static 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
1101static int rapl_package_register_powercap(struct rapl_package *rp)1101static 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
1211static int __init rapl_register_powercap(void)1211static 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 */
1350static struct rapl_package *rapl_add_package(int cpu)1350static 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
1430static enum cpuhp_state pcap_rapl_online;
1431
1432static void power_limit_state_save(void)1431static 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
1552err_unreg_all:1551err_unreg_all:
1553 cpuhp_remove_state(pcap_rapl_online);1552 cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online);
1554 1553
1555err_unreg:1554err_unreg:
1556 rapl_unregister_powercap();1555 rapl_unregister_powercap();
@@ -1560,7 +1559,7 @@ err_unreg: · 3 unmodified lines
1560static void __exit rapl_exit(void)1559static 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
include/linux/intel_rapl.h+15−0
@@ -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 */
99struct 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 30106#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__ */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t