lkml.org 
[lkml]   [2020]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 028/255] irqchip/sifive-plic: Fix chip_data access within a hierarchy
    Date
    From: Greentime Hu <greentime.hu@sifive.com>

    [ Upstream commit f9ac7bbd6e4540dcc6df621b9c9b6eb2e26ded1d ]

    The plic driver crashes in plic_irq_unmask() when the interrupt is within a
    hierarchy, as it picks the top-level chip_data instead of its local one.

    Using irq_data_get_irq_chip_data() instead of irq_get_chip_data() solves
    the issue for good.

    Fixes: f1ad1133b18f ("irqchip/sifive-plic: Add support for multiple PLICs")
    Signed-off-by: Greentime Hu <greentime.hu@sifive.com>
    [maz: rewrote commit message]
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Reviewed-by: Anup Patel <anup@brainfault.org>
    Reviewed-by: Atish Patra <atish.patra@wdc.com>
    Link: https://lore.kernel.org/r/20201029023738.127472-1-greentime.hu@sifive.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/irqchip/irq-sifive-plic.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    diff --git a/drivers/irqchip/irq-sifive-plic.c b/drivers/irqchip/irq-sifive-plic.c
    index 4048657ece0ac..6f432d2a5cebd 100644
    --- a/drivers/irqchip/irq-sifive-plic.c
    +++ b/drivers/irqchip/irq-sifive-plic.c
    @@ -99,7 +99,7 @@ static inline void plic_irq_toggle(const struct cpumask *mask,
    struct irq_data *d, int enable)
    {
    int cpu;
    - struct plic_priv *priv = irq_get_chip_data(d->irq);
    + struct plic_priv *priv = irq_data_get_irq_chip_data(d);

    writel(enable, priv->regs + PRIORITY_BASE + d->hwirq * PRIORITY_PER_ID);
    for_each_cpu(cpu, mask) {
    @@ -115,7 +115,7 @@ static void plic_irq_unmask(struct irq_data *d)
    {
    struct cpumask amask;
    unsigned int cpu;
    - struct plic_priv *priv = irq_get_chip_data(d->irq);
    + struct plic_priv *priv = irq_data_get_irq_chip_data(d);

    cpumask_and(&amask, &priv->lmask, cpu_online_mask);
    cpu = cpumask_any_and(irq_data_get_affinity_mask(d),
    @@ -127,7 +127,7 @@ static void plic_irq_unmask(struct irq_data *d)

    static void plic_irq_mask(struct irq_data *d)
    {
    - struct plic_priv *priv = irq_get_chip_data(d->irq);
    + struct plic_priv *priv = irq_data_get_irq_chip_data(d);

    plic_irq_toggle(&priv->lmask, d, 0);
    }
    @@ -138,7 +138,7 @@ static int plic_set_affinity(struct irq_data *d,
    {
    unsigned int cpu;
    struct cpumask amask;
    - struct plic_priv *priv = irq_get_chip_data(d->irq);
    + struct plic_priv *priv = irq_data_get_irq_chip_data(d);

    cpumask_and(&amask, &priv->lmask, mask_val);

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-11-17 14:39    [W:4.153 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site