linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@elte.hu>,
	"H. Peter Anvin" <hpa@zytor.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>
Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	Yinghai Lu <yinghai@kernel.org>, Joerg Roedel <joro@8bytes.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Subject: [PATCH v3 15/27] x86, irq: pre-reserve irq range/realloc for booting path
Date: Fri,  7 Jun 2013 15:31:01 -0700	[thread overview]
Message-ID: <1370644273-10495-16-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1370644273-10495-1-git-send-email-yinghai@kernel.org>

We will use reserve/realloc_irq_and_cfg_at for hotplug ioapic path.

To make thing simple, we could make booting path use same code.

All gsi range will be reserved at first, and realloc will really
allocate those irq_desc/cfg when it is used.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
---
 arch/x86/include/asm/io_apic.h |  1 +
 arch/x86/kernel/apic/io_apic.c | 78 ++++++++++++++++++++++++++++++------------
 2 files changed, 57 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index eaff3ad..8181fd8 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -176,6 +176,7 @@ extern void setup_ioapic_ids_from_mpc_nocheck(void);
 struct mp_ioapic_gsi{
 	u32 gsi_base;
 	u32 gsi_end;
+	u32 irq_base;
 };
 extern struct mp_ioapic_gsi  mp_gsi_routing[];
 extern u32 gsi_top;
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 23b0be5..65863bd 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -287,8 +287,47 @@ static struct irq_cfg *realloc_irq_and_cfg_at(unsigned int at, int node)
 	return alloc_irq_and_cfg_at(at, node);
 }
 
-/* irq_cfg is indexed by the sum of all RTEs in all I/O APICs. */
-static struct irq_cfg irq_cfgx[NR_IRQS_LEGACY];
+static int reserve_ioapic_gsi_irq_base(int idx)
+{
+	int irq;
+	struct mp_ioapic_gsi *gsi_cfg = mp_ioapic_gsi_routing(idx);
+	int cnt = gsi_cfg->gsi_end - gsi_cfg->gsi_base + 1;
+
+	irq = __irq_reserve_irqs(-1, gsi_cfg->gsi_base, cnt);
+	if (irq >= 0) {
+		gsi_cfg->irq_base = irq;
+		apic_printk(APIC_VERBOSE, KERN_INFO
+			"IOAPIC[%d]: apic_id %d, GSI %d-%d ==> irq %d-%d reserved\n",
+			idx, mpc_ioapic_id(idx),
+			gsi_cfg->gsi_base, gsi_cfg->gsi_end,
+			irq, irq + cnt - 1);
+	} else
+		apic_printk(APIC_VERBOSE, KERN_WARNING
+			"IOAPIC[%d]: apic_id %d, GSI %d-%d ==> irq reserve failed\n",
+			idx, mpc_ioapic_id(idx),
+			gsi_cfg->gsi_base, gsi_cfg->gsi_end);
+
+	return irq;
+}
+
+static void __init reserve_ioapic_gsi_irq_extra(void)
+{
+	int irq;
+
+	/* to prevent hot add ioapic taking those slots */
+	if (gsi_top) {
+		irq = irq_reserve_irqs(gsi_top, NR_IRQS_LEGACY);
+		if (irq >= 0)
+			apic_printk(APIC_VERBOSE, KERN_INFO
+				"IOAPIC[extra]: GSI %d-%d ==> irq %d-%d reserved\n",
+				gsi_top, gsi_top + NR_IRQS_LEGACY - 1,
+				irq, irq + NR_IRQS_LEGACY - 1);
+		else
+			apic_printk(APIC_VERBOSE, KERN_WARNING
+				"IOAPIC[extra]: GSI %d-%d ==> irq reserve failed\n",
+				gsi_top, gsi_top + NR_IRQS_LEGACY - 1);
+	}
+}
 
 static void alloc_ioapic_saved_registers(int idx)
 {
@@ -305,8 +344,9 @@ static void alloc_ioapic_saved_registers(int idx)
 
 int __init arch_early_irq_init(void)
 {
+	int node = cpu_to_node(0);
 	struct irq_cfg *cfg;
-	int count, node, i;
+	int i;
 
 	if (!legacy_pic->nr_legacy_irqs)
 		io_apic_irqs = ~0UL;
@@ -314,26 +354,19 @@ int __init arch_early_irq_init(void)
 	for (i = 0; i < nr_ioapics; i++)
 		alloc_ioapic_saved_registers(i);
 
-	cfg = irq_cfgx;
-	count = ARRAY_SIZE(irq_cfgx);
-	node = cpu_to_node(0);
+	for (i = 0; i < nr_ioapics; i++)
+		reserve_ioapic_gsi_irq_base(i);
 
-	/* Make sure the legacy interrupts are marked in the bitmap */
-	irq_reserve_irqs(0, legacy_pic->nr_legacy_irqs);
+	reserve_ioapic_gsi_irq_extra();
 
-	for (i = 0; i < count; i++) {
-		INIT_LIST_HEAD(&cfg[i].irq_2_pin);
-		irq_set_chip_data(i, &cfg[i]);
-		zalloc_cpumask_var_node(&cfg[i].domain, GFP_KERNEL, node);
-		zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_KERNEL, node);
-		/*
-		 * For legacy IRQ's, start with assigning irq0 to irq15 to
-		 * IRQ0_VECTOR to IRQ15_VECTOR for all cpu's.
-		 */
-		if (i < legacy_pic->nr_legacy_irqs) {
-			cfg[i].vector = IRQ0_VECTOR + i;
-			cpumask_setall(cfg[i].domain);
-		}
+	/*
+	 * For legacy IRQ's, start with assigning irq0 to irq15 to
+	 * IRQ0_VECTOR to IRQ15_VECTOR for all cpu's.
+	 */
+	for (i = 0; i < legacy_pic->nr_legacy_irqs; i++) {
+		cfg = realloc_irq_and_cfg_at(i, node);
+		cfg->vector = IRQ0_VECTOR + i;
+		cpumask_setall(cfg->domain);
 	}
 
 	return 0;
@@ -3467,7 +3500,8 @@ int __init arch_probe_nr_irqs(void)
 	if (nr < nr_irqs)
 		nr_irqs = nr;
 
-	return NR_IRQS_LEGACY;
+	/* x86 arch code will allocate irq_desc/cfg */
+	return 0;
 }
 
 int io_apic_set_pci_routing(struct device *dev, int irq,
-- 
1.8.1.4


  parent reply	other threads:[~2013-06-07 22:31 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-07 22:30 [PATCH v3 00/27] x86, irq: support ioapic device hotplug Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 01/27] x86, irq: Change irq_remap_modify_chip_defaults to static Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 02/27] x86, irq: Modify irq chip once for irq remapping Yinghai Lu
2013-06-09 14:54   ` Sebastian Andrzej Siewior
2013-06-10 23:17     ` Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 03/27] x86, irq: Print out MSI/MSI-X clearly Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 04/27] x86, irq: Show MSI-X in /proc/interrupt Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 05/27] x86, irq: Make dmar_msi/hpet_msi irq_chip name consistent Yinghai Lu
2013-06-09 15:16   ` Sebastian Andrzej Siewior
2013-06-10 23:40     ` Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 06/27] ia64, irq: Add dummy create_irq_nr() Yinghai Lu
2013-06-09 15:22   ` Sebastian Andrzej Siewior
2013-06-10 23:41     ` Yinghai Lu
2013-06-11 21:52       ` Luck, Tony
2013-06-07 22:30 ` [PATCH v3 07/27] iommu, irq: Allocate irq_desc for dmar_msi with local node Yinghai Lu
2013-06-09 15:31   ` Sebastian Andrzej Siewior
2013-06-10 23:43     ` Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 08/27] x86, irq: kill create_irq() Yinghai Lu
2013-06-09 15:35   ` Sebastian Andrzej Siewior
2013-06-07 22:30 ` [PATCH v3 09/27] x86, irq: Convert irq_2_pin list to generic list Yinghai Lu
2013-06-09 15:52   ` Sebastian Andrzej Siewior
2013-06-07 22:30 ` [PATCH v3 10/27] genirq: Split __irq_reserve_irqs from irq_alloc_descs Yinghai Lu
2013-06-10 13:51   ` Alexander Gordeev
2013-06-10 19:16     ` Yinghai Lu
2013-06-10 19:42       ` Alexander Gordeev
2013-06-10 19:39   ` Thomas Gleixner
2013-06-10 23:55     ` Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 11/27] x86, irq: Add realloc_irq_and_cfg_at() Yinghai Lu
2013-06-09 19:13   ` Sebastian Andrzej Siewior
2013-06-10 20:13   ` Thomas Gleixner
2013-06-07 22:30 ` [PATCH v3 12/27] x86, irq: Move down arch_early_irq_init() Yinghai Lu
2013-06-07 22:30 ` [PATCH v3 13/27] x86, irq: Split out alloc_ioapic_save_registers() Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 14/27] xen, irq: call irq_realloc_desc_at() at first Yinghai Lu
2013-06-07 22:31 ` Yinghai Lu [this message]
2013-06-07 22:31 ` [PATCH v3 16/27] x86, irq: Add ioapic_gsi_to_irq Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 17/27] genirq: Bail out early in free_desc() Yinghai Lu
2013-06-10 20:43   ` Thomas Gleixner
2013-06-07 22:31 ` [PATCH v3 18/27] x86, irq: More strict checking about registering ioapic Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 19/27] x86, irq: Make mp_register_ioapic handle hot-added ioapic Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 20/27] x86, irq: Add mp_unregister_ioapic to handle hot-remove ioapic Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 21/27] x86, irq: Make ioapics loop skip blank slots Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 22/27] x86, ioapic: Find usable ioapic id for 64bit Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 23/27] x86: Move declaration for mp_register_ioapic() Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 24/27] PCI, x86: Make ioapic hotplug support built-in Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 25/27] PCI, x86, ACPI: Link acpi ioapic register to ioapic Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 26/27] PCI, x86, ACPI: Enable ioapic hotplug support with acpi host bridge Yinghai Lu
2013-06-07 22:31 ` [PATCH v3 27/27] PCI, x86, ACPI: get ioapic address from acpi device Yinghai Lu

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=1370644273-10495-16-git-send-email-yinghai@kernel.org \
    --to=yinghai@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=hpa@zytor.com \
    --cc=joro@8bytes.org \
    --cc=konrad.wilk@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=rjw@sisk.pl \
    --cc=sebastian@breakpoint.cc \
    --cc=tglx@linutronix.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).