All of lore.kernel.org
 help / color / mirror / Atom feed
From: jamie@jamieiles.com (Jamie Iles)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv2 02/10] ARM: vic: MULTI_IRQ_HANDLER handler
Date: Wed, 2 Nov 2011 14:08:11 +0000	[thread overview]
Message-ID: <20111102140811.GA22491@totoro> (raw)
In-Reply-To: <20111102134024.GE19187@n2100.arm.linux.org.uk>

On Wed, Nov 02, 2011 at 01:40:24PM +0000, Russell King - ARM Linux wrote:
> On Thu, Sep 29, 2011 at 10:30:09AM +0100, Jamie Iles wrote:
> > +#ifdef CONFIG_MULTI_IRQ_HANDLER
> > +static void vic_single_handle_irq(struct vic_device *vic, struct pt_regs *regs)
> > +{
> > +	u32 stat, irq;
> > +
> > +	stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
> > +	while (stat) {
> > +		irq = ffs(stat) - 1;
> > +		handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs);
> > +		stat &= ~(1 << irq);
> > +	}
> > +}
> > +
> > +asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs)
> > +{
> > +	int i;
> > +
> > +	for (i = 0; i < vic_id; ++i)
> > +		vic_single_handle_irq(&vic_devices[i], regs);
> > +}
> 
> And if we receive another interrupt after the read of the register, we'll
> have to exit all the way back (possibly to userspace) before re-entering
> the IRQ handling paths back to this point to process it.

OK, so how about something like this instead:

static int vic_single_handle_irq(struct vic_device *vic,
				 struct pt_regs *regs)
{
	u32 stat, irq;
	int handled = 0;

	stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
	while (stat) {
		irq = ffs(stat) - 1;
		handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs);
		stat &= ~(1 << irq);
		handled = 1;
	}

	return handled;
}

asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs)
{
	int i, handled;

	do {
		handled = 0;
		for (i = 0; i < vic_id; ++i)
			if (vic_single_handle_irq(&vic_devices[i], regs))
				handled = 1;
	} while (handled);
}

which I think should keep handling IRQ's until no VIC has them pending 
(or as best can be determined).

> Is there any particular reason folk are destroying the built-in efficiency
> of the IRQ handling which is common-place in the existing assembly
> approach?

Well this approach makes a single image kernel a bit easier.  The other 
thing is that it plays a lot nicer with dynamic irq_desc assignment.  
Grant's IRQ domain patches make this quite easy here, but I can't see an 
obvious way to do that with the assembly method.

Jamie

WARNING: multiple messages have this Message-ID (diff)
From: Jamie Iles <jamie@jamieiles.com>
To: Russell King - ARM Linux <linux@arm.linux.org.uk>
Cc: kgene.kim@samsung.com, linus.walleij@stericsson.com,
	Linus Walleij <linus.walleij@linaro.org>,
	rob.herring@calxeda.com, Grant Likely <grant.likely@secretlab.ca>,
	hsweeten@visionengravers.com, rajeev-dlh.kumar@st.com,
	ben-linux@fluff.org, STEricsson_nomadik_linux@list.st.com,
	Jamie Iles <jamie@jamieiles.com>,
	rubini@unipv.it, devicetree-discuss@lists.ozlabs.org,
	linux-arm-kernel@lists.infradead.org, rmallon@gmail.com
Subject: Re: [PATCHv2 02/10] ARM: vic: MULTI_IRQ_HANDLER handler
Date: Wed, 2 Nov 2011 14:08:11 +0000	[thread overview]
Message-ID: <20111102140811.GA22491@totoro> (raw)
In-Reply-To: <20111102134024.GE19187@n2100.arm.linux.org.uk>

On Wed, Nov 02, 2011 at 01:40:24PM +0000, Russell King - ARM Linux wrote:
> On Thu, Sep 29, 2011 at 10:30:09AM +0100, Jamie Iles wrote:
> > +#ifdef CONFIG_MULTI_IRQ_HANDLER
> > +static void vic_single_handle_irq(struct vic_device *vic, struct pt_regs *regs)
> > +{
> > +	u32 stat, irq;
> > +
> > +	stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
> > +	while (stat) {
> > +		irq = ffs(stat) - 1;
> > +		handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs);
> > +		stat &= ~(1 << irq);
> > +	}
> > +}
> > +
> > +asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs)
> > +{
> > +	int i;
> > +
> > +	for (i = 0; i < vic_id; ++i)
> > +		vic_single_handle_irq(&vic_devices[i], regs);
> > +}
> 
> And if we receive another interrupt after the read of the register, we'll
> have to exit all the way back (possibly to userspace) before re-entering
> the IRQ handling paths back to this point to process it.

OK, so how about something like this instead:

static int vic_single_handle_irq(struct vic_device *vic,
				 struct pt_regs *regs)
{
	u32 stat, irq;
	int handled = 0;

	stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
	while (stat) {
		irq = ffs(stat) - 1;
		handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs);
		stat &= ~(1 << irq);
		handled = 1;
	}

	return handled;
}

asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs)
{
	int i, handled;

	do {
		handled = 0;
		for (i = 0; i < vic_id; ++i)
			if (vic_single_handle_irq(&vic_devices[i], regs))
				handled = 1;
	} while (handled);
}

which I think should keep handling IRQ's until no VIC has them pending 
(or as best can be determined).

> Is there any particular reason folk are destroying the built-in efficiency
> of the IRQ handling which is common-place in the existing assembly
> approach?

Well this approach makes a single image kernel a bit easier.  The other 
thing is that it plays a lot nicer with dynamic irq_desc assignment.  
Grant's IRQ domain patches make this quite easy here, but I can't see an 
obvious way to do that with the assembly method.

Jamie

  reply	other threads:[~2011-11-02 14:08 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-28 10:41 [PATCHv2 00/10] VIC DT binding and MULTI_IRQ_HANDLER Jamie Iles
2011-09-28 10:41 ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 01/10] ARM: vic: device tree binding Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 20:11   ` Grant Likely
2011-09-28 20:11     ` Grant Likely
2011-09-29  4:00   ` Rob Herring
2011-09-29  4:00     ` Rob Herring
2011-09-28 10:41 ` [PATCHv2 02/10] ARM: vic: MULTI_IRQ_HANDLER handler Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 11:09   ` Linus Walleij
2011-09-28 11:09     ` Linus Walleij
2011-09-28 12:08     ` Jamie Iles
2011-09-28 12:08       ` Jamie Iles
2011-09-28 20:39   ` Grant Likely
2011-09-28 20:39     ` Grant Likely
2011-09-29  6:55     ` Linus Walleij
2011-09-29  6:55       ` Linus Walleij
2011-09-29  9:30       ` Jamie Iles
2011-09-29  9:30         ` Jamie Iles
2011-09-29 16:55         ` Grant Likely
2011-09-29 16:55           ` Grant Likely
2011-11-02 13:40         ` Russell King - ARM Linux
2011-11-02 13:40           ` Russell King - ARM Linux
2011-11-02 14:08           ` Jamie Iles [this message]
2011-11-02 14:08             ` Jamie Iles
2011-11-03 12:29             ` Linus Walleij
2011-11-03 12:29               ` Linus Walleij
2011-11-03 12:51               ` Russell King - ARM Linux
2011-11-03 12:51                 ` Russell King - ARM Linux
2011-11-03 13:00                 ` Linus Walleij
2011-11-03 13:00                   ` Linus Walleij
2011-11-03 13:04                   ` Jamie Iles
2011-11-03 13:04                     ` Jamie Iles
2011-11-03 13:31                   ` Russell King - ARM Linux
2011-11-03 13:31                     ` Russell King - ARM Linux
2011-11-03 15:03                     ` Jamie Iles
2011-11-03 15:03                       ` Jamie Iles
2011-11-03 15:11                       ` Russell King - ARM Linux
2011-11-03 15:11                         ` Russell King - ARM Linux
2011-11-03 13:49                 ` Nicolas Pitre
2011-11-03 13:49                   ` Nicolas Pitre
2011-09-29 15:03   ` Zoltan Devai
2011-09-29 15:03     ` Zoltan Devai
2011-09-29 15:13     ` Jamie Iles
2011-09-29 15:13       ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 03/10] ARM: ep93xx: convert to MULTI_IRQ_HANDLER Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 11:15   ` Linus Walleij
2011-09-28 11:15     ` Linus Walleij
2011-09-28 10:41 ` [PATCHv2 04/10] ARM: netx: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 05/10] ARM: nomadik: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 11:12   ` Linus Walleij
2011-09-28 11:12     ` Linus Walleij
2011-09-28 10:41 ` [PATCHv2 06/10] ARM: s3c64xx: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 07/10] ARM: spear: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 08/10] ARM: u300: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 11:03   ` Linus Walleij
2011-09-28 11:03     ` Linus Walleij
2011-09-28 12:03     ` Jamie Iles
2011-09-28 12:03       ` Jamie Iles
2011-09-28 12:18       ` Linus Walleij
2011-09-28 12:18         ` Linus Walleij
2011-09-28 12:29         ` Jamie Iles
2011-09-28 12:29           ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 09/10] ARM: versatile: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles
2011-09-28 10:41 ` [PATCHv2 10/10] ARM: samsung: " Jamie Iles
2011-09-28 10:41   ` Jamie Iles

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=20111102140811.GA22491@totoro \
    --to=jamie@jamieiles.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /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.