From: Alex Chiang <achiang@hp.com>
To: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org
Cc: linux-acpi@vger.kernel.org, Alex Chiang <achiang@hp.com>,
Tony Luck <tony.luck@intel.com>
Subject: [PATCH 12/14] [IA64] Populate and use cpu_enabled_map
Date: Mon, 14 Jul 2008 20:34:45 -0600 [thread overview]
Message-ID: <20080715023445.2528.16785.stgit@blender.achiang> (raw)
In-Reply-To: <20080715023344.2528.1836.stgit@blender.achiang>
Modify MADT local SAPIC parsing such that:
- all present CPUs added to cpu_present_map
- all enabled CPUs added to cpu_enabled_map
This change allows us to check during __cpu_up() if we should
actually bring up the CPU. That is, if a CPU is present, but not
enabled by firmware, we should not bring it up.
Contrariwise, by creating a sysfs interface for a disabled CPU,
we provide a hook that allows a user to interact with the CPU.
The most visible user interface change with this patch is that more
sysfs entries will appear in /sys/devices/system/cpu/cpuN/ on
multi-threaded systems with threads turned off.
The actual directories will be empty. A later patch in this series
will provide an example of using this new hook to provide a user
interface for disabled CPUs.
Signed-off-by: Alex Chiang <achiang@hp.com>
Cc: Tony Luck <tony.luck@intel.com>
---
arch/ia64/kernel/acpi.c | 16 +++++++++-------
arch/ia64/kernel/smpboot.c | 7 +++++++
include/asm-ia64/smp.h | 1 +
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 43687cc..1b4b338 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -212,13 +212,14 @@ acpi_parse_lsapic(struct acpi_subtable_header * header, const unsigned long end)
/*Skip BAD_MADT_ENTRY check, as lsapic size could vary */
- if (lsapic->lapic_flags & ACPI_MADT_ENABLED) {
#ifdef CONFIG_SMP
- smp_boot_data.cpu_phys_id[available_cpus] =
- (lsapic->id << 8) | lsapic->eid;
+ smp_boot_data.cpu_phys_id[available_cpus] =
+ (lsapic->id << 8) | lsapic->eid;
+
+ smp_boot_data.cpu_enabled[available_cpus] =
+ lsapic->lapic_flags & ACPI_MADT_ENABLED;
#endif
- ++available_cpus;
- }
+ ++available_cpus;
total_cpus++;
return 0;
@@ -872,8 +873,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
lsapic = (struct acpi_madt_local_sapic *)obj->buffer.pointer;
- if ((lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) ||
- (!(lsapic->lapic_flags & ACPI_MADT_ENABLED))) {
+ if (lsapic->header.type != ACPI_MADT_TYPE_LOCAL_SAPIC) {
kfree(buffer.pointer);
return -EINVAL;
}
@@ -892,6 +892,8 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
acpi_map_cpu2node(handle, cpu, physid);
cpu_set(cpu, cpu_present_map);
+ if (lsapic->lapic_flags & ACPI_MADT_ENABLED)
+ cpu_set(cpu, cpu_enabled_map);
ia64_cpu_to_sapicid[cpu] = physid;
*pcpu = cpu;
diff --git a/arch/ia64/kernel/smpboot.c b/arch/ia64/kernel/smpboot.c
index d7ad42b..caa1a44 100644
--- a/arch/ia64/kernel/smpboot.c
+++ b/arch/ia64/kernel/smpboot.c
@@ -582,14 +582,18 @@ smp_build_cpu_map (void)
ia64_cpu_to_sapicid[0] = boot_cpu_id;
cpus_clear(cpu_present_map);
+ cpus_clear(cpu_enabled_map);
cpu_set(0, cpu_present_map);
cpu_set(0, cpu_possible_map);
+ cpu_set(0, cpu_enabled_map);
for (cpu = 1, i = 0; i < smp_boot_data.cpu_count; i++) {
sapicid = smp_boot_data.cpu_phys_id[i];
if (sapicid == boot_cpu_id)
continue;
cpu_set(cpu, cpu_present_map);
cpu_set(cpu, cpu_possible_map);
+ if (smp_boot_data.cpu_enabled[cpu])
+ cpu_set(cpu, cpu_enabled_map);
ia64_cpu_to_sapicid[cpu] = sapicid;
cpu++;
}
@@ -820,6 +824,9 @@ __cpu_up (unsigned int cpu)
if (cpu_isset(cpu, cpu_callin_map))
return -EINVAL;
+ if (!cpu_isset(cpu, cpu_enabled_map))
+ return -EINVAL;
+
per_cpu(cpu_state, cpu) = CPU_UP_PREPARE;
/* Processor goes to start_secondary(), sets online flag */
ret = do_boot_cpu(sapicid, cpu);
diff --git a/include/asm-ia64/smp.h b/include/asm-ia64/smp.h
index ec5f355..e5f60e8 100644
--- a/include/asm-ia64/smp.h
+++ b/include/asm-ia64/smp.h
@@ -55,6 +55,7 @@ extern int smp_call_function_mask(cpumask_t mask, void (*func)(void *),
extern struct smp_boot_data {
int cpu_count;
int cpu_phys_id[NR_CPUS];
+ int cpu_enabled[NR_CPUS];
} smp_boot_data __initdata;
extern char no_int_routing __devinitdata;
next prev parent reply other threads:[~2008-07-15 2:34 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-15 2:33 [PATCH 00/14] Introduce cpu_enabled_map and friends Alex Chiang
2008-07-15 2:33 ` [PATCH 01/14] " Alex Chiang
2008-07-15 3:15 ` Matthew Wilcox
2008-07-15 10:03 ` Andi Kleen
2008-07-15 10:21 ` Russell King
2008-07-15 17:57 ` Alex Chiang
2008-07-15 18:16 ` Matthew Wilcox
2008-07-15 18:48 ` Russell King
2008-07-15 19:15 ` Alex Chiang
2008-07-18 21:44 ` Russell King
2008-07-18 23:08 ` Alex Chiang
2008-07-16 1:11 ` Alex Chiang
2008-07-16 1:11 ` Alex Chiang
2008-07-15 2:33 ` [PATCH 02/14] [M32R] Populate cpu_enabled_map Alex Chiang
2008-07-15 2:33 ` [PATCH 03/14] [ALPHA] " Alex Chiang
2008-07-15 2:34 ` [PATCH 04/14] [ARM] " Alex Chiang
2008-07-15 2:34 ` [PATCH 05/14] [MIPS] " Alex Chiang
2008-07-15 2:34 ` [PATCH 06/14] [PARISC] " Alex Chiang
2008-07-15 2:34 ` [PATCH 07/14] [POWERPC] " Alex Chiang
2008-07-15 5:51 ` Benjamin Herrenschmidt
2008-07-16 1:04 ` Alex Chiang
2008-07-15 2:34 ` [PATCH 08/14] [S390] " Alex Chiang
2008-07-15 2:34 ` [PATCH 09/14] [SH] " Alex Chiang
2008-07-15 2:34 ` Alex Chiang [this message]
2008-07-15 2:34 ` [PATCH 13/14] [IA64] Avoid overflowing ia64_cpu_to_sapicid in acpi_map_lsapic() Alex Chiang
2008-07-15 2:34 ` [PATCH 14/14] ACPI: Provide /sys/devices/system/cpu/cpuN/deconfigure Alex Chiang
2008-07-15 17:06 ` Andi Kleen
2008-07-15 18:40 ` Alex Chiang
2008-07-15 2:56 ` [PATCH 11/14] x86: Populate cpu_enabled_map Alex Chiang
2008-07-18 20:00 ` H. Peter Anvin
2008-07-18 20:00 ` H. Peter Anvin
2008-07-18 23:06 ` Alex Chiang
2008-07-15 20:10 ` [PATCH 00/14] Introduce cpu_enabled_map and friends Luck, Tony
2008-07-15 20:10 ` Luck, Tony
2008-07-15 23:54 ` Alex Chiang
2008-07-15 23:54 ` Alex Chiang
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=20080715023445.2528.16785.stgit@blender.achiang \
--to=achiang@hp.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tony.luck@intel.com \
/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.