Message ID | 20240311163830.12952-1-sean.anderson@linux.dev (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [net,v5,1/2] soc: fsl: qbman: Always disable interrupts when taking cgr_lock | expand |
Hello: This series was applied to netdev/net.git (main) by David S. Miller <davem@davemloft.net>: On Mon, 11 Mar 2024 12:38:29 -0400 you wrote: > smp_call_function_single disables IRQs when executing the callback. To > prevent deadlocks, we must disable IRQs when taking cgr_lock elsewhere. > This is already done by qman_update_cgr and qman_delete_cgr; fix the > other lockers. > > Fixes: 96f413f47677 ("soc/fsl/qbman: fix issue in qman_delete_cgr_safe()") > CC: stable@vger.kernel.org > Signed-off-by: Sean Anderson <sean.anderson@linux.dev> > Reviewed-by: Camelia Groza <camelia.groza@nxp.com> > Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com> > > [...] Here is the summary with links: - [net,v5,1/2] soc: fsl: qbman: Always disable interrupts when taking cgr_lock https://git.kernel.org/netdev/net/c/584c2a9184a3 - [net,v5,2/2] soc: fsl: qbman: Use raw spinlock for cgr_lock https://git.kernel.org/netdev/net/c/fbec4e7fed89 You are awesome, thank you!
diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c index 739e4eee6b75..1bf1f1ea67f0 100644 --- a/drivers/soc/fsl/qbman/qman.c +++ b/drivers/soc/fsl/qbman/qman.c @@ -1456,11 +1456,11 @@ static void qm_congestion_task(struct work_struct *work) union qm_mc_result *mcr; struct qman_cgr *cgr; - spin_lock(&p->cgr_lock); + spin_lock_irq(&p->cgr_lock); qm_mc_start(&p->p); qm_mc_commit(&p->p, QM_MCC_VERB_QUERYCONGESTION); if (!qm_mc_result_timeout(&p->p, &mcr)) { - spin_unlock(&p->cgr_lock); + spin_unlock_irq(&p->cgr_lock); dev_crit(p->config->dev, "QUERYCONGESTION timeout\n"); qman_p_irqsource_add(p, QM_PIRQ_CSCI); return; @@ -1476,7 +1476,7 @@ static void qm_congestion_task(struct work_struct *work) list_for_each_entry(cgr, &p->cgr_cbs, node) if (cgr->cb && qman_cgrs_get(&c, cgr->cgrid)) cgr->cb(p, cgr, qman_cgrs_get(&rr, cgr->cgrid)); - spin_unlock(&p->cgr_lock); + spin_unlock_irq(&p->cgr_lock); qman_p_irqsource_add(p, QM_PIRQ_CSCI); } @@ -2440,7 +2440,7 @@ int qman_create_cgr(struct qman_cgr *cgr, u32 flags, preempt_enable(); cgr->chan = p->config->channel; - spin_lock(&p->cgr_lock); + spin_lock_irq(&p->cgr_lock); if (opts) { struct qm_mcc_initcgr local_opts = *opts; @@ -2477,7 +2477,7 @@ int qman_create_cgr(struct qman_cgr *cgr, u32 flags, qman_cgrs_get(&p->cgrs[1], cgr->cgrid)) cgr->cb(p, cgr, 1); out: - spin_unlock(&p->cgr_lock); + spin_unlock_irq(&p->cgr_lock); put_affine_portal(); return ret; }