lkml.org 
[lkml]   [2022]   [Nov]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
From
SubjectRe: [PATCH 1/3] genirq: Simplify cond_unmask_eoi_irq()
Date
Samuel!

On Sat, Nov 26 2022 at 17:41, Samuel Holland wrote:

> This function calls .irq_eoi in three places, making the logic hard to
> follow. Rearrange the function so that .irq_eoi is called only once.
>
> The only time .irq_eoi is not called is when all three if checks fail,
> so return early in that case. threads_oneshot can only be nonzero if
> IRQS_ONESHOT is set, so the IRQS_ONESHOT check can be omitted there.
>
> The IRQS_ONESHOT condition from the first if statement must then be
> copied to the unmask_irq() condition.
>
> Furthermore, if IRQS_ONESHOT is set, mask_irq() must have been called
> in the parent function, so the irqd_irq_masked() check is redundant.

Not really convinced that all this is functionaly equivalent.

> static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
> {
> - if (!(desc->istate & IRQS_ONESHOT)) {
> - chip->irq_eoi(&desc->irq_data);
> + /*
> + * Do not send an EOI if the thread will do it later in
> + * unmask_threaded_irq().
> + */
> + if ((chip->flags & IRQCHIP_EOI_THREADED) && desc->threads_oneshot)
> return;
> - }
> +
> + chip->irq_eoi(&desc->irq_data);

This now issues EOI when the interrupt is in disabled state, which was
not done before. That's probably a non-issue, but clearly a undocumented
change.

> +
> /*
> * We need to unmask in the following cases:
> * - Oneshot irq which did not wake the thread (caused by a
> @@ -669,12 +674,8 @@ static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
> * completely).
> */
> if (!irqd_irq_disabled(&desc->irq_data) &&
> - irqd_irq_masked(&desc->irq_data) && !desc->threads_oneshot) {
> - chip->irq_eoi(&desc->irq_data);
> + (desc->istate & IRQS_ONESHOT) && !desc->threads_oneshot)
> unmask_irq(desc);

This breaks the mask logic of handle_fasteoi_mask_irq() for an interrupt
which does not have IRQS_ONESHOT set.

So no, it's not the same and it even breaks stuff.

Thanks,

tglx

\
 
 \ /
  Last update: 2022-11-30 15:49    [W:0.043 / U:0.452 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site