lkml.org 
[lkml]   [2019]   [Aug]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 152/223] perf/x86/amd/uncore: Get correct number of cores sharing last level cache
    Date
    In Family 17h, the number of cores sharing a cache level is obtained
    from the Cache Properties CPUID leaf (0x8000001d) by passing in the
    cache level in ECX. In prior families, a cache level of 2 was used to
    determine this information.

    To get the right information, irrespective of Family, iterate over
    the cache levels using CPUID 0x8000001d. The last level cache is the
    last value to return a non-zero value in EAX.

    Signed-off-by: Janakarajan Natarajan <Janakarajan.Natarajan@amd.com>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Reviewed-by: Borislav Petkov <bp@suse.de>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/5ab569025b39cdfaeca55b571d78c0fc800bdb69.1497452002.git.Janakarajan.Natarajan@amd.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/events/amd/uncore.c | 19 ++++++++++++++++---
    1 file changed, 16 insertions(+), 3 deletions(-)

    diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c
    index 094973313037..10f023799f11 100644
    --- a/arch/x86/events/amd/uncore.c
    +++ b/arch/x86/events/amd/uncore.c
    @@ -378,11 +378,24 @@ static int amd_uncore_cpu_starting(unsigned int cpu)

    if (amd_uncore_llc) {
    unsigned int apicid = cpu_data(cpu).apicid;
    - unsigned int nshared;
    + unsigned int nshared, subleaf, prev_eax = 0;

    uncore = *per_cpu_ptr(amd_uncore_llc, cpu);
    - cpuid_count(0x8000001d, 2, &eax, &ebx, &ecx, &edx);
    - nshared = ((eax >> 14) & 0xfff) + 1;
    + /*
    + * Iterate over Cache Topology Definition leaves until no
    + * more cache descriptions are available.
    + */
    + for (subleaf = 0; subleaf < 5; subleaf++) {
    + cpuid_count(0x8000001d, subleaf, &eax, &ebx, &ecx, &edx);
    +
    + /* EAX[0:4] gives type of cache */
    + if (!(eax & 0x1f))
    + break;
    +
    + prev_eax = eax;
    + }
    + nshared = ((prev_eax >> 14) & 0xfff) + 1;
    +
    uncore->id = apicid - (apicid % nshared);

    uncore = amd_uncore_find_online_sibling(uncore, amd_uncore_llc);
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-08-02 11:51    [W:3.150 / U:0.700 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site