Linux 64bit only uses the IO-APIC ID as an internal cookie. In the future
there could be some cases where the IO-APIC IDs are not unique because
they share an 8 bit space with CPUs and if there are enough CPUs
it is difficult to get them that. But Linux needs the io apic ID
internally for its data structures. Assign unique IO APIC ids on
table parsing.
TBD do for 32bit too
Signed-off-by: Andi Kleen <ak@suse.de>
---
arch/x86_64/kernel/mpparse.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
Index: linux/arch/x86_64/kernel/mpparse.c
===================================================================
--- linux.orig/arch/x86_64/kernel/mpparse.c
+++ linux/arch/x86_64/kernel/mpparse.c
@@ -649,6 +649,20 @@ static int mp_find_ioapic(int gsi)
return -1;
}
+static u8 uniq_ioapic_id(u8 id)
+{
+ int i;
+ DECLARE_BITMAP(used, 256);
+ bitmap_zero(used, 256);
+ for (i = 0; i < nr_ioapics; i++) {
+ struct mpc_config_ioapic *ia = &mp_ioapics[i];
+ __set_bit(ia->mpc_apicid, used);
+ }
+ if (!test_bit(id, used))
+ return id;
+ return find_first_zero_bit(used, 256);
+}
+
void __init mp_register_ioapic(u8 id, u32 address, u32 gsi_base)
{
int idx = 0;
@@ -656,14 +670,14 @@ void __init mp_register_ioapic(u8 id, u3
if (bad_ioapic(address))
return;
- idx = nr_ioapics++;
+ idx = nr_ioapics;
mp_ioapics[idx].mpc_type = MP_IOAPIC;
mp_ioapics[idx].mpc_flags = MPC_APIC_USABLE;
mp_ioapics[idx].mpc_apicaddr = address;
set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
- mp_ioapics[idx].mpc_apicid = id;
+ mp_ioapics[idx].mpc_apicid = uniq_ioapic_id(id);
mp_ioapics[idx].mpc_apicver = 0;
/*
@@ -680,6 +694,8 @@ void __init mp_register_ioapic(u8 id, u3
mp_ioapics[idx].mpc_apicaddr,
mp_ioapic_routing[idx].gsi_start,
mp_ioapic_routing[idx].gsi_end);
+
+ nr_ioapics++;
}
void __init
-
| Greg Kroah-Hartman | [PATCH 007/196] Chinese: add translation of stable_kernel_rules.txt |
| David Miller | Re: [PATCH] Stop pmac_zilog from abusing 8250's device numbers. |
| Mitch Bradley | Re: [PATCH 1/2] OLPC: Add support for calling into Open Firmware |
| Anders | PROBLEM: high load average when idle |
git: | |
| Elijah Newren | Trying to use git-filter-branch to compress history by removing large, obsolete bi... |
| Linus Torvalds | irc usage.. |
| Luke Lu | git-svn questions: how to clone/init non-standard layout branches/tags? |
| Alex Riesen | Re: git-fast-import |
| GVG GVG | ssh_exchange_identification: Connection closed by remote host |
| Todd Pytel | IDE or SCSI virtual disks for VMWare image? |
| Chris Tankersley | Dell PERC 3/Di - No Disks Found |
| Sam Fourman Jr. | Asus Striker Extreme does not support 4GB memory |
| Theodore Ts'o | Re: Splitting comp.os.linux |
| David Gabrius | Re: NT vs Linux (was: Re: truth or dare) |
| Doug Evans | Re: Stabilizing Linux |
| Theodore Ts'o | Re: demand paging: proposal |
| magical mounts | 12 hours ago | Linux kernel |
| Problem in scim in Fedora 9 | 13 hours ago | Linux general |
| The new Western Digital power saving drives | 13 hours ago | Hardware |
| Battery Maximizer Software | 1 day ago | Linux kernel |
| windows folder creation surprise | 1 day ago | Windows |
| Firewall | 2 days ago | OpenBSD |
| IP layer send packet | 2 days ago | Linux kernel |
| dtrace for linux available | 3 days ago | Linux kernel |
| Unable to mount ramdisk image using UBoot while upgrading to 2.6.15 kernel for a MPC8540 based target | 3 days ago | Linux kernel |
| RealTek RTL8169 - can't connect | 3 days ago | NetBSD |
