All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>
Cc: 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>,
	"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
	ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	Joerg Roedel <joro@8bytes.org>,
	Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>,
	Sebastian Andrzej Siewior <sebastian@breakpoint.cc>
Subject: Re: [PATCH v5 02/33] genirq: Add irq_alloc_reserved_desc()
Date: Sat, 22 Feb 2014 14:05:01 -0800	[thread overview]
Message-ID: <CAE9FiQVf7u62S4puc2iMqiFO2YU-Kf35XVB9mC+SEP6Z73x7Zw@mail.gmail.com> (raw)
In-Reply-To: <CAE9FiQVf2L-FjkXR3WC=0iHNY73D2G4jyMeko4f4DPuxAXTK+Q@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1214 bytes --]

On Sat, Feb 22, 2014 at 9:28 AM, Yinghai Lu <yinghai@kernel.org> wrote:
> On Sat, Feb 22, 2014 at 2:08 AM, Thomas Gleixner <tglx@linutronix.de> wrote:
>>
>> As I said before irq_reserve_irq() is a misnomer and a
>> misconception. Of course this needs to be fixed as well.
>>
>> And you cannot just blindly change it because !SPARSE can use the
>> allocation. We are not creating stupid corner cases just to support
>> your sloppyness. Its not rocket science to do it the right way.
>>
>> That said, it might be worthwhile to get rid of the !SPARSE case
>> completely. That would probably make quite some stuff simpler.
>
> So we need to make all arches support SPARSE_IRQ at first?
>
> Now we have arm, arm64, c6x, metag, powerpc, sh, x86 support SPARSE_IRQ.
>
> The following  are not with SPARSE_IRQ yet:
> alpha, arc, avr32, blackfin, cris, frv, hexagon, m32r, m68k, microblaze,
> mips, mn10300, openrisc, parisc, s390, score, sparc, tile, um,
> unicore32, xtensa.

or add calling irq_alloc_desc_at() before irq_set_chip... for !SPARSE_IRQ.

Please check attached partial patch if you like it.

If you are happy with that, I will split it into pieces and add other
irq_alloc_desc_at()
calling.

Thanks

Yinghai

[-- Attachment #2: kill_irq_reserve_irqs.patch --]
[-- Type: text/x-patch, Size: 5699 bytes --]

diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c
index 1c8625c..6c8728a 100644
--- a/arch/alpha/kernel/irq_alpha.c
+++ b/arch/alpha/kernel/irq_alpha.c
@@ -221,6 +221,7 @@ struct irqaction timer_irqaction = {
 void __init
 init_rtc_irq(void)
 {
+	irq_alloc_desc_at(RTC_IRQ, 0);
 	irq_set_chip_and_handler_name(RTC_IRQ, &dummy_irq_chip,
 				      handle_percpu_irq, "RTC");
 	setup_irq(RTC_IRQ, &timer_irqaction);
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c
index e1861c7..c522359 100644
--- a/arch/alpha/kernel/irq_i8259.c
+++ b/arch/alpha/kernel/irq_i8259.c
@@ -92,6 +92,7 @@ init_i8259a_irqs(void)
 	outb(0xff, 0xA1);	/* mask all of 8259A-2 */
 
 	for (i = 0; i < 16; i++) {
+		irq_alloc_desc_at(i, 0);
 		irq_set_chip_and_handler(i, &i8259a_irq_type, handle_level_irq);
 	}
 
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c
index 13c97a5..b6da6d1 100644
--- a/arch/alpha/kernel/irq_pyxis.c
+++ b/arch/alpha/kernel/irq_pyxis.c
@@ -102,6 +102,7 @@ init_pyxis_irqs(unsigned long ignore_mask)
 	for (i = 16; i < 48; ++i) {
 		if ((ignore_mask >> i) & 1)
 			continue;
+		irq_alloc_desc_at(i, 0);
 		irq_set_chip_and_handler(i, &pyxis_irq_type, handle_level_irq);
 		irq_set_status_flags(i, IRQ_LEVEL);
 	}
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c
index bb27a26..2d1567b 100644
--- a/arch/s390/kernel/irq.c
+++ b/arch/s390/kernel/irq.c
@@ -88,9 +88,13 @@ static const struct irq_class irqclass_sub_desc[NR_ARCH_IRQS] = {
 	[CPU_RST]    = {.name = "RST", .desc = "[CPU] CPU Restart"},
 };
 
+int arch_probe_early_allocate_nr_irqs(void)
+{
+	return THIN_INTERRUPT;
+}
+
 void __init init_IRQ(void)
 {
-	irq_reserve_irqs(0, THIN_INTERRUPT);
 	init_cio_interrupts();
 	init_airq_interrupts();
 	init_ext_interrupts();
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 6ad4658..398f9c4 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -206,9 +206,6 @@ int __init arch_early_irq_init(void)
 	count = ARRAY_SIZE(irq_cfgx);
 	node = cpu_to_node(0);
 
-	/* Make sure the legacy interrupts are marked in the bitmap */
-	irq_reserve_irqs(0, legacy_pic->nr_legacy_irqs);
-
 	for (i = 0; i < count; i++) {
 		irq_set_chip_data(i, &cfg[i]);
 		zalloc_cpumask_var_node(&cfg[i].domain, GFP_KERNEL, node);
diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c
index 8f32a13..05118f92 100644
--- a/drivers/sh/intc/core.c
+++ b/drivers/sh/intc/core.c
@@ -81,11 +81,8 @@ static void __init intc_register_irq(struct intc_desc *desc,
 	unsigned long flags;
 
 	/*
-	 * Register the IRQ position with the global IRQ map, then insert
-	 * it in to the radix tree.
+	 * insert it in to the radix tree.
 	 */
-	irq_reserve_irq(irq);
-
 	raw_spin_lock_irqsave(&intc_big_lock, flags);
 	radix_tree_insert(&d->tree, enum_id, intc_irq_xlate_get(irq));
 	raw_spin_unlock_irqrestore(&intc_big_lock, flags);
diff --git a/include/linux/irq.h b/include/linux/irq.h
index 7dc1003..584f0d7 100644
--- a/include/linux/irq.h
+++ b/include/linux/irq.h
@@ -613,18 +613,13 @@ int __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
 	irq_alloc_descs(-1, from, cnt, node)
 
 void irq_free_descs(unsigned int irq, unsigned int cnt);
-int irq_reserve_irqs(unsigned int from, unsigned int cnt);
+int arch_probe_early_allocate_nr_irqs(void);
 
 static inline void irq_free_desc(unsigned int irq)
 {
 	irq_free_descs(irq, 1);
 }
 
-static inline int irq_reserve_irq(unsigned int irq)
-{
-	return irq_reserve_irqs(irq, 1);
-}
-
 #ifndef irq_reg_writel
 # define irq_reg_writel(val, addr)	writel(val, addr)
 #endif
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index dc04c16..4d86cf5 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -38,12 +38,7 @@ int irq_set_chip(unsigned int irq, struct irq_chip *chip)
 
 	desc->irq_data.chip = chip;
 	irq_put_desc_unlock(desc, flags);
-	/*
-	 * For !CONFIG_SPARSE_IRQ make the irq show up in
-	 * allocated_irqs. For the CONFIG_SPARSE_IRQ case, it is
-	 * already marked, and this call is harmless.
-	 */
-	irq_reserve_irq(irq);
+
 	return 0;
 }
 EXPORT_SYMBOL(irq_set_chip);
diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c
index 8ab8e93..4b2ab96 100644
--- a/kernel/irq/irqdesc.c
+++ b/kernel/irq/irqdesc.c
@@ -248,10 +248,16 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
 	}
 };
 
+int __weak arch_probe_early_allocate_nr_irqs(void)
+{
+        return 0;
+}
+
 int __init early_irq_init(void)
 {
 	int count, i, node = first_online_node;
 	struct irq_desc *desc;
+	int nr = arch_probe_early_allocate_nr_irqs();
 
 	init_irq_default_affinity();
 
@@ -267,6 +273,10 @@ int __init early_irq_init(void)
 		lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);
 		desc_set_defaults(i, &desc[i], node, NULL);
 	}
+
+	for (i = 0; i < nr; i++)
+		set_bit(i, allocated_irqs);
+
 	return arch_early_irq_init();
 }
 
@@ -390,31 +400,6 @@ err:
 EXPORT_SYMBOL_GPL(__irq_alloc_descs);
 
 /**
- * irq_reserve_irqs - mark irqs allocated
- * @from:	mark from irq number
- * @cnt:	number of irqs to mark
- *
- * Returns 0 on success or an appropriate error code
- */
-int irq_reserve_irqs(unsigned int from, unsigned int cnt)
-{
-	unsigned int start;
-	int ret = 0;
-
-	if (!cnt || (from + cnt) > nr_irqs)
-		return -EINVAL;
-
-	mutex_lock(&sparse_irq_lock);
-	start = bitmap_find_next_zero_area(allocated_irqs, nr_irqs, from, cnt, 0);
-	if (start == from)
-		bitmap_set(allocated_irqs, start, cnt);
-	else
-		ret = -EEXIST;
-	mutex_unlock(&sparse_irq_lock);
-	return ret;
-}
-
-/**
  * irq_get_next_irq - get next allocated irq number
  * @offset:	where to start the search
  *

  reply	other threads:[~2014-02-22 22:05 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-03  0:05 [PATCH v5 00/33] x86, irq: Support ioapic controller hotplug Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 01/33] genirq: Split __irq_reserve_irqs from irq_alloc_descs Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 02/33] genirq: Add irq_alloc_reserved_desc() Yinghai Lu
2014-01-23  0:03   ` Thomas Gleixner
2014-02-18  0:59     ` Yinghai Lu
2014-02-22 10:08       ` Thomas Gleixner
2014-02-22 17:28         ` Yinghai Lu
2014-02-22 22:05           ` Yinghai Lu [this message]
2014-02-22 23:38             ` Thomas Gleixner
2014-02-25  1:31               ` Yinghai Lu
2014-02-21  6:45   ` Jiang Liu
2014-01-03  0:05 ` [PATCH v5 03/33] genirq: Do not free unallocated irq descriptors Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 04/33] x86, irq: Change irq_remap_modify_chip_defaults() to static Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 05/33] x86, irq: Modify irq chip once for irq remapping Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 06/33] x86, irq: Show MSI-X clearly in debug message Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 07/33] x86, irq: Show MSI-X in /proc/interrupt Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 08/33] x86, irq: Make dmar_msi/hpet_msi irq_chip name consistent Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 09/33] ia64, irq: Add dummy create_irq_nr() Yinghai Lu
2014-01-03  0:05   ` Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 10/33] iommu, irq: Allocate irq_desc for dmar_msi with local node Yinghai Lu
2014-02-21  7:43   ` Jiang Liu
2014-02-21 23:18     ` Yinghai Lu
2014-02-22  3:14       ` Jiang Liu
2014-02-22  7:44         ` Yinghai Lu
2014-02-22 15:33           ` Jiang Liu
2014-02-22 17:30             ` Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 11/33] x86, irq: Kill create_irq() Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 12/33] x86, irq: Convert irq_2_pin list to generic list Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 13/33] x86, irq: Add alloc_reserved_irq_and_cfg_at() Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 14/33] x86, irq: Move down arch_early_irq_init() Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 15/33] x86, irq: Split out alloc_ioapic_save_registers() Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 16/33] xen, irq: Call irq_alloc_reserved_desc_at() at first Yinghai Lu
2014-01-03  0:05   ` Yinghai Lu
2014-01-03 17:50   ` [Xen-devel] " Stefano Stabellini
2014-01-03 17:50     ` Stefano Stabellini
2014-01-06 20:00     ` Yinghai Lu
2014-01-07 13:30       ` Stefano Stabellini
2014-01-03  0:05 ` [PATCH v5 17/33] x86, irq: Reserve irq range and alloc_reserved for booting path Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 18/33] x86, irq: Add ioapic_gsi_to_irq Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 19/33] x86, irq: Add for_each_ioapic helper Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 20/33] x86, irq: More strict checking about registering ioapic Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 21/33] x86, irq: Make mp_register_ioapic handle hot-added ioapic Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 22/33] x86, irq: Add mp_unregister_ioapic to handle hot-remove ioapic Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 23/33] x86, ioapic: Find usable ioapic id for 64bit Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 24/33] x86: Move declaration for mp_register_ioapic() Yinghai Lu
2014-01-03 21:24   ` Bjorn Helgaas
2014-01-06 22:30     ` Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 25/33] PCI, x86: Make ioapic hotplug support built-in Yinghai Lu
2014-01-03 22:47   ` Bjorn Helgaas
2014-01-06 22:47     ` Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 26/33] ACPI: Make map_mat_entry handle x2apic entry Yinghai Lu
2014-01-03  0:05 ` [PATCH v5 27/33] ACPI: Move acpi_get_cpuid() to separated file Yinghai Lu
2014-01-03  0:06 ` [PATCH v5 28/33] ACPI, ioapic: Add acpi_get_ioapic_id() Yinghai Lu
2014-01-03  0:06 ` [PATCH v5 29/33] PCI, x86, ACPI: Link acpi ioapic register to ioapic Yinghai Lu
2014-01-03  0:06 ` [PATCH v5 30/33] PCI, x86, ACPI: Enable ioapic hotplug support with acpi host bridge Yinghai Lu
2014-01-03 22:39   ` Bjorn Helgaas
2014-01-03  0:06 ` [PATCH v5 31/33] ACPI, x86/PCI: Move resource_to_addr() to acpi generic Yinghai Lu
2014-01-03  0:06 ` [PATCH v5 32/33] PCI, x86, ACPI: get ioapic address from acpi device Yinghai Lu
2014-01-03  0:06 ` [PATCH v5 33/33] x86, ioapic: Hotadd of IOAPICs described in static MADT 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=CAE9FiQVf7u62S4puc2iMqiFO2YU-Kf35XVB9mC+SEP6Z73x7Zw@mail.gmail.com \
    --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.