lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 25 Aug 2022 13:38:23 -0700 From: samasth.norway.ananda@...cle.com To: linux-pm@...r.kernel.org Cc: lenb@...nel.org, linux-kernel@...r.kernel.org Subject: Re: [PATCH 1/1] turbostat: cpu9: msr offset 0x614 read failed: Input/output error On 1/24/22 10:04 AM, samasth.norway.ananda wrote: > I get the following error running Turbostat on an intel virtual machine. > > turbostat.5.4.17-2136.300.7.el7uek.x86_64: cpu49: msr offset 0x614 read > failed: Input/output error > > The below patch gives a more user friendly message. It is based on the > patch for turbostat from Prarit Bhargava that was posted some time ago. > The patch is "[v2] turbostat: Running on virtual machine is not supported" [1] > and also similar to the patch for x86_energy_perf_policy posted by Ondřej Lysoněk. > The patch is “tools/power x86_energy_perf_policy: Input/output error in a VM"[2]. > > KVM disables MONITOR/MWAIT in __do_cpuid_func(). Hence no VM will have MWAIT > and hence turbostat will not be able to read any C-state related registers > like the failures we see when we run turbostat. Therefore, turbostat should > also gracefully error-out like x86_energy_perf_policy.c. > > [1] https://patchwork.kernel.org/patch/9868587/ > [2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=0936cdfbb527 > > Signed-off-by: Samasth Norway Ananda <samasth.norway.ananda@...cle.com> > --- > tools/power/x86/turbostat/turbostat.c | 68 ++++++++++++++++++++++----- > 1 file changed, 55 insertions(+), 13 deletions(-) > > diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c > index 47d3ba895d6d..c2904c1c0830 100644 > --- a/tools/power/x86/turbostat/turbostat.c > +++ b/tools/power/x86/turbostat/turbostat.c > @@ -538,14 +538,68 @@ int get_instr_count_fd(int cpu) > return fd_instr_count_percpu[cpu]; > } > > +/* > + * * Open a file, and exit on failure > + * */ > +FILE *fopen_or_die(const char *path, const char *mode) > +{ > + FILE *filep = fopen(path, mode); > + > + if (!filep) > + err(1, "%s: open failed", path); > + return filep; > +} > + > +void err_on_hypervisor(void) > +{ > + FILE *cpuinfo; > + char *flags, *hypervisor; > + char *buffer; > + > + /* On VMs /proc/cpuinfo contains a "flags" entry for hypervisor */ > + cpuinfo = fopen_or_die("/proc/cpuinfo", "ro"); > + > + buffer = malloc(4096); > + if (!buffer) { > + fclose(cpuinfo); > + err(-ENOMEM, "buffer malloc fail"); > + } > + > + if (!fread(buffer, 1024, 1, cpuinfo)) { > + fclose(cpuinfo); > + free(buffer); > + err(1, "Reading /proc/cpuinfo failed"); > + } > + > + flags = strstr(buffer, "flags"); > + rewind(cpuinfo); > + fseek(cpuinfo, flags - buffer, SEEK_SET); > + if (!fgets(buffer, 4096, cpuinfo)) { > + fclose(cpuinfo); > + free(buffer); > + err(1, "Reading /proc/cpuinfo failed"); > + } > + fclose(cpuinfo); > + > + hypervisor = strstr(buffer, "hypervisor"); > + > + free(buffer); > + > + if (hypervisor) > + err(-1, > + "not supported on this virtual machine"); > +} > + > int get_msr(int cpu, off_t offset, unsigned long long *msr) > { > ssize_t retval; > > retval = pread(get_msr_fd(cpu), msr, sizeof(*msr), offset); > > - if (retval != sizeof *msr) > + if (retval != sizeof *msr){ > + err_on_hypervisor(); > err(-1, "cpu%d: msr offset 0x%llx read failed", cpu, (unsigned long long)offset); > + } > > return 0; > } > @@ -1858,18 +1912,6 @@ static unsigned long long rdtsc(void) > return low | ((unsigned long long)high) << 32; > } > > -/* > - * Open a file, and exit on failure > - */ > -FILE *fopen_or_die(const char *path, const char *mode) > -{ > - FILE *filep = fopen(path, mode); > - > - if (!filep) > - err(1, "%s: open failed", path); > - return filep; > -} > - > /* > * snapshot_sysfs_counter() > * A gentle reminder, I haven't received any response on this. Any comments/feedback/concern? Thanks, Samasth. Oracle Linux Team.
Powered by blists - more mailing lists