Skip to content

Commit d9ac2d9

Browse files
Ganesh Goudardavem330
authored andcommitted
cxgb4: fix possible deadlock
t4_wr_mbox_meat_timeout() can be called from both softirq context and process context, hence protect the mbox with spin_lock_bh() instead of simple spin_lock() Signed-off-by: Ganesh Goudar <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 955ec4c commit d9ac2d9

File tree

1 file changed

+10
-10
lines changed
  • drivers/net/ethernet/chelsio/cxgb4

1 file changed

+10
-10
lines changed

drivers/net/ethernet/chelsio/cxgb4/t4_hw.c

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -317,9 +317,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
317317
* wait [for a while] till we're at the front [or bail out with an
318318
* EBUSY] ...
319319
*/
320-
spin_lock(&adap->mbox_lock);
320+
spin_lock_bh(&adap->mbox_lock);
321321
list_add_tail(&entry.list, &adap->mlist.list);
322-
spin_unlock(&adap->mbox_lock);
322+
spin_unlock_bh(&adap->mbox_lock);
323323

324324
delay_idx = 0;
325325
ms = delay[0];
@@ -332,9 +332,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
332332
*/
333333
pcie_fw = t4_read_reg(adap, PCIE_FW_A);
334334
if (i > FW_CMD_MAX_TIMEOUT || (pcie_fw & PCIE_FW_ERR_F)) {
335-
spin_lock(&adap->mbox_lock);
335+
spin_lock_bh(&adap->mbox_lock);
336336
list_del(&entry.list);
337-
spin_unlock(&adap->mbox_lock);
337+
spin_unlock_bh(&adap->mbox_lock);
338338
ret = (pcie_fw & PCIE_FW_ERR_F) ? -ENXIO : -EBUSY;
339339
t4_record_mbox(adap, cmd, size, access, ret);
340340
return ret;
@@ -365,9 +365,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
365365
for (i = 0; v == MBOX_OWNER_NONE && i < 3; i++)
366366
v = MBOWNER_G(t4_read_reg(adap, ctl_reg));
367367
if (v != MBOX_OWNER_DRV) {
368-
spin_lock(&adap->mbox_lock);
368+
spin_lock_bh(&adap->mbox_lock);
369369
list_del(&entry.list);
370-
spin_unlock(&adap->mbox_lock);
370+
spin_unlock_bh(&adap->mbox_lock);
371371
ret = (v == MBOX_OWNER_FW) ? -EBUSY : -ETIMEDOUT;
372372
t4_record_mbox(adap, cmd, size, access, ret);
373373
return ret;
@@ -418,9 +418,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
418418
execute = i + ms;
419419
t4_record_mbox(adap, cmd_rpl,
420420
MBOX_LEN, access, execute);
421-
spin_lock(&adap->mbox_lock);
421+
spin_lock_bh(&adap->mbox_lock);
422422
list_del(&entry.list);
423-
spin_unlock(&adap->mbox_lock);
423+
spin_unlock_bh(&adap->mbox_lock);
424424
return -FW_CMD_RETVAL_G((int)res);
425425
}
426426
}
@@ -430,9 +430,9 @@ int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
430430
dev_err(adap->pdev_dev, "command %#x in mailbox %d timed out\n",
431431
*(const u8 *)cmd, mbox);
432432
t4_report_fw_error(adap);
433-
spin_lock(&adap->mbox_lock);
433+
spin_lock_bh(&adap->mbox_lock);
434434
list_del(&entry.list);
435-
spin_unlock(&adap->mbox_lock);
435+
spin_unlock_bh(&adap->mbox_lock);
436436
t4_fatal_err(adap);
437437
return ret;
438438
}

0 commit comments

Comments
 (0)