All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhang Rui <rui.zhang@intel.com>
To: linux-kernel@vger.kernel.org, x86@kernel.org,
	linux-hwmon@vger.kernel.org
Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de,
	dave.hansen@linux.intel.com, hpa@zytor.com, corbet@lwn.net,
	fenghua.yu@intel.com, jdelvare@suse.com, linux@roeck-us.net,
	len.brown@intel.com, rui.zhang@intel.com
Subject: [PATCH 1/7] x86/topology: Fix multiple packages shown on a single-package system
Date: Sat, 13 Aug 2022 00:41:38 +0800	[thread overview]
Message-ID: <20220812164144.30829-2-rui.zhang@intel.com> (raw)
In-Reply-To: <20220812164144.30829-1-rui.zhang@intel.com>

CPUID.1F/B does not emumerate Package level explicitly, instead, all the
APICID bits above the enumerated levels are assumed to be package id bits.

Current code gets package id by shifting out all the APICID bits that
Linux supports, rather than shifting out all the APICID bits that CPUID.1F
enumerates. This introduces problems when CPUID.1F enumerates a level that
Linux does not support.

For example, on an AlderLake-N platform, there are 2 Ecore Modules, which
has 4 atom cores in each module, in a single package.
Linux does not support Module level and interprets the Module id bits as
package id and erroneously reports a multi module system as a multi-package
system.

Fix this by using APICID bits above all the CPUID.1F enumerated levels as
package id.

Suggested-and-reviewed-by: Len Brown <len.brown@intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
---
 arch/x86/kernel/cpu/topology.c | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/cpu/topology.c b/arch/x86/kernel/cpu/topology.c
index 132a2de44d2f..f7592814e5d5 100644
--- a/arch/x86/kernel/cpu/topology.c
+++ b/arch/x86/kernel/cpu/topology.c
@@ -96,6 +96,7 @@ int detect_extended_topology(struct cpuinfo_x86 *c)
 	unsigned int ht_mask_width, core_plus_mask_width, die_plus_mask_width;
 	unsigned int core_select_mask, core_level_siblings;
 	unsigned int die_select_mask, die_level_siblings;
+	unsigned int pkg_mask_width;
 	bool die_level_present = false;
 	int leaf;
 
@@ -111,10 +112,10 @@ int detect_extended_topology(struct cpuinfo_x86 *c)
 	core_level_siblings = smp_num_siblings = LEVEL_MAX_SIBLINGS(ebx);
 	core_plus_mask_width = ht_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
 	die_level_siblings = LEVEL_MAX_SIBLINGS(ebx);
-	die_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
+	pkg_mask_width = die_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
 
 	sub_index = 1;
-	do {
+	while (true) {
 		cpuid_count(leaf, sub_index, &eax, &ebx, &ecx, &edx);
 
 		/*
@@ -132,8 +133,13 @@ int detect_extended_topology(struct cpuinfo_x86 *c)
 			die_plus_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
 		}
 
+		if (LEAFB_SUBTYPE(ecx) != INVALID_TYPE)
+			pkg_mask_width = BITS_SHIFT_NEXT_LEVEL(eax);
+		else
+			break;
+
 		sub_index++;
-	} while (LEAFB_SUBTYPE(ecx) != INVALID_TYPE);
+	}
 
 	core_select_mask = (~(-1 << core_plus_mask_width)) >> ht_mask_width;
 	die_select_mask = (~(-1 << die_plus_mask_width)) >>
@@ -148,7 +154,7 @@ int detect_extended_topology(struct cpuinfo_x86 *c)
 	}
 
 	c->phys_proc_id = apic->phys_pkg_id(c->initial_apicid,
-				die_plus_mask_width);
+				pkg_mask_width);
 	/*
 	 * Reinit the apicid, now that we have extended initial_apicid.
 	 */
-- 
2.34.1


  reply	other threads:[~2022-08-12 16:38 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-12 16:41 [PATCH 0/7] x86/topology: Improve CPUID.1F handling Zhang Rui
2022-08-12 16:41 ` Zhang Rui [this message]
2022-08-12 16:41 ` [PATCH 2/7] x86/topology: Fix duplicated core_id within a package Zhang Rui
2022-08-12 16:41 ` [PATCH 3/7] hwmon/coretemp: Handle large core id value Zhang Rui
2022-08-12 17:16   ` Guenter Roeck
2022-08-13 17:24     ` Zhang Rui
2022-08-13 10:48   ` Ingo Molnar
2022-08-13 17:07     ` Zhang Rui
2022-08-14  9:12       ` Ingo Molnar
2022-08-12 16:41 ` [PATCH 4/7] x86/topology: Fix max_siblings calculation Zhang Rui
2022-08-12 16:41 ` [PATCH 5/7] Documentation: x86: Update smp_num_siblings/x86_max_cores description Zhang Rui
2022-08-12 16:41 ` [PATCH 6/7] Documentation: x86: Remove obsolete x86_max_dies description Zhang Rui
2022-08-12 16:41 ` [PATCH 7/7] perf/x86/intel/P4: Fix smp_num_siblings usage Zhang Rui
2022-08-13 10:50   ` Ingo Molnar
2022-08-13 17:29     ` Zhang Rui
2022-08-15  9:11   ` Peter Zijlstra
2022-08-16  2:26     ` Zhang Rui
2022-08-16  8:26       ` Peter Zijlstra
2022-08-13 10:44 ` [PATCH 0/7] x86/topology: Improve CPUID.1F handling Ingo Molnar
2022-08-13 17:10   ` Zhang Rui

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220812164144.30829-2-rui.zhang@intel.com \
    --to=rui.zhang@intel.com \
    --cc=bp@alien8.de \
    --cc=corbet@lwn.net \
    --cc=dave.hansen@linux.intel.com \
    --cc=fenghua.yu@intel.com \
    --cc=hpa@zytor.com \
    --cc=jdelvare@suse.com \
    --cc=len.brown@intel.com \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=mingo@redhat.com \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.