[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20161028195624.ukqzu5vngfhnk5dj@pd.tnic>
Date: Fri, 28 Oct 2016 21:56:24 +0200
From: Borislav Petkov <bp@...e.de>
To: Yazen Ghannam <Yazen.Ghannam@....com>
Cc: linux-kernel@...r.kernel.org, x86@...nel.org
Subject: Re: [PATCH v2 2/2] x86/AMD: Group cpu_llc_id assignment by topology
feature and family
On Fri, Oct 28, 2016 at 10:51:58AM -0500, Yazen Ghannam wrote:
> Currently, we assume that a system has multiple last level caches only if
> there are multiple nodes, and that the cpu_llc_id is equal to the node_id.
> This no longer applies since Fam17h can have multiple last level caches
> within a node.
>
> So group the cpu_llc_id assignment by topology feature and family.
That's a very nice intro, good.
> The NODEID_MSR feature only applies to Fam10h in which case the llc is at
s/llc/LLC (Last Level Cache/
Let's try to have abbreviations written out in their first mention in the text.
> the node level.
>
> The TOPOEXT feature is used on families 15h, 16h and 17h. So far we only
> see multiple last level caches if L3 caches are available. Otherwise, the
> cpu_llc_id will default to be the phys_proc_id. We have L3 caches only on
> families 15h and 17h. On Fam15h, the llc is at the node level. On Fam17h,
s/llc/LLC/g
> the llc is at the core complex level and can be found by right shifting the
^^^
LLC
> apicid. Also, keep the family checks explicit so that new families will
> fall back to the default.
>
> Single node systems in families 10h and 15h will have a Node ID of 0 which
> will be the same as the phys_proc_id, so we don't need to check for
> multiple nodes before using the node_id.
>
> Signed-off-by: Yazen Ghannam <Yazen.Ghannam@....com>
> ---
> arch/x86/kernel/cpu/amd.c | 32 ++++++++++++++++++++------------
> 1 file changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
> index c3fc337..be70345 100644
> --- a/arch/x86/kernel/cpu/amd.c
> +++ b/arch/x86/kernel/cpu/amd.c
> @@ -314,11 +314,31 @@ static void amd_get_topology(struct cpuinfo_x86 *c)
> smp_num_siblings = ((ebx >> 8) & 3) + 1;
> c->x86_max_cores /= smp_num_siblings;
> c->cpu_core_id = ebx & 0xff;
> +
> + /*
> + * We may have multiple LLCs if L3 caches exist, so check if we
> + * have an L3 cache by looking at the L3 cache cpuid leaf.
x86 instructions in caps please: CPUID
> + */
> + if (cpuid_edx(0x80000006)) {
> + if (c->x86 == 0x15) {
> + /* LLC is at the node level. */
> + per_cpu(cpu_llc_id, cpu) = node_id;
> +
> + } else if (c->x86 == 0x17) {
How about >= ?
> + /*
> + * LLC is at the core complex level.
> + * Core complex id is ApicId[3].
> + */
> + per_cpu(cpu_llc_id, cpu) = c->apicid >> 3;
> + }
> + }
> } else if (cpu_has(c, X86_FEATURE_NODEID_MSR)) {
> u64 value;
>
> rdmsrl(MSR_FAM10H_NODE_ID, value);
> node_id = value & 7;
> +
> + per_cpu(cpu_llc_id, cpu) = node_id;
> } else
> return;
Btw, please add for your next submission:
Tested-by: Borislav Petkov <bp@...e.de>
Thanks.
--
Regards/Gruss,
Boris.
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)
--
Powered by blists - more mailing lists