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
7575 TIME_UNIT,
7676 };
7777
78+/* private data for RAPL MSR Interface */
79+static struct rapl_if_priv rapl_msr_priv;
80+
7881 /* per domain data, some are optional */
7982 #define NR_RAW_PRIMITIVES (NR_RAPL_PRIMITIVES - 2)
8083
@@ -155,17 +158,14 @@ static const char * const rapl_domain_names[] = { · 74 unmodified lines
155158 "psys",
156159 };
157160
158−static struct powercap_control_type *control_type; /* PowerCap Controller */
159−static struct rapl_domain *platform_rapl_domain; /* Platform (PSys) domain */
160−
161161 /* 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)
163163 {
164164 int id = topology_logical_die_id(cpu);
165165 struct rapl_package *rp;
166166
167167 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)
169169 return rp;
170170 }
171171
@@ -1090,12 +1090,12 @@ static void rapl_update_domain_data(struct rapl_package *rp) · 918 unmodified lines
10901090
10911091 static void rapl_unregister_powercap(void)
10921092 {
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);
10971097 }
1098− powercap_unregister_control_type(control_type);
1098+ powercap_unregister_control_type(rapl_msr_priv.control_type);
10991099 }
11001100
11011101 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
11131113 nr_pl = find_nr_power_limit(rd);
11141114 pr_debug("register package domain %s\n", rp->name);
11151115 power_zone = powercap_register_zone(&rd->power_zone,
1116− control_type,
1116+ rp->priv->control_type,
11171117 rp->name, NULL,
11181118 &zone_ops[rd->id],
11191119 nr_pl,
@@ -1140,7 +1140,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp) · 20 unmodified lines
11401140 /* number of power limits per domain varies */
11411141 nr_pl = find_nr_power_limit(rd);
11421142 power_zone = powercap_register_zone(&rd->power_zone,
1143− control_type, rd->name,
1143+ rp->priv->control_type, rd->name,
11441144 rp->power_zone,
11451145 &zone_ops[rd->id], nr_pl,
11461146 &constraint_ops);
@@ -1161,7 +1161,7 @@ err_cleanup: · 14 unmodified lines
11611161 */
11621162 while (--rd >= rp->domains) {
11631163 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);
11651165 }
11661166
11671167 return ret;
@@ -1191,9 +1191,9 @@ static int __init rapl_register_psys(void) · 23 unmodified lines
11911191 rd->rpl[0].name = pl1_name;
11921192 rd->rpl[1].prim_id = PL2_ENABLE;
11931193 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);
11951195
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,
11971197 "psys", NULL,
11981198 &zone_ops[RAPL_DOMAIN_PLATFORM],
11991199 2, &constraint_ops);
@@ -1203,17 +1203,17 @@ static int __init rapl_register_psys(void) · 3 unmodified lines
12031203 return PTR_ERR(power_zone);
12041204 }
12051205
1206− platform_rapl_domain = rd;
1206+ rapl_msr_priv.platform_rapl_domain = rd;
12071207
12081208 return 0;
12091209 }
12101210
12111211 static int __init rapl_register_powercap(void)
12121212 {
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)) {
12151215 pr_debug("failed to register powercap control_type.\n");
1216− return PTR_ERR(control_type);
1216+ return PTR_ERR(rapl_msr_priv.control_type);
12171217 }
12181218 return 0;
12191219 }
@@ -1338,16 +1338,16 @@ static void rapl_remove_package(struct rapl_package *rp) · 118 unmodified lines
13381338 }
13391339 pr_debug("remove package, undo power limit on %s: %s\n",
13401340 rp->name, rd->name);
1341− powercap_unregister_zone(control_type, &rd->power_zone);
1341+ powercap_unregister_zone(rp->priv->control_type, &rd->power_zone);
13421342 }
13431343 /* 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);
13451345 list_del(&rp->plist);
13461346 kfree(rp);
13471347 }
13481348
13491349 /* 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)
13511351 {
13521352 int id = topology_logical_die_id(cpu);
13531353 struct rapl_package *rp;
@@ -1361,6 +1361,7 @@ static struct rapl_package *rapl_add_package(int cpu) · 7 unmodified lines
13611361 /* add the new package to the list */
13621362 rp->id = id;
13631363 rp->lead_cpu = cpu;
1364+ rp->priv = priv;
13641365
13651366 if (topology_max_die_per_package() > 1)
13661367 snprintf(rp->name, PACKAGE_DOMAIN_NAME_LENGTH,
@@ -1399,9 +1400,9 @@ static int rapl_cpu_online(unsigned int cpu) · 32 unmodified lines
13991400 {
14001401 struct rapl_package *rp;
14011402
1402− rp = rapl_find_package_domain(cpu);
1403+ rp = rapl_find_package_domain(cpu, &rapl_msr_priv);
14031404 if (!rp) {
1404− rp = rapl_add_package(cpu);
1405+ rp = rapl_add_package(cpu, &rapl_msr_priv);
14051406 if (IS_ERR(rp))
14061407 return PTR_ERR(rp);
14071408 }
@@ -1414,7 +1415,7 @@ static int rapl_cpu_down_prep(unsigned int cpu) · 6 unmodified lines
14141415 struct rapl_package *rp;
14151416 int lead_cpu;
14161417
1417− rp = rapl_find_package_domain(cpu);
1418+ rp = rapl_find_package_domain(cpu, &rapl_msr_priv);
14181419 if (!rp)
14191420 return 0;
14201421
@@ -1427,8 +1428,6 @@ static int rapl_cpu_down_prep(unsigned int cpu) · 6 unmodified lines
14271428 return 0;
14281429 }
14291430
1430−static enum cpuhp_state pcap_rapl_online;
1431−
14321431 static void power_limit_state_save(void)
14331432 {
14341433 struct rapl_package *rp;
@@ -1538,7 +1537,7 @@ static int __init rapl_init(void) · 103 unmodified lines
15381537 rapl_cpu_online, rapl_cpu_down_prep);
15391538 if (ret < 0)
15401539 goto err_unreg;
1541− pcap_rapl_online = ret;
1540+ rapl_msr_priv.pcap_rapl_online = ret;
15421541
15431542 /* Don't bail out if PSys is not supported */
15441543 rapl_register_psys();
@@ -1550,7 +1549,7 @@ static int __init rapl_init(void) · 5 unmodified lines
15501549 return 0;
15511550
15521551 err_unreg_all:
1553− cpuhp_remove_state(pcap_rapl_online);
1552+ cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online);
15541553
15551554 err_unreg:
15561555 rapl_unregister_powercap();
@@ -1560,7 +1559,7 @@ err_unreg: · 3 unmodified lines
15601559 static void __exit rapl_exit(void)
15611560 {
15621561 unregister_pm_notifier(&rapl_pm_notifier);
1563− cpuhp_remove_state(pcap_rapl_online);
1562+ cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online);
15641563 rapl_unregister_powercap();
15651564 }
15661565
include/linux/intel_rapl.h+15−0
@@ -88,6 +88,20 @@ struct rapl_domain { · 87 unmodified lines
8888 struct rapl_package *rp;
8989 };
9090
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+
91105 /* maximum rapl package domain name: package-%d-die-%d */
92106 #define PACKAGE_DOMAIN_NAME_LENGTH 30
93107
@@ -108,6 +122,7 @@ struct rapl_package { · 14 unmodified lines
108122 /* Track active cpus */
109123 struct cpumask cpumask;
110124 char name[PACKAGE_DOMAIN_NAME_LENGTH];
125+ struct rapl_if_priv *priv;
111126 };
112127
113128 #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