@@ -178,12 +178,15 @@ struct rapl_domain {
178
178
#define power_zone_to_rapl_domain (_zone ) \
179
179
container_of(_zone, struct rapl_domain, power_zone)
180
180
181
+ /* maximum rapl package domain name: package-%d-die-%d */
182
+ #define PACKAGE_DOMAIN_NAME_LENGTH 30
181
183
182
- /* Each physical package contains multiple domains, these are the common
184
+
185
+ /* Each rapl package contains multiple domains, these are the common
183
186
* data across RAPL domains within a package.
184
187
*/
185
188
struct rapl_package {
186
- unsigned int id ; /* physical package/socket id */
189
+ unsigned int id ; /* logical die id, equals physical 1-die systems */
187
190
unsigned int nr_domains ;
188
191
unsigned long domain_map ; /* bit map of active domains */
189
192
unsigned int power_unit ;
@@ -198,6 +201,7 @@ struct rapl_package {
198
201
int lead_cpu ; /* one active cpu per package for access */
199
202
/* Track active cpus */
200
203
struct cpumask cpumask ;
204
+ char name [PACKAGE_DOMAIN_NAME_LENGTH ];
201
205
};
202
206
203
207
struct rapl_defaults {
@@ -926,8 +930,8 @@ static int rapl_check_unit_core(struct rapl_package *rp, int cpu)
926
930
value = (msr_val & TIME_UNIT_MASK ) >> TIME_UNIT_OFFSET ;
927
931
rp -> time_unit = 1000000 / (1 << value );
928
932
929
- pr_debug ("Core CPU package %d energy=%dpJ, time=%dus, power=%duW\n" ,
930
- rp -> id , rp -> energy_unit , rp -> time_unit , rp -> power_unit );
933
+ pr_debug ("Core CPU %s energy=%dpJ, time=%dus, power=%duW\n" ,
934
+ rp -> name , rp -> energy_unit , rp -> time_unit , rp -> power_unit );
931
935
932
936
return 0 ;
933
937
}
@@ -951,8 +955,8 @@ static int rapl_check_unit_atom(struct rapl_package *rp, int cpu)
951
955
value = (msr_val & TIME_UNIT_MASK ) >> TIME_UNIT_OFFSET ;
952
956
rp -> time_unit = 1000000 / (1 << value );
953
957
954
- pr_debug ("Atom package %d energy=%dpJ, time=%dus, power=%duW\n" ,
955
- rp -> id , rp -> energy_unit , rp -> time_unit , rp -> power_unit );
958
+ pr_debug ("Atom %s energy=%dpJ, time=%dus, power=%duW\n" ,
959
+ rp -> name , rp -> energy_unit , rp -> time_unit , rp -> power_unit );
956
960
957
961
return 0 ;
958
962
}
@@ -1181,7 +1185,7 @@ static void rapl_update_domain_data(struct rapl_package *rp)
1181
1185
u64 val ;
1182
1186
1183
1187
for (dmn = 0 ; dmn < rp -> nr_domains ; dmn ++ ) {
1184
- pr_debug ("update package %d domain %s data\n" , rp -> id ,
1188
+ pr_debug ("update %s domain %s data\n" , rp -> name ,
1185
1189
rp -> domains [dmn ].name );
1186
1190
/* exclude non-raw primitives */
1187
1191
for (prim = 0 ; prim < NR_RAW_PRIMITIVES ; prim ++ ) {
@@ -1206,7 +1210,6 @@ static void rapl_unregister_powercap(void)
1206
1210
static int rapl_package_register_powercap (struct rapl_package * rp )
1207
1211
{
1208
1212
struct rapl_domain * rd ;
1209
- char dev_name [17 ]; /* max domain name = 7 + 1 + 8 for int + 1 for null*/
1210
1213
struct powercap_zone * power_zone = NULL ;
1211
1214
int nr_pl , ret ;
1212
1215
@@ -1217,20 +1220,16 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
1217
1220
for (rd = rp -> domains ; rd < rp -> domains + rp -> nr_domains ; rd ++ ) {
1218
1221
if (rd -> id == RAPL_DOMAIN_PACKAGE ) {
1219
1222
nr_pl = find_nr_power_limit (rd );
1220
- pr_debug ("register socket %d package domain %s\n" ,
1221
- rp -> id , rd -> name );
1222
- memset (dev_name , 0 , sizeof (dev_name ));
1223
- snprintf (dev_name , sizeof (dev_name ), "%s-%d" ,
1224
- rd -> name , rp -> id );
1223
+ pr_debug ("register package domain %s\n" , rp -> name );
1225
1224
power_zone = powercap_register_zone (& rd -> power_zone ,
1226
1225
control_type ,
1227
- dev_name , NULL ,
1226
+ rp -> name , NULL ,
1228
1227
& zone_ops [rd -> id ],
1229
1228
nr_pl ,
1230
1229
& constraint_ops );
1231
1230
if (IS_ERR (power_zone )) {
1232
- pr_debug ("failed to register package, %d \n" ,
1233
- rp -> id );
1231
+ pr_debug ("failed to register power zone %s \n" ,
1232
+ rp -> name );
1234
1233
return PTR_ERR (power_zone );
1235
1234
}
1236
1235
/* track parent zone in per package/socket data */
@@ -1256,8 +1255,8 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
1256
1255
& constraint_ops );
1257
1256
1258
1257
if (IS_ERR (power_zone )) {
1259
- pr_debug ("failed to register power_zone, %d:% s:%s\n" ,
1260
- rp -> id , rd -> name , dev_name );
1258
+ pr_debug ("failed to register power_zone, %s:%s\n" ,
1259
+ rp -> name , rd -> name );
1261
1260
ret = PTR_ERR (power_zone );
1262
1261
goto err_cleanup ;
1263
1262
}
@@ -1270,7 +1269,7 @@ static int rapl_package_register_powercap(struct rapl_package *rp)
1270
1269
* failed after the first domain setup.
1271
1270
*/
1272
1271
while (-- rd >= rp -> domains ) {
1273
- pr_debug ("unregister package %d domain %s\n" , rp -> id , rd -> name );
1272
+ pr_debug ("unregister %s domain %s\n" , rp -> name , rd -> name );
1274
1273
powercap_unregister_zone (control_type , & rd -> power_zone );
1275
1274
}
1276
1275
@@ -1380,8 +1379,8 @@ static void rapl_detect_powerlimit(struct rapl_domain *rd)
1380
1379
/* check if the domain is locked by BIOS, ignore if MSR doesn't exist */
1381
1380
if (!rapl_read_data_raw (rd , FW_LOCK , false, & val64 )) {
1382
1381
if (val64 ) {
1383
- pr_info ("RAPL package %d domain %s locked by BIOS\n" ,
1384
- rd -> rp -> id , rd -> name );
1382
+ pr_info ("RAPL %s domain %s locked by BIOS\n" ,
1383
+ rd -> rp -> name , rd -> name );
1385
1384
rd -> state |= DOMAIN_STATE_BIOS_LOCKED ;
1386
1385
}
1387
1386
}
@@ -1410,10 +1409,10 @@ static int rapl_detect_domains(struct rapl_package *rp, int cpu)
1410
1409
}
1411
1410
rp -> nr_domains = bitmap_weight (& rp -> domain_map , RAPL_DOMAIN_MAX );
1412
1411
if (!rp -> nr_domains ) {
1413
- pr_debug ("no valid rapl domains found in package %d \n" , rp -> id );
1412
+ pr_debug ("no valid rapl domains found in %s \n" , rp -> name );
1414
1413
return - ENODEV ;
1415
1414
}
1416
- pr_debug ("found %d domains on package %d \n" , rp -> nr_domains , rp -> id );
1415
+ pr_debug ("found %d domains on %s \n" , rp -> nr_domains , rp -> name );
1417
1416
1418
1417
rp -> domains = kcalloc (rp -> nr_domains + 1 , sizeof (struct rapl_domain ),
1419
1418
GFP_KERNEL );
@@ -1446,8 +1445,8 @@ static void rapl_remove_package(struct rapl_package *rp)
1446
1445
rd_package = rd ;
1447
1446
continue ;
1448
1447
}
1449
- pr_debug ("remove package, undo power limit on %d : %s\n" ,
1450
- rp -> id , rd -> name );
1448
+ pr_debug ("remove package, undo power limit on %s : %s\n" ,
1449
+ rp -> name , rd -> name );
1451
1450
powercap_unregister_zone (control_type , & rd -> power_zone );
1452
1451
}
1453
1452
/* do parent zone last */
@@ -1461,6 +1460,7 @@ static struct rapl_package *rapl_add_package(int cpu)
1461
1460
{
1462
1461
int id = topology_logical_die_id (cpu );
1463
1462
struct rapl_package * rp ;
1463
+ struct cpuinfo_x86 * c = & cpu_data (cpu );
1464
1464
int ret ;
1465
1465
1466
1466
rp = kzalloc (sizeof (struct rapl_package ), GFP_KERNEL );
@@ -1471,6 +1471,13 @@ static struct rapl_package *rapl_add_package(int cpu)
1471
1471
rp -> id = id ;
1472
1472
rp -> lead_cpu = cpu ;
1473
1473
1474
+ if (topology_max_die_per_package () > 1 )
1475
+ snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH ,
1476
+ "package-%d-die-%d" , c -> phys_proc_id , c -> cpu_die_id );
1477
+ else
1478
+ snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d" ,
1479
+ c -> phys_proc_id );
1480
+
1474
1481
/* check if the package contains valid domains */
1475
1482
if (rapl_detect_domains (rp , cpu ) ||
1476
1483
rapl_defaults -> check_unit (rp , cpu )) {
0 commit comments