lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 081/108] x86: Set cpu_llc_id on AMD CPUs
    2.6.30-stable review patch.  If anyone has any objections, please let us know.

    ------------------

    From: Andreas Herrmann <andreas.herrmann3@amd.com>

    commit 99bd0c0fc4b04da54cb311953ef9489931c19c63 upstream.

    This counts when building sched domains in case NUMA information
    is not available.

    ( See cpu_coregroup_mask() which uses llc_shared_map which in turn is
    created based on cpu_llc_id. )

    Currently Linux builds domains as follows:
    (example from a dual socket quad-core system)

    CPU0 attaching sched-domain:
    domain 0: span 0-7 level CPU
    groups: 0 1 2 3 4 5 6 7

    ...

    CPU7 attaching sched-domain:
    domain 0: span 0-7 level CPU
    groups: 7 0 1 2 3 4 5 6

    Ever since that is borked for multi-core AMD CPU systems.
    This patch fixes that and now we get a proper:

    CPU0 attaching sched-domain:
    domain 0: span 0-3 level MC
    groups: 0 1 2 3
    domain 1: span 0-7 level CPU
    groups: 0-3 4-7

    ...

    CPU7 attaching sched-domain:
    domain 0: span 4-7 level MC
    groups: 7 4 5 6
    domain 1: span 0-7 level CPU
    groups: 4-7 0-3

    This allows scheduler to assign tasks to cores on different sockets
    (i.e. that don't share last level cache) for performance reasons.

    Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
    LKML-Reference: <20090619085909.GJ5218@alberich.amd.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/kernel/cpu/amd.c | 4 +++-
    1 file changed, 3 insertions(+), 1 deletion(-)

    --- a/arch/x86/kernel/cpu/amd.c
    +++ b/arch/x86/kernel/cpu/amd.c
    @@ -258,13 +258,15 @@ static void __cpuinit amd_detect_cmp(str
    {
    #ifdef CONFIG_X86_HT
    unsigned bits;
    + int cpu = smp_processor_id();

    bits = c->x86_coreid_bits;
    -
    /* Low order bits define the core id (index of core in socket) */
    c->cpu_core_id = c->initial_apicid & ((1 << bits)-1);
    /* Convert the initial APIC ID into the socket ID */
    c->phys_proc_id = c->initial_apicid >> bits;
    + /* use socket ID also for last level cache */
    + per_cpu(cpu_llc_id, cpu) = c->phys_proc_id;
    #endif
    }




    \
     
     \ /
      Last update: 2009-07-01 03:25    [W:2.387 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site