From: Prarit Bhargava <prarit@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: Andi Kleen <ak@linux.intel.com>,
Prarit Bhargava <prarit@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>,
Ingo Molnar <mingo@redhat.com>, "H. Peter Anvin" <hpa@zytor.com>,
x86@kernel.org, Peter Zijlstra <peterz@infradead.org>,
Dave Hansen <dave.hansen@intel.com>,
Piotr Luc <piotr.luc@intel.com>, Kan Liang <kan.liang@intel.com>,
Borislav Petkov <bp@suse.de>,
Stephane Eranian <eranian@google.com>,
Arvind Yadav <arvind.yadav.cs@gmail.com>,
Andy Lutomirski <luto@kernel.org>,
Christian Borntraeger <borntraeger@de.ibm.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
Tom Lendacky <thomas.lendacky@amd.com>,
He Chen <he.chen@linux.intel.com>,
Mathias Krause <minipli@googlemail.com>,
Tim Chen <tim.c.chen@linux.intel.com>,
Vitaly Kuznetsov <vkuznets@redhat.com>
Subject: [PATCH v6 2/3] x86/topology: Avoid wasting 128k for package id array
Date: Tue, 14 Nov 2017 07:42:56 -0500 [thread overview]
Message-ID: <20171114124257.22013-3-prarit@redhat.com> (raw)
In-Reply-To: <20171114124257.22013-1-prarit@redhat.com>
From: Andi Kleen <ak@linux.intel.com>
I was looking at large early boot allocations and noticed that
since (1f12e32f x86/topology: Create logical package id)
every 64bit system allocates a 128k array to convert logical
package ids.
This happens because the array is sized for
MAX_LOCAL_APIC and that is always 32k on 64bit systems,
and it needs 4 bytes for each entry.
This is fairly wasteful, especially for the common case
of having only one socket, where we need 128K just to store
a single 4 byte value.
Store the logical processor id in cpudata. Add a set flag that indicates
that the cpu's cpudata entry has been written.
[v2]: Decrease logical_packages when the last thread in a socket is
removed.
[v3]: Add more logic to keep logical and physical package IDs
in synch.
[v4]: Keep logical mapping static by using hybrid approach of a small
logical
to physical array and keeping logical cpu information in cpu_data.
[v5]: Change kmalloc to GFP_ATOMIC to fix "sleeping function" warning on
virtual machines. Remove phys_pkg_id. Add spinlock to avoid concurrency
issues.
[v6]: Revert back to storing logical processor ID in cpudata, and
add set flag to indicate that boot_cpu_data was written to a cpu's
cpu_data.
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Prarit Bhargava <prarit@redhat.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Cc: Piotr Luc <piotr.luc@intel.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: Stephane Eranian <eranian@google.com>
Cc: Prarit Bhargava <prarit@redhat.com>
Cc: Arvind Yadav <arvind.yadav.cs@gmail.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: He Chen <he.chen@linux.intel.com>
Cc: Mathias Krause <minipli@googlemail.com>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Cc: Vitaly Kuznetsov <vkuznets@redhat.com>
---
arch/x86/include/asm/processor.h | 1 +
arch/x86/kernel/smpboot.c | 75 ++++++++++++++++------------------------
2 files changed, 30 insertions(+), 46 deletions(-)
diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index bdac19ab2488..44fd3512442f 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -132,6 +132,7 @@ struct cpuinfo_x86 {
/* Index into per_cpu list: */
u16 cpu_index;
u32 microcode;
+ unsigned set : 1;
} __randomize_layout;
struct cpuid_regs {
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index ad59edd84de7..838d36ff7ba6 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -100,9 +100,6 @@ DEFINE_PER_CPU_READ_MOSTLY(struct cpuinfo_x86, cpu_info);
EXPORT_PER_CPU_SYMBOL(cpu_info);
/* Logical package management. We might want to allocate that dynamically */
-static int *physical_to_logical_pkg __read_mostly;
-static unsigned long *physical_package_map __read_mostly;;
-static unsigned int max_physical_pkg_id __read_mostly;
unsigned int __max_logical_packages __read_mostly;
EXPORT_SYMBOL(__max_logical_packages);
static unsigned int logical_packages __read_mostly;
@@ -278,6 +275,25 @@ static void notrace start_secondary(void *unused)
cpu_startup_entry(CPUHP_AP_ONLINE_IDLE);
}
+/**
+ * topology_phys_to_logical_pkg - Map a physical package id to a logical
+ *
+ * Returns logical package id or -1 if not found
+ */
+int topology_phys_to_logical_pkg(unsigned int phys_pkg)
+{
+ int cpu;
+
+ for_each_possible_cpu(cpu) {
+ if (cpu_data(cpu).phys_proc_id == phys_pkg &&
+ cpu_data(cpu).set) {
+ return cpu_data(cpu).logical_proc_id;
+ }
+ }
+ return -1;
+}
+EXPORT_SYMBOL(topology_phys_to_logical_pkg);
+
/**
* topology_update_package_map - Update the physical to logical package map
* @pkg: The physical package id as retrieved via CPUID
@@ -285,17 +301,11 @@ static void notrace start_secondary(void *unused)
*/
int topology_update_package_map(unsigned int pkg, unsigned int cpu)
{
- unsigned int new;
-
- /* Called from early boot ? */
- if (!physical_package_map)
- return 0;
-
- if (pkg >= max_physical_pkg_id)
- return -EINVAL;
+ int new;
- /* Set the logical package id */
- if (test_and_set_bit(pkg, physical_package_map))
+ /* Already available somewhere? */
+ new = topology_phys_to_logical_pkg(pkg);
+ if (new >= 0)
goto found;
if (logical_packages >= __max_logical_packages) {
@@ -305,34 +315,17 @@ int topology_update_package_map(unsigned int pkg, unsigned int cpu)
}
new = logical_packages++;
- if (new != pkg) {
+ if (new != pkg)
pr_info("CPU %u Converting physical %u to logical package %u\n",
cpu, pkg, new);
- }
- physical_to_logical_pkg[pkg] = new;
-
found:
- cpu_data(cpu).logical_proc_id = physical_to_logical_pkg[pkg];
+ cpu_data(cpu).logical_proc_id = new;
return 0;
}
-/**
- * topology_phys_to_logical_pkg - Map a physical package id to a logical
- *
- * Returns logical package id or -1 if not found
- */
-int topology_phys_to_logical_pkg(unsigned int phys_pkg)
-{
- if (phys_pkg >= max_physical_pkg_id)
- return -1;
- return physical_to_logical_pkg[phys_pkg];
-}
-EXPORT_SYMBOL(topology_phys_to_logical_pkg);
-
static void __init smp_init_package_map(struct cpuinfo_x86 *c, unsigned int cpu)
{
unsigned int ncpus;
- size_t size;
/*
* Today neither Intel nor AMD support heterogenous systems. That
@@ -363,19 +356,6 @@ static void __init smp_init_package_map(struct cpuinfo_x86 *c, unsigned int cpu)
}
__max_logical_packages = DIV_ROUND_UP(total_cpus, ncpus);
- logical_packages = 0;
-
- /*
- * Possibly larger than what we need as the number of apic ids per
- * package can be smaller than the actual used apic ids.
- */
- max_physical_pkg_id = DIV_ROUND_UP(MAX_LOCAL_APIC, ncpus);
- size = max_physical_pkg_id * sizeof(unsigned int);
- physical_to_logical_pkg = kmalloc(size, GFP_KERNEL);
- memset(physical_to_logical_pkg, 0xff, size);
- size = BITS_TO_LONGS(max_physical_pkg_id) * sizeof(unsigned long);
- physical_package_map = kzalloc(size, GFP_KERNEL);
-
pr_info("Max logical packages: %u\n", __max_logical_packages);
topology_update_package_map(c->phys_proc_id, cpu);
@@ -389,6 +369,7 @@ void __init smp_store_boot_cpu_info(void)
*c = boot_cpu_data;
c->cpu_index = id;
smp_init_package_map(c, id);
+ cpu_data(id).set = 1;
}
/*
@@ -399,13 +380,15 @@ void smp_store_cpu_info(int id)
{
struct cpuinfo_x86 *c = &cpu_data(id);
- *c = boot_cpu_data;
+ if (cpu_data(id).set == 0)
+ *c = boot_cpu_data;
c->cpu_index = id;
/*
* During boot time, CPU0 has this setup already. Save the info when
* bringing up AP or offlined CPU0.
*/
identify_secondary_cpu(c);
+ cpu_data(id).set = 1;
}
static bool
--
2.15.0.rc0.39.g2f0e14e64
next prev parent reply other threads:[~2017-11-14 12:43 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-14 12:42 [PATCH v6 0/3] Fix panic in logical packages calculation Prarit Bhargava
2017-11-14 12:42 ` [PATCH v6 1/3] perf/x86/intel/uncore: Cache logical pkg id in uncore driver Prarit Bhargava
2017-11-17 15:27 ` [tip:x86/urgent] " tip-bot for Andi Kleen
2017-11-14 12:42 ` Prarit Bhargava [this message]
2017-11-17 14:59 ` [PATCH v6 2/3] x86/topology: Avoid wasting 128k for package id array Thomas Gleixner
2017-11-17 15:27 ` [tip:x86/urgent] " tip-bot for Andi Kleen
2017-11-14 12:42 ` [PATCH v6 3/3] x86/smpboot: Fix __max_logical_packages estimate Prarit Bhargava
2017-11-17 15:27 ` [tip:x86/urgent] " tip-bot for Prarit Bhargava
2018-02-07 18:44 ` [v6,3/3] " Simon Gaiser
2018-02-07 19:04 ` Prarit Bhargava
2018-02-07 19:26 ` [v6, 3/3] " Simon Gaiser
2018-02-07 19:26 ` [v6,3/3] " Simon Gaiser
2018-02-07 19:31 ` [v6, 3/3] " Prarit Bhargava
2018-02-07 19:31 ` [v6,3/3] " Prarit Bhargava
2018-02-07 19:04 ` [v6, 3/3] " Prarit Bhargava
2018-02-07 18:44 ` Simon Gaiser
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=20171114124257.22013-3-prarit@redhat.com \
--to=prarit@redhat.com \
--cc=ak@linux.intel.com \
--cc=arvind.yadav.cs@gmail.com \
--cc=borntraeger@de.ibm.com \
--cc=bp@suse.de \
--cc=dave.hansen@intel.com \
--cc=eranian@google.com \
--cc=he.chen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=kan.liang@intel.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luto@kernel.org \
--cc=mingo@redhat.com \
--cc=minipli@googlemail.com \
--cc=peterz@infradead.org \
--cc=piotr.luc@intel.com \
--cc=tglx@linutronix.de \
--cc=thomas.lendacky@amd.com \
--cc=tim.c.chen@linux.intel.com \
--cc=vkuznets@redhat.com \
--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.