Re: [PATCH] irqchip: mips-gic: Fix shared interrupt mask writes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello all,

On Tuesday, 5 September 2017 11:28:46 PDT Paul Burton wrote:
> The write_gic_smask() & write_gic_rmask() functions take a shared
> interrupt number as a parameter, but we're incorrectly providing them a
> bitmask with the shared interrupt's bit set. This effectively means that
> we mask or unmask the shared interrupt 1<<n rather than shared interrupt
> n, and as a result likely drop interrupts.
> 
> Signed-off-by: Paul Burton <paul.burton@xxxxxxxxxx>
> Fixes: 68898c8765f4 ("irqchip: mips-gic: Drop gic_(re)set_mask() functions")
> Cc: Jason Cooper <jason@xxxxxxxxxxxxxx>
> Cc: Marc Zyngier <marc.zyngier@xxxxxxx>
> Cc: Ralf Baechle <ralf@xxxxxxxxxxxxxx>
> Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
> Cc: linux-mips@xxxxxxxxxxxxxx
> ---
> With Boston PCIe support & the GIC cleanup series now coming together in
> -next, this bug was uncovered by running next-20170905 on a Boston
> board, which failed to find any rootfs media due to a lack of PCIe
> interrupts. With this fix we're now able to use the Boston's SATA or MMC
> controllers :)
> 
> Ideally this would be applied as a fixup to 68898c8765f4 ("irqchip:
> mips-gic: Drop gic_(re)set_mask() functions"), but even if not it'd be
> great to get into the v4.14 MIPS pull where the breakage is introduced,
> or otherwise just ASAP - my apologies!

So this fix missed the MIPS pull - can we get it in ASAP, thorough either the 
MIPS or irqchip trees?

Thanks,
    Paul

> ---
>  drivers/irqchip/irq-mips-gic.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
> index 6e52a88bbd9e..40159ac12ac8 100644
> --- a/drivers/irqchip/irq-mips-gic.c
> +++ b/drivers/irqchip/irq-mips-gic.c
> @@ -169,7 +169,7 @@ static void gic_mask_irq(struct irq_data *d)
>  {
>  	unsigned int intr = GIC_HWIRQ_TO_SHARED(d->hwirq);
> 
> -	write_gic_rmask(BIT(intr));
> +	write_gic_rmask(intr);
>  	gic_clear_pcpu_masks(intr);
>  }
> 
> @@ -179,7 +179,7 @@ static void gic_unmask_irq(struct irq_data *d)
>  	unsigned int intr = GIC_HWIRQ_TO_SHARED(d->hwirq);
>  	unsigned int cpu;
> 
> -	write_gic_smask(BIT(intr));
> +	write_gic_smask(intr);
> 
>  	gic_clear_pcpu_masks(intr);
>  	cpu = cpumask_first_and(affinity, cpu_online_mask);
> @@ -767,7 +767,7 @@ static int __init gic_of_init(struct device_node *node,
>  	for (i = 0; i < gic_shared_intrs; i++) {
>  		change_gic_pol(i, GIC_POL_ACTIVE_HIGH);
>  		change_gic_trig(i, GIC_TRIG_LEVEL);
> -		write_gic_rmask(BIT(i));
> +		write_gic_rmask(i);
>  	}
> 
>  	for (i = 0; i < gic_vpes; i++) {

Attachment: signature.asc
Description: This is a digitally signed message part.


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux