Yinghai Lu <yinghai@xxxxxxxxxx> writes: > On Mon, Mar 29, 2010 at 4:20 PM, Eric W. Biederman > <ebiederm@xxxxxxxxxxxx> wrote: >> From: Eric W. Biederman <ebiederm@xxxxxxxxxxxx> >> >> Use the global gsi_end value now that all ioapics have >> valid gsi numbers instead of a combination of acpi_probe_gsi >> and walking all of the ioapics and couting their number of >> entries by hand if acpi_probe_gsi gave us an answer we did >> not like. >> >> This fixes a small bug in probe_nr_irqs_gsi. Previously >> acpi_probe_gsi unnecessarily added 1 to the maximum >> gsi_end value. gsi_end is already one past the end of >> the number of gsi's so the additional increment was >> superfluous. >> >> Signed-off-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxx> >> --- >> arch/x86/include/asm/mpspec.h | 6 ------ >> arch/x86/kernel/acpi/boot.c | 23 ----------------------- >> arch/x86/kernel/apic/io_apic.c | 17 +++-------------- >> 3 files changed, 3 insertions(+), 43 deletions(-) >> >> diff --git a/arch/x86/include/asm/mpspec.h b/arch/x86/include/asm/mpspec.h >> index 29994f0..c82868e 100644 >> --- a/arch/x86/include/asm/mpspec.h >> +++ b/arch/x86/include/asm/mpspec.h >> @@ -105,12 +105,6 @@ extern void mp_config_acpi_legacy_irqs(void); >> struct device; >> extern int mp_register_gsi(struct device *dev, u32 gsi, int edge_level, >> int active_high_low); >> -extern int acpi_probe_gsi(void); >> -#else /* !CONFIG_ACPI: */ >> -static inline int acpi_probe_gsi(void) >> -{ >> - return 0; >> -} >> #endif /* CONFIG_ACPI */ >> >> #define PHYSID_ARRAY_SIZE BITS_TO_LONGS(MAX_APICS) >> diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c >> index 9c48e99..0e514a1 100644 >> --- a/arch/x86/kernel/acpi/boot.c >> +++ b/arch/x86/kernel/acpi/boot.c >> @@ -875,29 +875,6 @@ static int __init acpi_parse_madt_lapic_entries(void) >> extern int es7000_plat; >> #endif >> >> -int __init acpi_probe_gsi(void) >> -{ >> - int idx; >> - int gsi; >> - int max_gsi = 0; >> - >> - if (acpi_disabled) >> - return 0; >> - >> - if (!acpi_ioapic) >> - return 0; >> - >> - max_gsi = 0; >> - for (idx = 0; idx < nr_ioapics; idx++) { >> - gsi = mp_gsi_routing[idx].gsi_end; >> - >> - if (gsi > max_gsi) >> - max_gsi = gsi; >> - } >> - >> - return max_gsi + 1; >> -} >> - >> static void assign_to_mp_irq(struct mpc_intsrc *m, >> struct mpc_intsrc *mp_irq) >> { >> diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c >> index 996cf8f..b57b7a3 100644 >> --- a/arch/x86/kernel/apic/io_apic.c >> +++ b/arch/x86/kernel/apic/io_apic.c >> @@ -3837,22 +3837,11 @@ int __init io_apic_get_redir_entries (int ioapic) >> >> void __init probe_nr_irqs_gsi(void) >> { >> - int nr = 0; >> + int nr; >> >> - nr = acpi_probe_gsi(); >> - if (nr > nr_irqs_gsi) { >> + nr = gsi_end; > > you may need +1 here As documented in my comment that extra +1 has every appearance of a bug. Nothing is at gsi_end. gsi_end is already at 1 past the last in use gsi. Therefore an extra +1 puts us two past the end for no apparent reason. Eric -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html