From: Benjamin Herrenschmidt <benh@kernel.crashing.org>
To: "Eric W. Biederman" <ebiederm@xmission.com>
Cc: Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org,
linux-pci@atrey.karlin.mff.cuni.cz, discuss@x86-64.org,
Ingo Molnar <mingo@elte.hu>, Thomas Gleixner <tglx@linutronix.de>,
Andi Kleen <ak@suse.de>,
Natalie Protasevich <Natalie.Protasevich@UNISYS.com>,
Len Brown <len.brown@intel.com>,
Kimball Murray <kimball.murray@gmail.com>,
Brice Goglin <brice@myri.com>,
Greg Lindahl <greg.lindahl@qlogic.com>,
Dave Olson <olson@unixfolk.com>, Jeff Garzik <jeff@garzik.org>,
Greg KH <gregkh@suse.de>, Grant Grundler <iod00d@hp.com>,
"bibo,mao" <bibo.mao@intel.com>,
Rajesh Shah <rajesh.shah@intel.com>, Mark Maule <maule@sgi.com>,
Jesper Juhl <jesper.juhl@gmail.com>,
Shaohua Li <shaohua.li@intel.com>,
Matthew Wilcox <matthew@wil.cx>,
"Michael S. Tsirkin" <mst@mellanox.co.il>,
Ashok Raj <ashok.raj@intel.com>,
Randy Dunlap <rdunlap@xenotime.net>
Subject: Re: [PATCH 9/25] irq: Add a dynamic irq creation API
Date: Wed, 21 Jun 2006 09:56:04 +1000 [thread overview]
Message-ID: <1150847764.1901.64.camel@localhost.localdomain> (raw)
In-Reply-To: <115084252131-git-send-email-ebiederm@xmission.com>
On Tue, 2006-06-20 at 16:28 -0600, Eric W. Biederman wrote:
> With the msi support comes a new concept in irq handling,
> irqs that are created dynamically at run time.
>
> Currently the msi code allocates irqs backwards. First it
> allocates a platform dependent routing value for an
> interrupt the ``vector'' and then it figures out from the
> vector which irq you are on.
You may want to look at the work I'm currently doing for powerpc where
we need a fully dynamic linux irq number allocation, completely separate
spaces for hw numbers (vectors) and linux irq numbers for arbitrary PICs
(and more than one in a given system) etc...
I'll post a patch that shows the stuff I'm adding later today so you can
have a look. There is some overlap with your dynamic irq stuff.
I haven't completely ported all of powerpc to my new core yet which is
why I haven't posted patches yet, but I'll have something out today.
Ben.
> This msi backwards allocator suffers from two basic
> problems. The allocator suffers because it is trying
> to do something that is architecture specific in a generic
> way making it brittle, inflexible, and tied to tightly
> to the architecture implementation. The alloctor also
> suffers from it's very backwards nature as it has tied
> things together that should have no dependencies.
>
> To solve the basic dynamic irq allocation problem two
> new architecture specific functions are added:
> create_irq and destroy_irq.
>
> create_irq takes no input and returns an unused irq number,
> that won't be reused until it is returned to the free
> poll with destroy_irq. The irq then can be used for
> any purpose although the only initial consumer is
> the msi code.
>
> destroy_irq takes an irq number allocated with create_irq
> and returns it to the free pool.
>
> Making this functionality per architecture increases
> the simplicity of the irq allocation code and increases
> it's flexibility.
>
> dynamic_irq_init() and dynamic_irq_cleanup() are added
> to automate the irq_desc initializtion that should happen
> for dynamic irqs.
>
> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
> ---
> include/linux/irq.h | 9 +++++++-
> kernel/irq/chip.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 64 insertions(+), 1 deletions(-)
>
> diff --git a/include/linux/irq.h b/include/linux/irq.h
> index b79d178..6d1ad88 100644
> --- a/include/linux/irq.h
> +++ b/include/linux/irq.h
> @@ -392,8 +392,15 @@ set_irq_chained_handler(unsigned int irq
> __set_irq_handler(irq, handle, 1);
> }
>
> -/* Set/get chip/data for an IRQ: */
> +/* Handle dynamic irq creation and destruction */
> +extern int create_irq(void);
> +extern void destroy_irq(unsigned int irq);
> +
> +/* Dynamic irq helper functions */
> +extern void dynamic_irq_init(unsigned int irq);
> +extern void dynamic_irq_cleanup(unsigned int irq);
>
> +/* Set/get chip/data for an IRQ: */
> extern int set_irq_chip(unsigned int irq, struct irq_chip *chip);
> extern int set_irq_data(unsigned int irq, void *data);
> extern int set_irq_chip_data(unsigned int irq, void *data);
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index 431e9d5..9c01e48 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -18,6 +18,62 @@ #include <linux/kernel_stat.h>
> #include "internals.h"
>
> /**
> + * dynamic_irq_init - initialize a dynamically allocated irq
> + * @irq: irq number to initialize
> + */
> +void dynamic_irq_init(unsigned int irq)
> +{
> + struct irq_desc *desc;
> + unsigned long flags;
> +
> + if (irq >= NR_IRQS) {
> + printk(KERN_ERR "Trying to initialize invalid IRQ%d\n", irq);
> + WARN_ON(1);
> + return;
> + }
> +
> + /* Ensure we don't have left over values from a previous use of this irq */
> + desc = irq_desc + irq;
> + spin_lock_irqsave(&desc->lock, flags);
> + desc->status = IRQ_DISABLED;
> + desc->chip = &no_irq_chip;
> + desc->handle_irq = handle_bad_irq;
> + desc->depth = 1;
> + desc->handler_data = NULL;
> + desc->chip_data = NULL;
> + desc->action = NULL;
> + desc->irq_count = 0;
> + desc->irqs_unhandled = 0;
> +#ifdef CONFIG_SMP
> + desc->affinity = CPU_MASK_ALL;
> +#endif
> + spin_unlock_irqrestore(&desc->lock, flags);
> +}
> +
> +/**
> + * dynamic_irq_cleanup - cleanup a dynamically allocated irq
> + * @irq: irq number to initialize
> + */
> +void dynamic_irq_cleanup(unsigned int irq)
> +{
> + struct irq_desc *desc;
> + unsigned long flags;
> +
> + if (irq >= NR_IRQS) {
> + printk(KERN_ERR "Trying to cleanup invalid IRQ%d\n", irq);
> + WARN_ON(1);
> + return;
> + }
> +
> + desc = irq_desc + irq;
> + spin_lock_irqsave(&desc->lock, flags);
> + desc->handle_irq = handle_bad_irq;
> + desc->chip = &no_irq_chip;
> + spin_unlock_irqrestore(&desc->lock, flags);
> +}
> +
> +
> +/**
> * set_irq_chip - set the irq chip for an irq
> * @irq: irq number
> * @chip: pointer to irq chip description structure
> --
> 1.4.0.gc07e
>
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2006-06-20 23:57 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-20 22:24 [PATCH 0/25] Decouple IRQ issues (MSI, i386, x86_64, ia64) Eric W. Biederman
2006-06-20 22:28 ` [PATCH 1/25] irq: Convert the move_irq flag from a 32bit word to a single bit Eric W. Biederman
2006-06-20 22:28 ` [PATCH 2/25] irq: Add moved_masked_irq Eric W. Biederman
2006-06-20 22:28 ` [PATCH 3/25] x86_64 irq: Reenable migrating irqs to other cpus Eric W. Biederman
2006-06-20 22:28 ` [PATCH 4/25] msi: Simplify msi enable and disable Eric W. Biederman
2006-06-20 22:28 ` [PATCH 5/25] msi: Make the msi boolean tests return either 0 or 1 Eric W. Biederman
2006-06-20 22:28 ` [PATCH 6/25] msi: Implement helper functions read_msi_msg and write_msi_msg Eric W. Biederman
2006-06-20 22:28 ` [PATCH 7/25] msi: Refactor the msi_ops Eric W. Biederman
2006-06-20 22:28 ` [PATCH 8/25] msi: Simplify the msi irq limit policy Eric W. Biederman
2006-06-20 22:28 ` [PATCH 9/25] irq: Add a dynamic irq creation API Eric W. Biederman
2006-06-20 22:28 ` [PATCH 10/25] ia64 irq: Dynamic irq support Eric W. Biederman
2006-06-20 22:28 ` [PATCH 11/25] i386 " Eric W. Biederman
2006-06-20 22:28 ` [PATCH 12/25] x86_64 " Eric W. Biederman
2006-06-20 22:28 ` [PATCH 13/25] msi: Make the msi code irq based and not vector based Eric W. Biederman
2006-06-20 22:28 ` [PATCH 14/25] x86_64 irq: Move msi message composition into io_apic.c Eric W. Biederman
2006-06-20 22:28 ` [PATCH 15/25] i386 " Eric W. Biederman
2006-06-20 22:28 ` [PATCH 16/25] msi: Only build msi-apic.c on ia64 Eric W. Biederman
2006-06-20 22:28 ` [PATCH 17/25] x86_64 irq: Remove the msi assumption that irq == vector Eric W. Biederman
2006-06-20 22:28 ` [PATCH 18/25] i386 " Eric W. Biederman
2006-06-20 22:28 ` [PATCH 19/25] irq: Remove msi hacks Eric W. Biederman
2006-06-20 22:28 ` [PATCH 20/25] irq: Generalize the check for HARDIRQ_BITS Eric W. Biederman
2006-06-20 22:28 ` [PATCH 21/25] x86_64 irq: Make the external irq handlers report their vector, not the irq number Eric W. Biederman
2006-06-20 22:28 ` [PATCH 22/25] x86_64 irq: make vector_irq per cpu Eric W. Biederman
2006-06-20 22:28 ` [PATCH 23/25] x86_64 irq: Kill gsi_irq_sharing Eric W. Biederman
2006-06-20 22:28 ` [PATCH 24/25] x86_64 irq: Kill irq compression Eric W. Biederman
2006-06-20 22:28 ` [PATCH 25/25] irq: Document what an IRQ is Eric W. Biederman
2006-06-21 1:50 ` [PATCH 11/25] i386 irq: Dynamic irq support Rajesh Shah
2006-06-21 2:21 ` Eric W. Biederman
2006-06-21 2:27 ` Rajesh Shah
2006-06-21 14:07 ` Eric W. Biederman
2006-06-20 23:56 ` Benjamin Herrenschmidt [this message]
2006-06-21 1:01 ` [PATCH 9/25] irq: Add a dynamic irq creation API Eric W. Biederman
2006-06-21 1:33 ` Benjamin Herrenschmidt
2006-06-21 1:41 ` Jeff Garzik
2006-06-21 1:36 ` Matthew Wilcox
2006-06-21 1:28 ` [PATCH 8/25] msi: Simplify the msi irq limit policy Rajesh Shah
2006-06-21 2:46 ` Roland Dreier
2006-06-21 3:48 ` Eric W. Biederman
2006-06-21 1:18 ` [PATCH 7/25] msi: Refactor the msi_ops Rajesh Shah
2006-06-21 1:04 ` [PATCH 6/25] msi: Implement helper functions read_msi_msg and write_msi_msg Rajesh Shah
2006-06-21 1:43 ` Eric W. Biederman
2006-06-20 22:45 ` [PATCH 5/25] msi: Make the msi boolean tests return either 0 or 1 Jeff Garzik
2006-06-21 0:44 ` [PATCH 4/25] msi: Simplify msi enable and disable Rajesh Shah
2006-06-21 1:19 ` Eric W. Biederman
2006-06-21 0:30 ` [PATCH 0/25] Decouple IRQ issues (MSI, i386, x86_64, ia64) Rajesh Shah
2006-06-21 1:07 ` Eric W. Biederman
2006-06-21 14:10 ` [PATCH] Decouple IRQ issues (fix i386 compile issues) Eric W. Biederman
2006-06-21 10:24 ` [PATCH 0/25] Decouple IRQ issues (MSI, i386, x86_64, ia64) Ingo Molnar
2006-06-21 16:25 ` Greg KH
2006-06-22 3:55 ` Eric W. Biederman
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=1150847764.1901.64.camel@localhost.localdomain \
--to=benh@kernel.crashing.org \
--cc=Natalie.Protasevich@UNISYS.com \
--cc=ak@suse.de \
--cc=akpm@osdl.org \
--cc=ashok.raj@intel.com \
--cc=bibo.mao@intel.com \
--cc=brice@myri.com \
--cc=discuss@x86-64.org \
--cc=ebiederm@xmission.com \
--cc=greg.lindahl@qlogic.com \
--cc=gregkh@suse.de \
--cc=iod00d@hp.com \
--cc=jeff@garzik.org \
--cc=jesper.juhl@gmail.com \
--cc=kimball.murray@gmail.com \
--cc=len.brown@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@atrey.karlin.mff.cuni.cz \
--cc=matthew@wil.cx \
--cc=maule@sgi.com \
--cc=mingo@elte.hu \
--cc=mst@mellanox.co.il \
--cc=olson@unixfolk.com \
--cc=rajesh.shah@intel.com \
--cc=rdunlap@xenotime.net \
--cc=shaohua.li@intel.com \
--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