From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from www.linutronix.de ([62.245.132.108]:51767 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752992AbaIILFV (ORCPT ); Tue, 9 Sep 2014 07:05:21 -0400 Date: Tue, 9 Sep 2014 13:04:51 +0200 (CEST) From: Thomas Gleixner To: Jiang Liu cc: Benjamin Herrenschmidt , Ingo Molnar , "H. Peter Anvin" , "Rafael J. Wysocki" , Bjorn Helgaas , Randy Dunlap , Yinghai Lu , Borislav Petkov , Grant Likely , x86@kernel.org, Prarit Bhargava , Konrad Rzeszutek Wilk , Andrew Morton , Tony Luck , Joerg Roedel , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, linux-acpi@vger.kernel.org, Sebastian Andrzej Siewior , Ingo Molnar Subject: Re: [Patch v4 07/16] x86, irq: Prefer assigned ID in APIC ID register for x86_64 In-Reply-To: <1409192561-19744-8-git-send-email-jiang.liu@linux.intel.com> Message-ID: References: <1409192561-19744-1-git-send-email-jiang.liu@linux.intel.com> <1409192561-19744-8-git-send-email-jiang.liu@linux.intel.com> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-pci-owner@vger.kernel.org List-ID: On Thu, 28 Aug 2014, Jiang Liu wrote: > From: Yinghai Lu > > Perfer the assigned ID in APIC ID register for x86_64 if it's still > available. > > Signed-off-by: Yinghai Lu > Cc: Joerg Roedel > Cc: Konrad Rzeszutek Wilk > Cc: Sebastian Andrzej Siewior > Signed-off-by: Jiang Liu > --- > arch/x86/kernel/apic/io_apic.c | 38 +++++++++++++++++++++++++++++++++----- > 1 file changed, 33 insertions(+), 5 deletions(-) > > diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c > index 3faf9599ff29..196d9c15fdec 100644 > --- a/arch/x86/kernel/apic/io_apic.c > +++ b/arch/x86/kernel/apic/io_apic.c > @@ -3575,26 +3575,54 @@ static int __init io_apic_get_unique_id(int ioapic, int apic_id) > return apic_id; > } > > -static u8 __init io_apic_unique_id(u8 id) > +static u8 io_apic_unique_id(int idx, u8 id) How is that change related to the changelog? > { > if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL) && > !APIC_XAPIC(apic_version[boot_cpu_physical_apicid])) > - return io_apic_get_unique_id(nr_ioapics, id); > + return io_apic_get_unique_id(idx, id); > else > return id; > } > #else > -static u8 __init io_apic_unique_id(u8 id) > +static u8 io_apic_unique_id(int idx, u8 id) > { > int i; > + u8 new_id; > + unsigned long flags; > DECLARE_BITMAP(used, 256); > + union IO_APIC_reg_00 reg_00; > > bitmap_zero(used, 256); > for_each_ioapic(i) > __set_bit(mpc_ioapic_id(i), used); > if (!test_bit(id, used)) > return id; > - return find_first_zero_bit(used, 256); > + > + /* check register at first */ > + raw_spin_lock_irqsave(&ioapic_lock, flags); > + reg_00.raw = io_apic_read(idx, 0); > + raw_spin_unlock_irqrestore(&ioapic_lock, flags); > + new_id = reg_00.bits.ID; > + if (!test_bit(new_id, used)) { > + apic_printk(APIC_VERBOSE, KERN_INFO > + "IOAPIC[%d]: Using reg apic_id %d instead of %d\n", > + idx, new_id, id); > + return new_id; > + } > + > + new_id = find_first_zero_bit(used, 256); > + reg_00.bits.ID = new_id; > + raw_spin_lock_irqsave(&ioapic_lock, flags); > + io_apic_write(idx, 0, reg_00.raw); > + reg_00.raw = io_apic_read(idx, 0); > + raw_spin_unlock_irqrestore(&ioapic_lock, flags); > + > + /* Sanity check */ > + if (reg_00.bits.ID != new_id) > + pr_warn("IOAPIC[%d]: Unable to change apic_id to %d!\n", > + idx, new_id); So we detect, that the ID could not be changed and we return it nevertheless? Thanks, tglx