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
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20180417082814.GB18808@pd.tnic>
Date:   Tue, 17 Apr 2018 10:28:15 +0200
From:   Borislav Petkov <bp@...e.de>
To:     Suravee Suthikulpanit <suravee.suthikulpanit@....com>
Cc:     linux-kernel@...r.kernel.org, x86@...nel.org, tglx@...utronix.de,
        mingo@...hat.com, hpa@...or.com
Subject: Re: [PATCH 4/4] x86/CPU/AMD: Calculate LLC ID from number of sharing
 threads

On Mon, Mar 26, 2018 at 01:35:16AM -0500, Suravee Suthikulpanit wrote:
> diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c
> index 54d04d5..67f4790 100644
> --- a/arch/x86/kernel/cpu/cacheinfo.c
> +++ b/arch/x86/kernel/cpu/cacheinfo.c
> @@ -637,6 +637,43 @@ static int find_num_cache_leaves(struct cpuinfo_x86 *c)
>  	return i;
>  }
>  
> +void cacheinfo_amd_init_llc_id(struct cpuinfo_x86 *c, int cpu, u8 node_id)
> +{
> +	/*
> +	 * 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.
> +	 */
> +	if (!cpuid_edx(0x80000006))
> +		return;
> +
> +	if (c->x86 < 0x17) {
> +		/* LLC is at the node level. */
> +		per_cpu(cpu_llc_id, cpu) = node_id;
> +	} else if (c->x86 == 0x17 &&
> +		   c->x86_model >= 0 && c->x86_model <= 0x1F) {
> +		/*
> +		 * LLC is at the core complex level.
> +		 * Core complex id is ApicId[3] for these processors.
> +		 */
> +		per_cpu(cpu_llc_id, cpu) = c->apicid >> 3;
> +	} else {
> +		/* LLC ID is calculated from the number of thread sharing. */
> +		u32 eax, ebx, ecx, edx, num_sharing_cache = 0;
> +		u32 llc_index = find_num_cache_leaves(c) - 1;
> +
> +		cpuid_count(0x8000001d, llc_index, &eax, &ebx, &ecx, &edx);
> +		if (eax)
> +			num_sharing_cache = ((eax >> 14) & 0xfff) + 1;
> +
> +		if (num_sharing_cache) {
> +			int bits = get_count_order(num_sharing_cache) - 1;
> +
> +			per_cpu(cpu_llc_id, cpu) = c->apicid >> bits;
> +		}
> +	}
> +}
> +EXPORT_SYMBOL_GPL(cacheinfo_amd_init_llc_id);

That function needs to be exported to modules because...?

-- 
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

Powered by Openwall GNU/*/Linux Powered by OpenVZ