All of lore.kernel.org
 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>, Tony Luck <tony.luck@intel.com>,
	Bjorn Helgaas <bhelgaas@google.com>,
	"Rafael J. Wysocki" <rjw@sisk.pl>
Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-acpi@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Sebastian Andrzej Siewior <sebastian@breakpoint.cc>,
	Joerg Roedel <joro@8bytes.org>
Subject: [PATCH v4 05/28] x86, irq: Modify irq chip once for irq remapping
Date: Sat, 10 Aug 2013 19:47:51 -0700	[thread overview]
Message-ID: <1376189294-32022-6-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1376189294-32022-1-git-send-email-yinghai@kernel.org>

Current code: after irq remapping is enabled, irq_chip fields are modified
during every irq setup.
	mp_register_gsi
		io_apic_set_pci_routing
			io_apic_setup_irq_pin
				setup_ioapic_irq
					ioapic_register_intr
						setup_remapped_irq
	native_setup_msi_irqs
		setup_msi_irq
			setup_remapped_irq
	default_setup_hpet_msi
		setup_remapped_irq
that is not efficient.

We only need to modify those irq chip one time after we enable
irq remapping.

Change irq_remap_modify_chip_defaults() to __init as it only gets
called during booting stage, via irq_remap_modify_chips().

Affected irq_chip: ioapic_chip, msi_chip, hpet_msi_type.
We don't need to use #ifdef in irq_remap_modify_chips():
IRQ_REMAP only support x86_64 && X86_IO_APIC && PCI_MSI.
HPET_TIMER is selected when x86_64 is set.
When we have IRQ_REMAP enabled, al three chips are defined and
used.

-v3: Remove irq_chip in setup_remapped_irq according to Sebastian.
     also add missing "\n" in printk.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Cc: Joerg Roedel <joro@8bytes.org>
---
 arch/x86/include/asm/io_apic.h       |  5 +++++
 arch/x86/include/asm/irq_remapping.h |  8 ++------
 arch/x86/kernel/apic/apic.c          |  9 ++++++++-
 arch/x86/kernel/apic/io_apic.c       | 14 ++++++--------
 drivers/iommu/irq_remapping.c        | 13 ++++++++++---
 5 files changed, 31 insertions(+), 18 deletions(-)

diff --git a/arch/x86/include/asm/io_apic.h b/arch/x86/include/asm/io_apic.h
index 459e50a..eaff3ad 100644
--- a/arch/x86/include/asm/io_apic.h
+++ b/arch/x86/include/asm/io_apic.h
@@ -215,6 +215,11 @@ static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned
 
 extern void io_apic_eoi(unsigned int apic, unsigned int vector);
 
+extern struct irq_chip ioapic_chip;
+extern struct irq_chip msi_chip;
+extern struct irq_chip hpet_msi_type;
+void irq_remap_modify_chips(void);
+
 #else  /* !CONFIG_X86_IO_APIC */
 
 #define io_apic_assign_pci_irqs 0
diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
index 606f42e..304c93f 100644
--- a/arch/x86/include/asm/irq_remapping.h
+++ b/arch/x86/include/asm/irq_remapping.h
@@ -52,9 +52,7 @@ extern void compose_remapped_msi_msg(struct pci_dev *pdev,
 				     struct msi_msg *msg, u8 hpet_id);
 extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id);
 extern void panic_if_irq_remap(const char *msg);
-extern bool setup_remapped_irq(int irq,
-			       struct irq_cfg *cfg,
-			       struct irq_chip *chip);
+extern bool setup_remapped_irq(int irq, struct irq_cfg *cfg);
 
 #else  /* CONFIG_IRQ_REMAP */
 
@@ -89,9 +87,7 @@ static inline void panic_if_irq_remap(const char *msg)
 {
 }
 
-static inline bool setup_remapped_irq(int irq,
-				      struct irq_cfg *cfg,
-				      struct irq_chip *chip)
+static inline bool setup_remapped_irq(int irq, struct irq_cfg *cfg)
 {
 	return false;
 }
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index eca89c5..9b64203 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -1571,6 +1571,8 @@ void enable_x2apic(void)
 int __init enable_IR(void)
 {
 #ifdef CONFIG_IRQ_REMAP
+	int ret;
+
 	if (!irq_remapping_supported()) {
 		pr_debug("intr-remapping not supported\n");
 		return -1;
@@ -1582,7 +1584,12 @@ int __init enable_IR(void)
 		return -1;
 	}
 
-	return irq_remapping_enable();
+	ret = irq_remapping_enable();
+
+	if (ret >= 0)
+		irq_remap_modify_chips();
+
+	return ret;
 #endif
 	return -1;
 }
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 9ed796c..eda56ad 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -1238,8 +1238,6 @@ void __setup_vector_irq(int cpu)
 	raw_spin_unlock(&vector_lock);
 }
 
-static struct irq_chip ioapic_chip;
-
 #ifdef CONFIG_X86_32
 static inline int IO_APIC_irq_trigger(int irq)
 {
@@ -1280,7 +1278,7 @@ static void ioapic_register_intr(unsigned int irq, struct irq_cfg *cfg,
 		fasteoi = false;
 	}
 
-	if (setup_remapped_irq(irq, cfg, chip))
+	if (setup_remapped_irq(irq, cfg))
 		fasteoi = trigger != 0;
 
 	hdl = fasteoi ? handle_fasteoi_irq : handle_edge_irq;
@@ -2511,7 +2509,7 @@ static void ack_apic_level(struct irq_data *data)
 	ioapic_irqd_unmask(data, cfg, masked);
 }
 
-static struct irq_chip ioapic_chip __read_mostly = {
+struct irq_chip ioapic_chip __read_mostly = {
 	.name			= "IO-APIC",
 	.irq_startup		= startup_ioapic_irq,
 	.irq_mask		= mask_ioapic_irq,
@@ -3093,7 +3091,7 @@ msi_set_affinity(struct irq_data *data, const struct cpumask *mask, bool force)
  * IRQ Chip for MSI PCI/PCI-X/PCI-Express Devices,
  * which implement the MSI or MSI-X Capability Structure.
  */
-static struct irq_chip msi_chip = {
+struct irq_chip msi_chip = {
 	.name			= "PCI-MSI",
 	.irq_unmask		= unmask_msi_irq,
 	.irq_mask		= mask_msi_irq,
@@ -3123,7 +3121,7 @@ int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
 	if (!irq_offset)
 		write_msi_msg(irq, &msg);
 
-	setup_remapped_irq(irq, irq_get_chip_data(irq), chip);
+	setup_remapped_irq(irq, irq_get_chip_data(irq));
 
 	irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge");
 
@@ -3240,7 +3238,7 @@ static int hpet_msi_set_affinity(struct irq_data *data,
 	return IRQ_SET_MASK_OK_NOCOPY;
 }
 
-static struct irq_chip hpet_msi_type = {
+struct irq_chip hpet_msi_type = {
 	.name = "HPET_MSI",
 	.irq_unmask = hpet_msi_unmask,
 	.irq_mask = hpet_msi_mask,
@@ -3261,7 +3259,7 @@ int default_setup_hpet_msi(unsigned int irq, unsigned int id)
 
 	hpet_msi_write(irq_get_handler_data(irq), &msg);
 	irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
-	setup_remapped_irq(irq, irq_get_chip_data(irq), chip);
+	setup_remapped_irq(irq, irq_get_chip_data(irq));
 
 	irq_set_chip_and_handler_name(irq, chip, handle_edge_irq, "edge");
 	return 0;
diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
index 85ae2cf..8e4e3af 100644
--- a/drivers/iommu/irq_remapping.c
+++ b/drivers/iommu/irq_remapping.c
@@ -375,19 +375,26 @@ static void ir_print_prefix(struct irq_data *data, struct seq_file *p)
 	seq_printf(p, " IR-%s", data->chip->name);
 }
 
-static void irq_remap_modify_chip_defaults(struct irq_chip *chip)
+static void __init irq_remap_modify_chip_defaults(struct irq_chip *chip)
 {
+	printk(KERN_DEBUG "irq_chip: %s ==> IR-%s\n", chip->name, chip->name);
 	chip->irq_print_chip = ir_print_prefix;
 	chip->irq_ack = ir_ack_apic_edge;
 	chip->irq_eoi = ir_ack_apic_level;
 	chip->irq_set_affinity = x86_io_apic_ops.set_affinity;
 }
 
-bool setup_remapped_irq(int irq, struct irq_cfg *cfg, struct irq_chip *chip)
+void __init irq_remap_modify_chips(void)
+{
+	irq_remap_modify_chip_defaults(&ioapic_chip);
+	irq_remap_modify_chip_defaults(&msi_chip);
+	irq_remap_modify_chip_defaults(&hpet_msi_type);
+}
+
+bool setup_remapped_irq(int irq, struct irq_cfg *cfg)
 {
 	if (!irq_remapped(cfg))
 		return false;
 	irq_set_status_flags(irq, IRQ_MOVE_PCNTXT);
-	irq_remap_modify_chip_defaults(chip);
 	return true;
 }
-- 
1.8.1.4

  parent reply	other threads:[~2013-08-11  2:47 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-11  2:47 [PATCH v4 00/28] x86, irq: Support ioapic controller hotplug Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 01/28] genirq: Split __irq_reserve_irqs from irq_alloc_descs Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 02/28] genirq: Add irq_alloc_reserved_desc() Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 03/28] genirq: Do not free unallocated irq descriptors Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 04/28] x86, irq: Change irq_remap_modify_chip_defaults() to static Yinghai Lu
2013-08-11  2:47 ` Yinghai Lu [this message]
2013-08-11  2:47 ` [PATCH v4 06/28] x86, irq: Show MSI-X clearly in debug message Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 07/28] x86, irq: Show MSI-X in /proc/interrupt Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 08/28] x86, irq: Make dmar_msi/hpet_msi irq_chip name consistent Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 09/28] ia64, irq: Add dummy create_irq_nr() Yinghai Lu
2013-08-11  2:47   ` Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 10/28] iommu, irq: Allocate irq_desc for dmar_msi with local node Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 11/28] x86, irq: Kill create_irq() Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 12/28] x86, irq: Convert irq_2_pin list to generic list Yinghai Lu
2013-08-11  2:47 ` [PATCH v4 13/28] x86, irq: Add alloc_reserved_irq_and_cfg_at() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 14/28] x86, irq: Move down arch_early_irq_init() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 15/28] x86, irq: Split out alloc_ioapic_save_registers() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 16/28] xen, irq: Call irq_alloc_reserved_desc_at() at first Yinghai Lu
2013-08-11  2:48   ` Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 17/28] x86, irq: Reserve irq range and alloc_reserved for booting path Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 18/28] x86, irq: Add ioapic_gsi_to_irq Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 19/28] x86, irq: Add for_each_ioapic helper Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 20/28] x86, irq: More strict checking about registering ioapic Yinghai Lu
2013-08-19  7:47   ` Lan Tianyu
2013-10-21 10:54   ` Yijing Wang
2013-10-21 10:54     ` Yijing Wang
2013-08-11  2:48 ` [PATCH v4 21/28] x86, irq: Make mp_register_ioapic handle hot-added ioapic Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 22/28] x86, irq: Add mp_unregister_ioapic to handle hot-remove ioapic Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 23/28] x86, ioapic: Find usable ioapic id for 64bit Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 24/28] x86: Move declaration for mp_register_ioapic() Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 25/28] PCI, x86: Make ioapic hotplug support built-in Yinghai Lu
2013-10-01 16:00   ` Bjorn Helgaas
2013-10-01 17:42     ` Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 26/28] PCI, x86, ACPI: Link acpi ioapic register to ioapic Yinghai Lu
2013-08-24  0:51   ` rui wang
2013-08-27  0:40     ` Yinghai Lu
2013-08-27  6:44       ` rui wang
2013-08-27  6:53         ` Yinghai Lu
2013-08-27 10:08           ` rui wang
2013-08-28  6:17             ` Yinghai Lu
2013-08-11  2:48 ` [PATCH v4 27/28] PCI, x86, ACPI: Enable ioapic hotplug support with acpi host bridge Yinghai Lu
2013-08-27 10:25   ` rui wang
2013-08-28  1:10     ` rui wang
2013-08-28  6:22     ` Yinghai Lu
2013-08-28  8:25       ` rui wang
2013-10-21 12:30   ` Yijing Wang
2013-10-21 12:30     ` Yijing Wang
2013-08-11  2:48 ` [PATCH v4 28/28] PCI, x86, ACPI: get ioapic address from acpi device Yinghai Lu
2013-08-22 13:29   ` rui wang
2013-08-23 10:41     ` rui wang
2013-08-23 15:34       ` Lan Tianyu
2013-08-23 18:38         ` Yinghai Lu
2013-08-23 19:04           ` Yinghai Lu
2013-08-23 19:38             ` Yinghai Lu
2013-08-26 15:46               ` Lan Tianyu
2013-08-27  1:03                 ` Yinghai Lu
2013-08-27 14:56                   ` Lan Tianyu

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=1376189294-32022-6-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-acpi@vger.kernel.org \
    --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 \
    --cc=tony.luck@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.