Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'turbostat' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux

Pull turbostat updates from Len Brown:
"Update to turbostat v20.03.20.

These patches unlock the full turbostat features for some new
machines, plus a couple other minor tweaks"

* 'turbostat' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux:
tools/power turbostat: update version
tools/power turbostat: Print cpuidle information
tools/power turbostat: Fix 32-bit capabilities warning
tools/power turbostat: Fix missing SYS_LPI counter on some Chromebooks
tools/power turbostat: Support Elkhart Lake
tools/power turbostat: Support Jasper Lake
tools/power turbostat: Support Ice Lake server
tools/power turbostat: Support Tiger Lake
tools/power turbostat: Fix gcc build warnings
tools/power turbostat: Support Cometlake

+115 -31
+1 -1
tools/power/x86/turbostat/Makefile
··· 16 16 17 17 %: %.c 18 18 @mkdir -p $(BUILD_OUTPUT) 19 - $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) 19 + $(CC) $(CFLAGS) $< -o $(BUILD_OUTPUT)/$@ $(LDFLAGS) -lcap 20 20 21 21 .PHONY : clean 22 22 clean :
+114 -30
tools/power/x86/turbostat/turbostat.c
··· 30 30 #include <sched.h> 31 31 #include <time.h> 32 32 #include <cpuid.h> 33 - #include <linux/capability.h> 33 + #include <sys/capability.h> 34 34 #include <errno.h> 35 35 #include <math.h> 36 36 ··· 303 303 int *irqs_per_cpu; /* indexed by cpu_num */ 304 304 305 305 void setup_all_buffers(void); 306 + 307 + char *sys_lpi_file; 308 + char *sys_lpi_file_sysfs = "/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us"; 309 + char *sys_lpi_file_debugfs = "/sys/kernel/debug/pmc_core/slp_s0_residency_usec"; 306 310 307 311 int cpu_is_not_present(int cpu) 308 312 { ··· 2920 2916 * 2921 2917 * record snapshot of 2922 2918 * /sys/devices/system/cpu/cpuidle/low_power_idle_cpu_residency_us 2923 - * 2924 - * return 1 if config change requires a restart, else return 0 2925 2919 */ 2926 2920 int snapshot_cpu_lpi_us(void) 2927 2921 { ··· 2943 2941 /* 2944 2942 * snapshot_sys_lpi() 2945 2943 * 2946 - * record snapshot of 2947 - * /sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us 2948 - * 2949 - * return 1 if config change requires a restart, else return 0 2944 + * record snapshot of sys_lpi_file 2950 2945 */ 2951 2946 int snapshot_sys_lpi_us(void) 2952 2947 { 2953 2948 FILE *fp; 2954 2949 int retval; 2955 2950 2956 - fp = fopen_or_die("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", "r"); 2951 + fp = fopen_or_die(sys_lpi_file, "r"); 2957 2952 2958 2953 retval = fscanf(fp, "%lld", &cpuidle_cur_sys_lpi_us); 2959 2954 if (retval != 1) { ··· 3150 3151 err(-5, "no /dev/cpu/0/msr, Try \"# modprobe msr\" "); 3151 3152 } 3152 3153 3153 - void check_permissions() 3154 + /* 3155 + * check for CAP_SYS_RAWIO 3156 + * return 0 on success 3157 + * return 1 on fail 3158 + */ 3159 + int check_for_cap_sys_rawio(void) 3154 3160 { 3155 - struct __user_cap_header_struct cap_header_data; 3156 - cap_user_header_t cap_header = &cap_header_data; 3157 - struct __user_cap_data_struct cap_data_data; 3158 - cap_user_data_t cap_data = &cap_data_data; 3159 - extern int capget(cap_user_header_t hdrp, cap_user_data_t datap); 3161 + cap_t caps; 3162 + cap_flag_value_t cap_flag_value; 3163 + 3164 + caps = cap_get_proc(); 3165 + if (caps == NULL) 3166 + err(-6, "cap_get_proc\n"); 3167 + 3168 + if (cap_get_flag(caps, CAP_SYS_RAWIO, CAP_EFFECTIVE, &cap_flag_value)) 3169 + err(-6, "cap_get\n"); 3170 + 3171 + if (cap_flag_value != CAP_SET) { 3172 + warnx("capget(CAP_SYS_RAWIO) failed," 3173 + " try \"# setcap cap_sys_rawio=ep %s\"", progname); 3174 + return 1; 3175 + } 3176 + 3177 + if (cap_free(caps) == -1) 3178 + err(-6, "cap_free\n"); 3179 + 3180 + return 0; 3181 + } 3182 + void check_permissions(void) 3183 + { 3160 3184 int do_exit = 0; 3161 3185 char pathname[32]; 3162 3186 3163 3187 /* check for CAP_SYS_RAWIO */ 3164 - cap_header->pid = getpid(); 3165 - cap_header->version = _LINUX_CAPABILITY_VERSION; 3166 - if (capget(cap_header, cap_data) < 0) 3167 - err(-6, "capget(2) failed"); 3168 - 3169 - if ((cap_data->effective & (1 << CAP_SYS_RAWIO)) == 0) { 3170 - do_exit++; 3171 - warnx("capget(CAP_SYS_RAWIO) failed," 3172 - " try \"# setcap cap_sys_rawio=ep %s\"", progname); 3173 - } 3188 + do_exit += check_for_cap_sys_rawio(); 3174 3189 3175 3190 /* test file permissions */ 3176 3191 sprintf(pathname, "/dev/cpu/%d/msr", base_cpu); ··· 3278 3265 case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ 3279 3266 case INTEL_FAM6_ATOM_GOLDMONT_PLUS: 3280 3267 case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ 3268 + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ 3281 3269 pkg_cstate_limits = glm_pkg_cstate_limits; 3282 3270 break; 3283 3271 default: ··· 3346 3332 3347 3333 switch (model) { 3348 3334 case INTEL_FAM6_SKYLAKE_X: 3335 + return 1; 3336 + } 3337 + return 0; 3338 + } 3339 + int is_ehl(unsigned int family, unsigned int model) 3340 + { 3341 + if (!genuine_intel) 3342 + return 0; 3343 + 3344 + switch (model) { 3345 + case INTEL_FAM6_ATOM_TREMONT: 3349 3346 return 1; 3350 3347 } 3351 3348 return 0; ··· 3503 3478 dump_nhm_cst_cfg(); 3504 3479 } 3505 3480 3481 + static void dump_sysfs_file(char *path) 3482 + { 3483 + FILE *input; 3484 + char cpuidle_buf[64]; 3485 + 3486 + input = fopen(path, "r"); 3487 + if (input == NULL) { 3488 + if (debug) 3489 + fprintf(outf, "NSFOD %s\n", path); 3490 + return; 3491 + } 3492 + if (!fgets(cpuidle_buf, sizeof(cpuidle_buf), input)) 3493 + err(1, "%s: failed to read file", path); 3494 + fclose(input); 3495 + 3496 + fprintf(outf, "%s: %s", strrchr(path, '/') + 1, cpuidle_buf); 3497 + } 3506 3498 static void 3507 3499 dump_sysfs_cstate_config(void) 3508 3500 { ··· 3532 3490 3533 3491 if (!DO_BIC(BIC_sysfs)) 3534 3492 return; 3493 + 3494 + if (access("/sys/devices/system/cpu/cpuidle", R_OK)) { 3495 + fprintf(outf, "cpuidle not loaded\n"); 3496 + return; 3497 + } 3498 + 3499 + dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_driver"); 3500 + dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_governor"); 3501 + dump_sysfs_file("/sys/devices/system/cpu/cpuidle/current_governor_ro"); 3535 3502 3536 3503 for (state = 0; state < 10; ++state) { 3537 3504 ··· 3945 3894 else 3946 3895 BIC_PRESENT(BIC_PkgWatt); 3947 3896 break; 3897 + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ 3898 + do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO; 3899 + if (rapl_joules) { 3900 + BIC_PRESENT(BIC_Pkg_J); 3901 + BIC_PRESENT(BIC_Cor_J); 3902 + BIC_PRESENT(BIC_RAM_J); 3903 + BIC_PRESENT(BIC_GFX_J); 3904 + } else { 3905 + BIC_PRESENT(BIC_PkgWatt); 3906 + BIC_PRESENT(BIC_CorWatt); 3907 + BIC_PRESENT(BIC_RAMWatt); 3908 + BIC_PRESENT(BIC_GFXWatt); 3909 + } 3910 + break; 3948 3911 case INTEL_FAM6_SKYLAKE_L: /* SKL */ 3949 3912 case INTEL_FAM6_CANNONLAKE_L: /* CNL */ 3950 3913 do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO; ··· 4360 4295 case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ 4361 4296 case INTEL_FAM6_ATOM_GOLDMONT_PLUS: 4362 4297 case INTEL_FAM6_ATOM_GOLDMONT_D: /* DNV */ 4298 + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ 4363 4299 return 1; 4364 4300 } 4365 4301 return 0; ··· 4390 4324 case INTEL_FAM6_CANNONLAKE_L: /* CNL */ 4391 4325 case INTEL_FAM6_ATOM_GOLDMONT: /* BXT */ 4392 4326 case INTEL_FAM6_ATOM_GOLDMONT_PLUS: 4327 + case INTEL_FAM6_ATOM_TREMONT: /* EHL */ 4393 4328 return 1; 4394 4329 } 4395 4330 return 0; ··· 4677 4610 case INTEL_FAM6_SKYLAKE: 4678 4611 case INTEL_FAM6_KABYLAKE_L: 4679 4612 case INTEL_FAM6_KABYLAKE: 4613 + case INTEL_FAM6_COMETLAKE_L: 4614 + case INTEL_FAM6_COMETLAKE: 4680 4615 return INTEL_FAM6_SKYLAKE_L; 4681 4616 4682 4617 case INTEL_FAM6_ICELAKE_L: 4683 4618 case INTEL_FAM6_ICELAKE_NNPI: 4619 + case INTEL_FAM6_TIGERLAKE_L: 4620 + case INTEL_FAM6_TIGERLAKE: 4684 4621 return INTEL_FAM6_CANNONLAKE_L; 4685 4622 4686 4623 case INTEL_FAM6_ATOM_TREMONT_D: 4687 4624 return INTEL_FAM6_ATOM_GOLDMONT_D; 4625 + 4626 + case INTEL_FAM6_ATOM_TREMONT_L: 4627 + return INTEL_FAM6_ATOM_TREMONT; 4628 + 4629 + case INTEL_FAM6_ICELAKE_X: 4630 + return INTEL_FAM6_SKYLAKE_X; 4688 4631 } 4689 4632 return model; 4690 4633 } ··· 4949 4872 do_slm_cstates = is_slm(family, model); 4950 4873 do_knl_cstates = is_knl(family, model); 4951 4874 4952 - if (do_slm_cstates || do_knl_cstates || is_cnl(family, model)) 4875 + if (do_slm_cstates || do_knl_cstates || is_cnl(family, model) || 4876 + is_ehl(family, model)) 4953 4877 BIC_NOT_PRESENT(BIC_CPU_c3); 4954 4878 4955 4879 if (!quiet) ··· 4985 4907 else 4986 4908 BIC_NOT_PRESENT(BIC_CPU_LPI); 4987 4909 4988 - if (!access("/sys/devices/system/cpu/cpuidle/low_power_idle_system_residency_us", R_OK)) 4910 + if (!access(sys_lpi_file_sysfs, R_OK)) { 4911 + sys_lpi_file = sys_lpi_file_sysfs; 4989 4912 BIC_PRESENT(BIC_SYS_LPI); 4990 - else 4913 + } else if (!access(sys_lpi_file_debugfs, R_OK)) { 4914 + sys_lpi_file = sys_lpi_file_debugfs; 4915 + BIC_PRESENT(BIC_SYS_LPI); 4916 + } else { 4917 + sys_lpi_file_sysfs = NULL; 4991 4918 BIC_NOT_PRESENT(BIC_SYS_LPI); 4919 + } 4992 4920 4993 4921 if (!quiet) 4994 4922 decode_misc_feature_control(); ··· 5390 5306 } 5391 5307 5392 5308 void print_version() { 5393 - fprintf(outf, "turbostat version 19.08.31" 5309 + fprintf(outf, "turbostat version 20.03.20" 5394 5310 " - Len Brown <lenb@kernel.org>\n"); 5395 5311 } 5396 5312 ··· 5407 5323 } 5408 5324 5409 5325 msrp->msr_num = msr_num; 5410 - strncpy(msrp->name, name, NAME_BYTES); 5326 + strncpy(msrp->name, name, NAME_BYTES - 1); 5411 5327 if (path) 5412 - strncpy(msrp->path, path, PATH_BYTES); 5328 + strncpy(msrp->path, path, PATH_BYTES - 1); 5413 5329 msrp->width = width; 5414 5330 msrp->type = type; 5415 5331 msrp->format = format;