On 2014/9/11 4:06, Thomas Gleixner wrote: > On Wed, 10 Sep 2014, Jiang Liu wrote: >>>> int mp_register_ioapic(int id, u32 address, u32 gsi_base, >>>> @@ -3867,8 +3873,15 @@ int mp_register_ioapic(int id, u32 address, u32 gsi_base, >>>> } >>>> for_each_ioapic(ioapic) >>>> if (ioapics[ioapic].mp_config.apicaddr == address) { >>>> - pr_warn("address 0x%x conflicts with IOAPIC%d\n", >>>> - address, ioapic); >>>> + /* >>>> + * IOAPIC unit may also be visible in PCI scope. >>>> + * When ioapic PCI driver's probe() is called, >>>> + * the IOAPIC unit may have already been initialized >>>> + * at boot time. >>>> + */ >>>> + if (!ioapic_initialized) >>>> + pr_warn("address 0x%x conflicts with IOAPIC%d\n", >>>> + address, ioapic); >>> >>> Hmm. This smells fishy. Why do we allow multiple initializations of >>> the same IOAPIC in the first place. Either it's done via ACPI or via >>> PCI, but not both. >> The ACPI subsystem will register and initialize all IOAPICs when walking >> ACPI MADT table during boot, before initializing PCI subsystem. >> Later when binding ioapic PCI driver to IOAPIC PCI device, it will try >> to register the IOAPIC device again. >> >> After this patchset is applied, we could remove the !ioapic_initialized >> check. We check acpi_ioapic_register() before calling >> acpi_register_ioapic(). So the check becomes redundant. >> Or we could remove the temporary code from this patch. > > How about removing the disfunctional ioapic PCI driver first and then > implementing the whole thing cleanly? Good suggestion:) > >>> >>>> return -EEXIST; >>>> } >>>> >>>> @@ -3918,6 +3931,14 @@ int mp_register_ioapic(int id, u32 address, u32 gsi_base, >>>> ioapics[idx].irqdomain = NULL; >>>> ioapics[idx].irqdomain_cfg = *cfg; >>>> >>>> + if (ioapic_initialized) { >>> >>> I have a hard time to understand this conditional. Why can't we do >>> that unconditionally? >> How about following comments? >> /* >> * If mp_register_ioapic() is called during early boot stage when >> * walking ACPI/SFI/DT tables, it's too early to create irqdomain, >> * we are still using bootmem allocator. So delay it to setup_IO_APIC(). >> */ > > Fine, but then the "if (ioapic_initialized)" conditional still does > not make sense. We surely have some global non ioapic specific > indicator that bootmem is done and the proper memory allocator is > available, right? Flag ioapic_initialized will be used to check whether we have created irqdomains for IOAPICs. Currently function arch_dynirq_lower_bound() uses that flag, and alloc_irq_from_domain() will use it too later. > > Aside of that is there a point to walk those tables before we actually > can make any use of their content? At least we depend on walking those tables to detect whether system has IOAPICs available:) Regards! Gerry > > Thanks, > > tglx > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html