Skip to content

Commit 50e60de

Browse files
Subbaraya Sundeepdavem330
authored andcommitted
octeontx2-af: Use separate handlers for interrupts
For PF to AF interrupt vector and VF to AF vector same interrupt handler is registered which is causing race condition. When two interrupts are raised to two CPUs at same time then two cores serve same event corrupting the data. Fixes: 7304ac4 ("octeontx2-af: Add mailbox IRQ and msg handlers") Signed-off-by: Subbaraya Sundeep <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent dfcf635 commit 50e60de

File tree

1 file changed

+14
-3
lines changed
  • drivers/net/ethernet/marvell/octeontx2/af

1 file changed

+14
-3
lines changed

drivers/net/ethernet/marvell/octeontx2/af/rvu.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2533,10 +2533,9 @@ static void rvu_queue_work(struct mbox_wq_info *mw, int first,
25332533
}
25342534
}
25352535

2536-
static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq)
2536+
static irqreturn_t rvu_mbox_pf_intr_handler(int irq, void *rvu_irq)
25372537
{
25382538
struct rvu *rvu = (struct rvu *)rvu_irq;
2539-
int vfs = rvu->vfs;
25402539
u64 intr;
25412540

25422541
intr = rvu_read64(rvu, BLKADDR_RVUM, RVU_AF_PFAF_MBOX_INT);
@@ -2550,6 +2549,18 @@ static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq)
25502549

25512550
rvu_queue_work(&rvu->afpf_wq_info, 0, rvu->hw->total_pfs, intr);
25522551

2552+
return IRQ_HANDLED;
2553+
}
2554+
2555+
static irqreturn_t rvu_mbox_intr_handler(int irq, void *rvu_irq)
2556+
{
2557+
struct rvu *rvu = (struct rvu *)rvu_irq;
2558+
int vfs = rvu->vfs;
2559+
u64 intr;
2560+
2561+
/* Sync with mbox memory region */
2562+
rmb();
2563+
25532564
/* Handle VF interrupts */
25542565
if (vfs > 64) {
25552566
intr = rvupf_read64(rvu, RVU_PF_VFPF_MBOX_INTX(1));
@@ -2894,7 +2905,7 @@ static int rvu_register_interrupts(struct rvu *rvu)
28942905
/* Register mailbox interrupt handler */
28952906
sprintf(&rvu->irq_name[RVU_AF_INT_VEC_MBOX * NAME_SIZE], "RVUAF Mbox");
28962907
ret = request_irq(pci_irq_vector(rvu->pdev, RVU_AF_INT_VEC_MBOX),
2897-
rvu_mbox_intr_handler, 0,
2908+
rvu_mbox_pf_intr_handler, 0,
28982909
&rvu->irq_name[RVU_AF_INT_VEC_MBOX * NAME_SIZE], rvu);
28992910
if (ret) {
29002911
dev_err(rvu->dev,

0 commit comments

Comments
 (0)