]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
cpupower: Fix coredump on VMWare
authorPrarit Bhargava <prarit@redhat.com>
Mon, 8 Oct 2018 15:06:19 +0000 (11:06 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 13 Nov 2018 19:14:53 +0000 (11:14 -0800)
[ Upstream commit f69ffc5d3db8f1f03fd6d1df5930f9a1fbd787b6 ]

cpupower crashes on VMWare guests.  The guests have the AMD PStateDef MSR
(0xC0010064 + state number) set to zero.  As a result fid and did are zero
and the crash occurs because of a divide by zero (cof = fid/did).  This
can be prevented by checking the enable bit in the PStateDef MSR before
calculating cof.  By doing this the value of pstate[i] remains zero and
the value can be tested before displaying the active Pstates.

Check the enable bit in the PstateDef register for all supported families
and only print out enabled Pstates.

Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: Shuah Khan <shuah@kernel.org>
Cc: Stafford Horne <shorne@gmail.com>
Signed-off-by: Shuah Khan (Samsung OSG) <shuah@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
tools/power/cpupower/utils/cpufreq-info.c
tools/power/cpupower/utils/helpers/amd.c

index 3e701f0e9c1438f781b6dd0248212d250da800a5..5853faa9daf3d03e76a76b2410ef36209e783c72 100644 (file)
@@ -202,6 +202,8 @@ static int get_boost_mode(unsigned int cpu)
                printf(_("    Boost States: %d\n"), b_states);
                printf(_("    Total States: %d\n"), pstate_no);
                for (i = 0; i < pstate_no; i++) {
+                       if (!pstates[i])
+                               continue;
                        if (i < b_states)
                                printf(_("    Pstate-Pb%d: %luMHz (boost state)"
                                         "\n"), i, pstates[i]);
index bb41cdd0df6bfe527cb956c531250cf5866d5ea9..58d23997424d90b539ab306cce9bde408010f641 100644 (file)
@@ -119,6 +119,11 @@ int decode_pstates(unsigned int cpu, unsigned int cpu_family,
                }
                if (read_msr(cpu, MSR_AMD_PSTATE + i, &pstate.val))
                        return -1;
+               if ((cpu_family == 0x17) && (!pstate.fam17h_bits.en))
+                       continue;
+               else if (!pstate.bits.en)
+                       continue;
+
                pstates[i] = get_cof(cpu_family, pstate);
        }
        *no = i;