linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Valentin Schneider <valentin.schneider@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>,
	Lorenzo Pieralisi <Lorenzo.Pieralisi@arm.com>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	Jason Cooper <jason@lakedaemon.net>
Subject: Re: [PATCH v2 2/2] irqchip/gic-v2, v3: Prevent SW resends entirely
Date: Thu, 30 Jul 2020 19:10:44 +0100	[thread overview]
Message-ID: <ba26464de5e82eace97924121d7bcd1d@kernel.org> (raw)
In-Reply-To: <20200730170321.31228-3-valentin.schneider@arm.com>

Hi Valentin,

On 2020-07-30 18:03, Valentin Schneider wrote:
> The GIC irqchips can now use a HW resend when a retrigger is invoked by
> check_irq_resend(). However, should the HW resend fail, 
> check_irq_resend()
> will still attempt to trigger a SW resend, which is still a bad idea 
> for
> the GICs.
> 
> Prevent this from happening by setting IRQD_HANDLE_ENFORCE_IRQCTX on 
> all
> GIC IRQs. Technically per-cpu IRQs do not need this, as their flow 
> handlers
> never set IRQS_PENDING, but this aligns all IRQs wrt context 
> enforcement:
> this also forces all GIC IRQ handling to happen in IRQ context (as 
> defined
> by in_irq()).
> 
> Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
> ---
>  drivers/irqchip/irq-gic-v3.c | 5 ++++-
>  drivers/irqchip/irq-gic.c    | 6 +++++-
>  2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-gic-v3.c 
> b/drivers/irqchip/irq-gic-v3.c
> index 0fbcbf55ec48..1a8acf7cd8ac 100644
> --- a/drivers/irqchip/irq-gic-v3.c
> +++ b/drivers/irqchip/irq-gic-v3.c
> @@ -1279,6 +1279,7 @@ static int gic_irq_domain_map(struct irq_domain
> *d, unsigned int irq,
>  			      irq_hw_number_t hw)
>  {
>  	struct irq_chip *chip = &gic_chip;
> +	struct irq_data *irqd = irq_desc_get_irq_data(irq_to_desc(irq));
> 
>  	if (static_branch_likely(&supports_deactivate_key))
>  		chip = &gic_eoimode1_chip;
> @@ -1296,7 +1297,7 @@ static int gic_irq_domain_map(struct irq_domain
> *d, unsigned int irq,
>  		irq_domain_set_info(d, irq, hw, chip, d->host_data,
>  				    handle_fasteoi_irq, NULL, NULL);
>  		irq_set_probe(irq);
> -		irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
> +		irqd_set_single_target(irqd);
>  		break;
> 
>  	case LPI_RANGE:
> @@ -1310,6 +1311,8 @@ static int gic_irq_domain_map(struct irq_domain
> *d, unsigned int irq,
>  		return -EPERM;
>  	}
> 
> +	/* Prevents SW retriggers which mess up the ACK/EOI ordering */
> +	irqd_set_handle_enforce_irqctx(irqd);
>  	return 0;
>  }
> 
> diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
> index e2b4cae88bce..a91ce1e73bd2 100644
> --- a/drivers/irqchip/irq-gic.c
> +++ b/drivers/irqchip/irq-gic.c
> @@ -983,6 +983,7 @@ static int gic_irq_domain_map(struct irq_domain
> *d, unsigned int irq,
>  				irq_hw_number_t hw)
>  {
>  	struct gic_chip_data *gic = d->host_data;
> +	struct irq_data *irqd = irq_desc_get_irq_data(irq_to_desc(irq));
> 
>  	if (hw < 32) {
>  		irq_set_percpu_devid(irq);
> @@ -992,8 +993,11 @@ static int gic_irq_domain_map(struct irq_domain
> *d, unsigned int irq,
>  		irq_domain_set_info(d, irq, hw, &gic->chip, d->host_data,
>  				    handle_fasteoi_irq, NULL, NULL);
>  		irq_set_probe(irq);
> -		irqd_set_single_target(irq_desc_get_irq_data(irq_to_desc(irq)));
> +		irqd_set_single_target(irqd);
>  	}
> +
> +	/* Prevents SW retriggers which mess up the ACK/EOI ordering */
> +	irqd_set_handle_enforce_irqctx(irqd);
>  	return 0;
>  }

I'm OK with this in principle, but this requires additional changes
in the rest of the GIC universe. The ITS driver needs to provide its own
retrigger function for LPIs (queuing an INT command), and any of the
SPI generating widgets that can be stacked on top of a GIC (GICv3-MBI,
GICv2m, and all the other Annapurna/Marvell/NVDIA wonders need to gain
directly or indirectly a call to irq_chip_retrigger_hierarchy().

We can probably avoid changing the MSI widgets by teaching the MSI
code about the HW retrigger, but a number of other non-MSI drivers
will need some help...

I'll have a look tomorrow.

Thanks,

         M.
-- 
Jazz is not dead. It just smells funny...

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2020-07-30 18:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-30 17:03 [PATCH v2 0/2] irqchip/gic-v2, v3: Enforce ACK/EOI pairing on IRQ retrigger Valentin Schneider
2020-07-30 17:03 ` [PATCH v2 1/2] irqchip/gic-v2, v3: Implement irq_chip->irq_retrigger() Valentin Schneider
2020-07-30 17:03 ` [PATCH v2 2/2] irqchip/gic-v2, v3: Prevent SW resends entirely Valentin Schneider
2020-07-30 18:10   ` Marc Zyngier [this message]
2020-07-31  0:08     ` Valentin Schneider
2020-07-31  8:08       ` Marc Zyngier
2020-07-31 11:27         ` Marc Zyngier
2020-07-31 12:11           ` Valentin Schneider

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=ba26464de5e82eace97924121d7bcd1d@kernel.org \
    --to=maz@kernel.org \
    --cc=Lorenzo.Pieralisi@arm.com \
    --cc=jason@lakedaemon.net \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=valentin.schneider@arm.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 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).