* [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink
@ 2025-02-27 16:41 Nikolay Aleksandrov
2025-02-28 12:46 ` Ian Kumlien
2025-03-04 10:40 ` patchwork-bot+netdevbpf
0 siblings, 2 replies; 5+ messages in thread
From: Nikolay Aleksandrov @ 2025-02-27 16:41 UTC (permalink / raw)
To: netdev
Cc: Ajit Khaparde, Sriharsha Basavapatna, Somnath Kotur, Andrew Lunn,
davem, edumazet, Jakub Kicinski, Paolo Abeni, Nikolay Aleksandrov,
Ian Kumlien
Partially revert commit b71724147e73 ("be2net: replace polling with
sleeping in the FW completion path") w.r.t mcc mutex it introduces and the
use of usleep_range. The be2net be_ndo_bridge_getlink() callback is
called with rcu_read_lock, so this code has been broken for a long time.
Both the mutex_lock and the usleep_range can cause the issue Ian Kumlien
reported[1]. The call path is:
be_ndo_bridge_getlink -> be_cmd_get_hsw_config -> be_mcc_notify_wait ->
be_mcc_wait_compl -> usleep_range()
[1] https://lore.kernel.org/netdev/CAA85sZveppNgEVa_FD+qhOMtG_AavK9_mFiU+jWrMtXmwqefGA@mail.gmail.com/
Tested-by: Ian Kumlien <ian.kumlien@gmail.com>
Fixes: b71724147e73 ("be2net: replace polling with sleeping in the FW completion path")
Signed-off-by: Nikolay Aleksandrov <razor@blackwall.org>
---
Note I haven't included the original patch author in the CC list because
the email bounces.
drivers/net/ethernet/emulex/benet/be.h | 2 +-
drivers/net/ethernet/emulex/benet/be_cmds.c | 197 ++++++++++----------
drivers/net/ethernet/emulex/benet/be_main.c | 2 +-
3 files changed, 100 insertions(+), 101 deletions(-)
diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h
index e48b861e4ce1..270ff9aab335 100644
--- a/drivers/net/ethernet/emulex/benet/be.h
+++ b/drivers/net/ethernet/emulex/benet/be.h
@@ -562,7 +562,7 @@ struct be_adapter {
struct be_dma_mem mbox_mem_alloced;
struct be_mcc_obj mcc_obj;
- struct mutex mcc_lock; /* For serializing mcc cmds to BE card */
+ spinlock_t mcc_lock; /* For serializing mcc cmds to BE card */
spinlock_t mcc_cq_lock;
u16 cfg_num_rx_irqs; /* configured via set-channels */
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 61adcebeef01..51b8377edd1d 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -575,7 +575,7 @@ int be_process_mcc(struct be_adapter *adapter)
/* Wait till no more pending mcc requests are present */
static int be_mcc_wait_compl(struct be_adapter *adapter)
{
-#define mcc_timeout 12000 /* 12s timeout */
+#define mcc_timeout 120000 /* 12s timeout */
int i, status = 0;
struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
@@ -589,7 +589,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
if (atomic_read(&mcc_obj->q.used) == 0)
break;
- usleep_range(500, 1000);
+ udelay(100);
}
if (i == mcc_timeout) {
dev_err(&adapter->pdev->dev, "FW not responding\n");
@@ -866,7 +866,7 @@ static bool use_mcc(struct be_adapter *adapter)
static int be_cmd_lock(struct be_adapter *adapter)
{
if (use_mcc(adapter)) {
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
return 0;
} else {
return mutex_lock_interruptible(&adapter->mbox_lock);
@@ -877,7 +877,7 @@ static int be_cmd_lock(struct be_adapter *adapter)
static void be_cmd_unlock(struct be_adapter *adapter)
{
if (use_mcc(adapter))
- return mutex_unlock(&adapter->mcc_lock);
+ return spin_unlock_bh(&adapter->mcc_lock);
else
return mutex_unlock(&adapter->mbox_lock);
}
@@ -1047,7 +1047,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
struct be_cmd_req_mac_query *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1076,7 +1076,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1088,7 +1088,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
struct be_cmd_req_pmac_add *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1113,7 +1113,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST)
status = -EPERM;
@@ -1131,7 +1131,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
if (pmac_id == -1)
return 0;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1151,7 +1151,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1414,7 +1414,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
struct be_dma_mem *q_mem = &rxq->dma_mem;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1444,7 +1444,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1508,7 +1508,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
struct be_cmd_req_q_destroy *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1525,7 +1525,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
q->created = false;
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1593,7 +1593,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
struct be_cmd_req_hdr *hdr;
int status = 0;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1621,7 +1621,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
adapter->stats_cmd_sent = true;
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1637,7 +1637,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
CMD_SUBSYSTEM_ETH))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1660,7 +1660,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
adapter->stats_cmd_sent = true;
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1697,7 +1697,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
struct be_cmd_req_link_status *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
if (link_status)
*link_status = LINK_DOWN;
@@ -1736,7 +1736,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1747,7 +1747,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
struct be_cmd_req_get_cntl_addnl_attribs *req;
int status = 0;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1762,7 +1762,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter)
status = be_mcc_notify(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1811,7 +1811,7 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
if (!get_fat_cmd.va)
return -ENOMEM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
while (total_size) {
buf_size = min(total_size, (u32)60 * 1024);
@@ -1849,9 +1849,9 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
log_offset += buf_size;
}
err:
+ spin_unlock_bh(&adapter->mcc_lock);
dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size,
get_fat_cmd.va, get_fat_cmd.dma);
- mutex_unlock(&adapter->mcc_lock);
return status;
}
@@ -1862,7 +1862,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
struct be_cmd_req_get_fw_version *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1885,7 +1885,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter)
sizeof(adapter->fw_on_flash));
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1899,7 +1899,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
struct be_cmd_req_modify_eq_delay *req;
int status = 0, i;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1922,7 +1922,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter,
status = be_mcc_notify(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1949,7 +1949,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
struct be_cmd_req_vlan_config *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -1971,7 +1971,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -1982,7 +1982,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
struct be_cmd_req_rx_filter *req = mem->va;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2015,7 +2015,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2046,7 +2046,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
CMD_SUBSYSTEM_COMMON))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2066,7 +2066,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED)
return -EOPNOTSUPP;
@@ -2085,7 +2085,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
CMD_SUBSYSTEM_COMMON))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2108,7 +2108,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2189,7 +2189,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
return 0;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2214,7 +2214,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2226,7 +2226,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
struct be_cmd_req_enable_disable_beacon *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2247,7 +2247,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2258,7 +2258,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
struct be_cmd_req_get_beacon_state *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2282,7 +2282,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2306,7 +2306,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
return -ENOMEM;
}
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2328,7 +2328,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
memcpy(data, resp->page_data + off, len);
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
return status;
}
@@ -2345,7 +2345,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
void *ctxt = NULL;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
adapter->flash_status = 0;
wrb = wrb_from_mccq(adapter);
@@ -2387,7 +2387,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
if (status)
goto err_unlock;
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
msecs_to_jiffies(60000)))
@@ -2406,7 +2406,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter,
return status;
err_unlock:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2460,7 +2460,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
struct be_mcc_wrb *wrb;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2478,7 +2478,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2491,7 +2491,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
struct lancer_cmd_resp_read_object *resp;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2525,7 +2525,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
}
err_unlock:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2537,7 +2537,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
struct be_cmd_write_flashrom *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
adapter->flash_status = 0;
wrb = wrb_from_mccq(adapter);
@@ -2562,7 +2562,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
if (status)
goto err_unlock;
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
msecs_to_jiffies(40000)))
@@ -2573,7 +2573,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter,
return status;
err_unlock:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -2584,7 +2584,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
struct be_mcc_wrb *wrb;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -2611,7 +2611,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
memcpy(flashed_crc, req->crc, 4);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3217,7 +3217,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
struct be_cmd_req_acpi_wol_magic_config *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3234,7 +3234,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3249,7 +3249,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
CMD_SUBSYSTEM_LOWLEVEL))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3272,7 +3272,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
if (status)
goto err_unlock;
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
msecs_to_jiffies(SET_LB_MODE_TIMEOUT)))
@@ -3281,7 +3281,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
return status;
err_unlock:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3298,7 +3298,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
CMD_SUBSYSTEM_LOWLEVEL))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3324,7 +3324,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
if (status)
goto err;
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
wait_for_completion(&adapter->et_cmd_compl);
resp = embedded_payload(wrb);
@@ -3332,7 +3332,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
return status;
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3348,7 +3348,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
CMD_SUBSYSTEM_LOWLEVEL))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3382,7 +3382,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3393,7 +3393,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
struct be_cmd_req_seeprom_read *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3409,7 +3409,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3424,7 +3424,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
CMD_SUBSYSTEM_COMMON))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3469,7 +3469,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter)
}
dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3479,7 +3479,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
struct be_cmd_req_set_qos *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3499,7 +3499,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3611,7 +3611,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
struct be_cmd_req_get_fn_privileges *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3643,7 +3643,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3655,7 +3655,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
struct be_cmd_req_set_fn_privileges *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3675,7 +3675,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3707,7 +3707,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
return -ENOMEM;
}
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3771,7 +3771,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
}
out:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
dma_free_coherent(&adapter->pdev->dev, get_mac_list_cmd.size,
get_mac_list_cmd.va, get_mac_list_cmd.dma);
return status;
@@ -3831,7 +3831,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
if (!cmd.va)
return -ENOMEM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3853,7 +3853,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
err:
dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3889,7 +3889,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
CMD_SUBSYSTEM_COMMON))
return -EPERM;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3930,7 +3930,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -3944,7 +3944,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
int status;
u16 vid;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -3991,7 +3991,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -4190,7 +4190,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
struct be_cmd_req_set_ext_fat_caps *req;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -4206,7 +4206,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -4684,7 +4684,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
if (iface == 0xFFFFFFFF)
return -1;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -4701,7 +4701,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -4735,7 +4735,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
struct be_cmd_resp_get_iface_list *resp;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -4756,7 +4756,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
}
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -4850,7 +4850,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
if (BEx_chip(adapter))
return 0;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -4868,7 +4868,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
req->enable = 1;
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -4941,7 +4941,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter,
u32 link_config = 0;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -4969,7 +4969,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter,
status = be_mcc_notify_wait(adapter);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -5000,8 +5000,7 @@ int be_cmd_set_features(struct be_adapter *adapter)
struct be_mcc_wrb *wrb;
int status;
- if (mutex_lock_interruptible(&adapter->mcc_lock))
- return -1;
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -5039,7 +5038,7 @@ int be_cmd_set_features(struct be_adapter *adapter)
dev_info(&adapter->pdev->dev,
"Adapter does not support HW error recovery\n");
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
@@ -5053,7 +5052,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
struct be_cmd_resp_hdr *resp;
int status;
- mutex_lock(&adapter->mcc_lock);
+ spin_lock_bh(&adapter->mcc_lock);
wrb = wrb_from_mccq(adapter);
if (!wrb) {
@@ -5076,7 +5075,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length);
be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length);
err:
- mutex_unlock(&adapter->mcc_lock);
+ spin_unlock_bh(&adapter->mcc_lock);
return status;
}
EXPORT_SYMBOL(be_roce_mcc_cmd);
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 875fe379eea2..3d2e21592119 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -5667,8 +5667,8 @@ static int be_drv_init(struct be_adapter *adapter)
}
mutex_init(&adapter->mbox_lock);
- mutex_init(&adapter->mcc_lock);
mutex_init(&adapter->rx_filter_lock);
+ spin_lock_init(&adapter->mcc_lock);
spin_lock_init(&adapter->mcc_cq_lock);
init_completion(&adapter->et_cmd_compl);
--
2.48.1
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink 2025-02-27 16:41 [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink Nikolay Aleksandrov @ 2025-02-28 12:46 ` Ian Kumlien 2025-02-28 12:49 ` Nikolay Aleksandrov 2025-03-04 10:40 ` patchwork-bot+netdevbpf 1 sibling, 1 reply; 5+ messages in thread From: Ian Kumlien @ 2025-02-28 12:46 UTC (permalink / raw) To: Nikolay Aleksandrov Cc: netdev, Ajit Khaparde, Sriharsha Basavapatna, Somnath Kotur, Andrew Lunn, davem, edumazet, Jakub Kicinski, Paolo Abeni Actually, while you might already have realized this, I didn't quite understand how important this fix seems to be.... From another machine i found this: [lör feb 22 23:46:32 2025] mlx5_core 0000:02:00.1 enp2s0f1np1: hw csum failure [lör feb 22 23:46:32 2025] skb len=2488 headroom=78 headlen=1480 tailroom=0 mac=(64,14) mac_len=14 net=(78,20) trans=98 shinfo(txflags=0 nr_frags=0 gso(size=1452 type=393216 segs=2)) csum(0x2baef95d start=63837 offset=11182 ip_summed=2 complete_sw=0 valid=0 level=0) hash(0xb9a84019 sw=0 l4=1) proto=0x0800 pkttype=0 iif=8 priority=0x0 mark=0x0 alloc_cpu=1 vlan_all=0x0 encapsulation=0 inner(proto=0x0000, mac=0, net=0, trans=0) [lör feb 22 23:46:32 2025] dev name=enp2s0f1np1 feat=0x0e12a1c21cd14ba9 And: [lör feb 22 23:46:33 2025] skb fraglist: [lör feb 22 23:46:33 2025] skb len=1008 headroom=106 headlen=1008 tailroom=38 mac=(64,14) mac_len=14 net=(78,20) trans=98 shinfo(txflags=0 nr_frags=0 gso(size=0 type=0 segs=0)) csum(0x86f9 start=34553 offset=0 ip_summed=2 complete_sw=0 valid=0 level=0) hash(0xb9a84019 sw=0 l4=1) proto=0x0800 pkttype=0 iif=0 priority=0x0 mark=0x0 alloc_cpu=1 vlan_all=0x0 encapsulation=0 inner(proto=0x0000, mac=0, net=0, trans=0) [lör feb 22 23:46:33 2025] dev name=enp2s0f1np1 feat=0x0e12a1c21cd14ba9 Including: [lör feb 22 23:46:34 2025] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 6.13.4 #449 [lör feb 22 23:46:34 2025] Hardware name: Supermicro Super Server/A2SDi-12C-HLN4F, BIOS 1.9a 12/25/2023 [lör feb 22 23:46:34 2025] Call Trace: [lör feb 22 23:46:34 2025] <IRQ> [lör feb 22 23:46:34 2025] dump_stack_lvl+0x47/0x70 [lör feb 22 23:46:34 2025] __skb_checksum_complete+0xda/0xf0 [lör feb 22 23:46:34 2025] ? __pfx_csum_partial_ext+0x10/0x10 [lör feb 22 23:46:34 2025] ? __pfx_csum_block_add_ext+0x10/0x10 [lör feb 22 23:46:34 2025] nf_conntrack_udp_packet+0x171/0x260 [lör feb 22 23:46:34 2025] nf_conntrack_in+0x391/0x590 [lör feb 22 23:46:34 2025] nf_hook_slow+0x3c/0xf0 [lör feb 22 23:46:34 2025] nf_hook_slow_list+0x70/0xf0 [lör feb 22 23:46:34 2025] ip_sublist_rcv+0x1ee/0x200 [lör feb 22 23:46:34 2025] ? __pfx_ip_rcv_finish+0x10/0x10 [lör feb 22 23:46:34 2025] ip_list_rcv+0xf8/0x130 [lör feb 22 23:46:34 2025] __netif_receive_skb_list_core+0x24c/0x270 [lör feb 22 23:46:34 2025] netif_receive_skb_list_internal+0x18f/0x2b0 [lör feb 22 23:46:34 2025] ? mlx5e_handle_rx_cqe_mpwrq+0x116/0x210 [lör feb 22 23:46:34 2025] napi_complete_done+0x65/0x260 [lör feb 22 23:46:34 2025] mlx5e_napi_poll+0x172/0x760 [lör feb 22 23:46:34 2025] __napi_poll+0x26/0x160 [lör feb 22 23:46:34 2025] net_rx_action+0x173/0x300 [lör feb 22 23:46:34 2025] ? notifier_call_chain+0x54/0xc0 [lör feb 22 23:46:34 2025] ? atomic_notifier_call_chain+0x30/0x40 [lör feb 22 23:46:34 2025] handle_softirqs+0xcd/0x270 [lör feb 22 23:46:34 2025] irq_exit_rcu+0x85/0xa0 [lör feb 22 23:46:34 2025] common_interrupt+0x81/0xa0 [lör feb 22 23:46:34 2025] </IRQ> [lör feb 22 23:46:34 2025] <TASK> [lör feb 22 23:46:34 2025] asm_common_interrupt+0x22/0x40 [lör feb 22 23:46:34 2025] RIP: 0010:cpuidle_enter_state+0xbc/0x430 [lör feb 22 23:46:34 2025] Code: 77 02 00 00 e8 65 31 ec fe e8 60 f8 ff ff 49 89 c5 0f 1f 44 00 00 31 ff e8 a1 68 eb fe 45 84 ff 0f 85 49 02 00 00 fb 45 85 f6 <0f> 88 8d 01 00 00 49 63 ce 4c 8b 14 24 48 8d 04 49 48 8d 14 81 48 [lör feb 22 23:46:34 2025] RSP: 0018:ffffb504000b7e88 EFLAGS: 00000202 [lör feb 22 23:46:34 2025] RAX: ffff9c0a2fa40000 RBX: ffff9c0a2fa76e60 RCX: 0000000000000000 [lör feb 22 23:46:34 2025] RDX: 0000252e1dcfee30 RSI: fffffff3c1a65ecc RDI: 0000000000000000 [lör feb 22 23:46:34 2025] RBP: 0000000000000002 R08: 0000000000000000 R09: 00000000000001f6 [lör feb 22 23:46:34 2025] R10: 0000000000000018 R11: ffff9c0a2fa6c3ac R12: ffffffffaac2de60 [lör feb 22 23:46:34 2025] R13: 0000252e1dcfee30 R14: 0000000000000002 R15: 0000000000000000 [lör feb 22 23:46:34 2025] ? cpuidle_enter_state+0xaf/0x430 [lör feb 22 23:46:34 2025] cpuidle_enter+0x24/0x40 [lör feb 22 23:46:34 2025] do_idle+0x16e/0x1b0 [lör feb 22 23:46:34 2025] cpu_startup_entry+0x20/0x30 [lör feb 22 23:46:34 2025] start_secondary+0xf3/0x100 [lör feb 22 23:46:34 2025] common_startup_64+0x13e/0x148 [lör feb 22 23:46:34 2025] </TASK> --- Asking gemini for help identified the machine in the basement as the culprit - so it seems like it could send corrupt data - i haven't had a closer look though On Thu, Feb 27, 2025 at 5:41 PM Nikolay Aleksandrov <razor@blackwall.org> wrote: > > Partially revert commit b71724147e73 ("be2net: replace polling with > sleeping in the FW completion path") w.r.t mcc mutex it introduces and the > use of usleep_range. The be2net be_ndo_bridge_getlink() callback is > called with rcu_read_lock, so this code has been broken for a long time. > Both the mutex_lock and the usleep_range can cause the issue Ian Kumlien > reported[1]. The call path is: > be_ndo_bridge_getlink -> be_cmd_get_hsw_config -> be_mcc_notify_wait -> > be_mcc_wait_compl -> usleep_range() > > [1] https://lore.kernel.org/netdev/CAA85sZveppNgEVa_FD+qhOMtG_AavK9_mFiU+jWrMtXmwqefGA@mail.gmail.com/ > > Tested-by: Ian Kumlien <ian.kumlien@gmail.com> > Fixes: b71724147e73 ("be2net: replace polling with sleeping in the FW completion path") > Signed-off-by: Nikolay Aleksandrov <razor@blackwall.org> > --- > Note I haven't included the original patch author in the CC list because > the email bounces. > > drivers/net/ethernet/emulex/benet/be.h | 2 +- > drivers/net/ethernet/emulex/benet/be_cmds.c | 197 ++++++++++---------- > drivers/net/ethernet/emulex/benet/be_main.c | 2 +- > 3 files changed, 100 insertions(+), 101 deletions(-) > > diff --git a/drivers/net/ethernet/emulex/benet/be.h b/drivers/net/ethernet/emulex/benet/be.h > index e48b861e4ce1..270ff9aab335 100644 > --- a/drivers/net/ethernet/emulex/benet/be.h > +++ b/drivers/net/ethernet/emulex/benet/be.h > @@ -562,7 +562,7 @@ struct be_adapter { > struct be_dma_mem mbox_mem_alloced; > > struct be_mcc_obj mcc_obj; > - struct mutex mcc_lock; /* For serializing mcc cmds to BE card */ > + spinlock_t mcc_lock; /* For serializing mcc cmds to BE card */ > spinlock_t mcc_cq_lock; > > u16 cfg_num_rx_irqs; /* configured via set-channels */ > diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c > index 61adcebeef01..51b8377edd1d 100644 > --- a/drivers/net/ethernet/emulex/benet/be_cmds.c > +++ b/drivers/net/ethernet/emulex/benet/be_cmds.c > @@ -575,7 +575,7 @@ int be_process_mcc(struct be_adapter *adapter) > /* Wait till no more pending mcc requests are present */ > static int be_mcc_wait_compl(struct be_adapter *adapter) > { > -#define mcc_timeout 12000 /* 12s timeout */ > +#define mcc_timeout 120000 /* 12s timeout */ > int i, status = 0; > struct be_mcc_obj *mcc_obj = &adapter->mcc_obj; > > @@ -589,7 +589,7 @@ static int be_mcc_wait_compl(struct be_adapter *adapter) > > if (atomic_read(&mcc_obj->q.used) == 0) > break; > - usleep_range(500, 1000); > + udelay(100); > } > if (i == mcc_timeout) { > dev_err(&adapter->pdev->dev, "FW not responding\n"); > @@ -866,7 +866,7 @@ static bool use_mcc(struct be_adapter *adapter) > static int be_cmd_lock(struct be_adapter *adapter) > { > if (use_mcc(adapter)) { > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > return 0; > } else { > return mutex_lock_interruptible(&adapter->mbox_lock); > @@ -877,7 +877,7 @@ static int be_cmd_lock(struct be_adapter *adapter) > static void be_cmd_unlock(struct be_adapter *adapter) > { > if (use_mcc(adapter)) > - return mutex_unlock(&adapter->mcc_lock); > + return spin_unlock_bh(&adapter->mcc_lock); > else > return mutex_unlock(&adapter->mbox_lock); > } > @@ -1047,7 +1047,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, > struct be_cmd_req_mac_query *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1076,7 +1076,7 @@ int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1088,7 +1088,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr, > struct be_cmd_req_pmac_add *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1113,7 +1113,7 @@ int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > > if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST) > status = -EPERM; > @@ -1131,7 +1131,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom) > if (pmac_id == -1) > return 0; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1151,7 +1151,7 @@ int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom) > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1414,7 +1414,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter, > struct be_dma_mem *q_mem = &rxq->dma_mem; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1444,7 +1444,7 @@ int be_cmd_rxq_create(struct be_adapter *adapter, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1508,7 +1508,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q) > struct be_cmd_req_q_destroy *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1525,7 +1525,7 @@ int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q) > q->created = false; > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1593,7 +1593,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) > struct be_cmd_req_hdr *hdr; > int status = 0; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1621,7 +1621,7 @@ int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd) > adapter->stats_cmd_sent = true; > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1637,7 +1637,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter, > CMD_SUBSYSTEM_ETH)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1660,7 +1660,7 @@ int lancer_cmd_get_pport_stats(struct be_adapter *adapter, > adapter->stats_cmd_sent = true; > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1697,7 +1697,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed, > struct be_cmd_req_link_status *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > if (link_status) > *link_status = LINK_DOWN; > @@ -1736,7 +1736,7 @@ int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1747,7 +1747,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter) > struct be_cmd_req_get_cntl_addnl_attribs *req; > int status = 0; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1762,7 +1762,7 @@ int be_cmd_get_die_temperature(struct be_adapter *adapter) > > status = be_mcc_notify(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1811,7 +1811,7 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf) > if (!get_fat_cmd.va) > return -ENOMEM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > while (total_size) { > buf_size = min(total_size, (u32)60 * 1024); > @@ -1849,9 +1849,9 @@ int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf) > log_offset += buf_size; > } > err: > + spin_unlock_bh(&adapter->mcc_lock); > dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size, > get_fat_cmd.va, get_fat_cmd.dma); > - mutex_unlock(&adapter->mcc_lock); > return status; > } > > @@ -1862,7 +1862,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter) > struct be_cmd_req_get_fw_version *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1885,7 +1885,7 @@ int be_cmd_get_fw_ver(struct be_adapter *adapter) > sizeof(adapter->fw_on_flash)); > } > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1899,7 +1899,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter, > struct be_cmd_req_modify_eq_delay *req; > int status = 0, i; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1922,7 +1922,7 @@ static int __be_cmd_modify_eqd(struct be_adapter *adapter, > > status = be_mcc_notify(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1949,7 +1949,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, > struct be_cmd_req_vlan_config *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -1971,7 +1971,7 @@ int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array, > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -1982,7 +1982,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value) > struct be_cmd_req_rx_filter *req = mem->va; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2015,7 +2015,7 @@ static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value) > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2046,7 +2046,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc) > CMD_SUBSYSTEM_COMMON)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2066,7 +2066,7 @@ int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc) > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > > if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED) > return -EOPNOTSUPP; > @@ -2085,7 +2085,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc) > CMD_SUBSYSTEM_COMMON)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2108,7 +2108,7 @@ int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc) > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2189,7 +2189,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, > if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS)) > return 0; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2214,7 +2214,7 @@ int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable, > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2226,7 +2226,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num, > struct be_cmd_req_enable_disable_beacon *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2247,7 +2247,7 @@ int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num, > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2258,7 +2258,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state) > struct be_cmd_req_get_beacon_state *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2282,7 +2282,7 @@ int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state) > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2306,7 +2306,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter, > return -ENOMEM; > } > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2328,7 +2328,7 @@ int be_cmd_read_port_transceiver_data(struct be_adapter *adapter, > memcpy(data, resp->page_data + off, len); > } > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); > return status; > } > @@ -2345,7 +2345,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter, > void *ctxt = NULL; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > adapter->flash_status = 0; > > wrb = wrb_from_mccq(adapter); > @@ -2387,7 +2387,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter, > if (status) > goto err_unlock; > > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > > if (!wait_for_completion_timeout(&adapter->et_cmd_compl, > msecs_to_jiffies(60000))) > @@ -2406,7 +2406,7 @@ static int lancer_cmd_write_object(struct be_adapter *adapter, > return status; > > err_unlock: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2460,7 +2460,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter, > struct be_mcc_wrb *wrb; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2478,7 +2478,7 @@ static int lancer_cmd_delete_object(struct be_adapter *adapter, > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2491,7 +2491,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd, > struct lancer_cmd_resp_read_object *resp; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2525,7 +2525,7 @@ int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd, > } > > err_unlock: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2537,7 +2537,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter, > struct be_cmd_write_flashrom *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > adapter->flash_status = 0; > > wrb = wrb_from_mccq(adapter); > @@ -2562,7 +2562,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter, > if (status) > goto err_unlock; > > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > > if (!wait_for_completion_timeout(&adapter->et_cmd_compl, > msecs_to_jiffies(40000))) > @@ -2573,7 +2573,7 @@ static int be_cmd_write_flashrom(struct be_adapter *adapter, > return status; > > err_unlock: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -2584,7 +2584,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc, > struct be_mcc_wrb *wrb; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -2611,7 +2611,7 @@ static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc, > memcpy(flashed_crc, req->crc, 4); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3217,7 +3217,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac, > struct be_cmd_req_acpi_wol_magic_config *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3234,7 +3234,7 @@ int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac, > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3249,7 +3249,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, > CMD_SUBSYSTEM_LOWLEVEL)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3272,7 +3272,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, > if (status) > goto err_unlock; > > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > > if (!wait_for_completion_timeout(&adapter->et_cmd_compl, > msecs_to_jiffies(SET_LB_MODE_TIMEOUT))) > @@ -3281,7 +3281,7 @@ int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num, > return status; > > err_unlock: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3298,7 +3298,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, > CMD_SUBSYSTEM_LOWLEVEL)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3324,7 +3324,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, > if (status) > goto err; > > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > > wait_for_completion(&adapter->et_cmd_compl); > resp = embedded_payload(wrb); > @@ -3332,7 +3332,7 @@ int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num, > > return status; > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3348,7 +3348,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern, > CMD_SUBSYSTEM_LOWLEVEL)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3382,7 +3382,7 @@ int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3393,7 +3393,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter, > struct be_cmd_req_seeprom_read *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3409,7 +3409,7 @@ int be_cmd_get_seeprom_data(struct be_adapter *adapter, > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3424,7 +3424,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter) > CMD_SUBSYSTEM_COMMON)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3469,7 +3469,7 @@ int be_cmd_get_phy_info(struct be_adapter *adapter) > } > dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3479,7 +3479,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain) > struct be_cmd_req_set_qos *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3499,7 +3499,7 @@ static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain) > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3611,7 +3611,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege, > struct be_cmd_req_get_fn_privileges *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3643,7 +3643,7 @@ int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3655,7 +3655,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges, > struct be_cmd_req_set_fn_privileges *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3675,7 +3675,7 @@ int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges, > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3707,7 +3707,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, > return -ENOMEM; > } > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3771,7 +3771,7 @@ int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac, > } > > out: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > dma_free_coherent(&adapter->pdev->dev, get_mac_list_cmd.size, > get_mac_list_cmd.va, get_mac_list_cmd.dma); > return status; > @@ -3831,7 +3831,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, > if (!cmd.va) > return -ENOMEM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3853,7 +3853,7 @@ int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array, > > err: > dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma); > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3889,7 +3889,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, > CMD_SUBSYSTEM_COMMON)) > return -EPERM; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3930,7 +3930,7 @@ int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid, > status = be_mcc_notify_wait(adapter); > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -3944,7 +3944,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, > int status; > u16 vid; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -3991,7 +3991,7 @@ int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -4190,7 +4190,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, > struct be_cmd_req_set_ext_fat_caps *req; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -4206,7 +4206,7 @@ int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter, > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -4684,7 +4684,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op) > if (iface == 0xFFFFFFFF) > return -1; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -4701,7 +4701,7 @@ int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op) > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -4735,7 +4735,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg, > struct be_cmd_resp_get_iface_list *resp; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -4756,7 +4756,7 @@ int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg, > } > > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -4850,7 +4850,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain) > if (BEx_chip(adapter)) > return 0; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -4868,7 +4868,7 @@ int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain) > req->enable = 1; > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -4941,7 +4941,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter, > u32 link_config = 0; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -4969,7 +4969,7 @@ __be_cmd_set_logical_link_config(struct be_adapter *adapter, > > status = be_mcc_notify_wait(adapter); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -5000,8 +5000,7 @@ int be_cmd_set_features(struct be_adapter *adapter) > struct be_mcc_wrb *wrb; > int status; > > - if (mutex_lock_interruptible(&adapter->mcc_lock)) > - return -1; > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -5039,7 +5038,7 @@ int be_cmd_set_features(struct be_adapter *adapter) > dev_info(&adapter->pdev->dev, > "Adapter does not support HW error recovery\n"); > > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > > @@ -5053,7 +5052,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload, > struct be_cmd_resp_hdr *resp; > int status; > > - mutex_lock(&adapter->mcc_lock); > + spin_lock_bh(&adapter->mcc_lock); > > wrb = wrb_from_mccq(adapter); > if (!wrb) { > @@ -5076,7 +5075,7 @@ int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload, > memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length); > be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length); > err: > - mutex_unlock(&adapter->mcc_lock); > + spin_unlock_bh(&adapter->mcc_lock); > return status; > } > EXPORT_SYMBOL(be_roce_mcc_cmd); > diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c > index 875fe379eea2..3d2e21592119 100644 > --- a/drivers/net/ethernet/emulex/benet/be_main.c > +++ b/drivers/net/ethernet/emulex/benet/be_main.c > @@ -5667,8 +5667,8 @@ static int be_drv_init(struct be_adapter *adapter) > } > > mutex_init(&adapter->mbox_lock); > - mutex_init(&adapter->mcc_lock); > mutex_init(&adapter->rx_filter_lock); > + spin_lock_init(&adapter->mcc_lock); > spin_lock_init(&adapter->mcc_cq_lock); > init_completion(&adapter->et_cmd_compl); > > -- > 2.48.1 > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink 2025-02-28 12:46 ` Ian Kumlien @ 2025-02-28 12:49 ` Nikolay Aleksandrov 2025-02-28 12:55 ` Ian Kumlien 0 siblings, 1 reply; 5+ messages in thread From: Nikolay Aleksandrov @ 2025-02-28 12:49 UTC (permalink / raw) To: Ian Kumlien Cc: netdev, Ajit Khaparde, Sriharsha Basavapatna, Somnath Kotur, Andrew Lunn, davem, edumazet, Jakub Kicinski, Paolo Abeni On 2/28/25 14:46, Ian Kumlien wrote: > Actually, while you might already have realized this, I didn't quite > understand how important this fix seems to be.... > You mean the be2net would send broken packets to this other machine with mlx5 card? Or did I misunderstand you? > From another machine i found this: > [lör feb 22 23:46:32 2025] mlx5_core 0000:02:00.1 enp2s0f1np1: hw csum failure > [lör feb 22 23:46:32 2025] skb len=2488 headroom=78 headlen=1480 tailroom=0 > mac=(64,14) mac_len=14 net=(78,20) trans=98 > shinfo(txflags=0 nr_frags=0 gso(size=1452 > type=393216 segs=2)) > csum(0x2baef95d start=63837 offset=11182 > ip_summed=2 complete_sw=0 valid=0 level=0) > hash(0xb9a84019 sw=0 l4=1) proto=0x0800 > pkttype=0 iif=8 > priority=0x0 mark=0x0 alloc_cpu=1 vlan_all=0x0 > encapsulation=0 inner(proto=0x0000, mac=0, > net=0, trans=0) > [lör feb 22 23:46:32 2025] dev name=enp2s0f1np1 feat=0x0e12a1c21cd14ba9 > > And: > [lör feb 22 23:46:33 2025] skb fraglist: > [lör feb 22 23:46:33 2025] skb len=1008 headroom=106 headlen=1008 tailroom=38 > mac=(64,14) mac_len=14 net=(78,20) trans=98 > shinfo(txflags=0 nr_frags=0 gso(size=0 > type=0 segs=0)) > csum(0x86f9 start=34553 offset=0 > ip_summed=2 complete_sw=0 valid=0 level=0) > hash(0xb9a84019 sw=0 l4=1) proto=0x0800 > pkttype=0 iif=0 > priority=0x0 mark=0x0 alloc_cpu=1 vlan_all=0x0 > encapsulation=0 inner(proto=0x0000, mac=0, > net=0, trans=0) > [lör feb 22 23:46:33 2025] dev name=enp2s0f1np1 feat=0x0e12a1c21cd14ba9 > > Including: > [lör feb 22 23:46:34 2025] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not > tainted 6.13.4 #449 > [lör feb 22 23:46:34 2025] Hardware name: Supermicro Super > Server/A2SDi-12C-HLN4F, BIOS 1.9a 12/25/2023 > [lör feb 22 23:46:34 2025] Call Trace: > [lör feb 22 23:46:34 2025] <IRQ> > [lör feb 22 23:46:34 2025] dump_stack_lvl+0x47/0x70 > [lör feb 22 23:46:34 2025] __skb_checksum_complete+0xda/0xf0 > [lör feb 22 23:46:34 2025] ? __pfx_csum_partial_ext+0x10/0x10 > [lör feb 22 23:46:34 2025] ? __pfx_csum_block_add_ext+0x10/0x10 > [lör feb 22 23:46:34 2025] nf_conntrack_udp_packet+0x171/0x260 > [lör feb 22 23:46:34 2025] nf_conntrack_in+0x391/0x590 > [lör feb 22 23:46:34 2025] nf_hook_slow+0x3c/0xf0 > [lör feb 22 23:46:34 2025] nf_hook_slow_list+0x70/0xf0 > [lör feb 22 23:46:34 2025] ip_sublist_rcv+0x1ee/0x200 > [lör feb 22 23:46:34 2025] ? __pfx_ip_rcv_finish+0x10/0x10 > [lör feb 22 23:46:34 2025] ip_list_rcv+0xf8/0x130 > [lör feb 22 23:46:34 2025] __netif_receive_skb_list_core+0x24c/0x270 > [lör feb 22 23:46:34 2025] netif_receive_skb_list_internal+0x18f/0x2b0 > [lör feb 22 23:46:34 2025] ? mlx5e_handle_rx_cqe_mpwrq+0x116/0x210 > [lör feb 22 23:46:34 2025] napi_complete_done+0x65/0x260 > [lör feb 22 23:46:34 2025] mlx5e_napi_poll+0x172/0x760 > [lör feb 22 23:46:34 2025] __napi_poll+0x26/0x160 > [lör feb 22 23:46:34 2025] net_rx_action+0x173/0x300 > [lör feb 22 23:46:34 2025] ? notifier_call_chain+0x54/0xc0 > [lör feb 22 23:46:34 2025] ? atomic_notifier_call_chain+0x30/0x40 > [lör feb 22 23:46:34 2025] handle_softirqs+0xcd/0x270 > [lör feb 22 23:46:34 2025] irq_exit_rcu+0x85/0xa0 > [lör feb 22 23:46:34 2025] common_interrupt+0x81/0xa0 > [lör feb 22 23:46:34 2025] </IRQ> > [lör feb 22 23:46:34 2025] <TASK> > [lör feb 22 23:46:34 2025] asm_common_interrupt+0x22/0x40 > [lör feb 22 23:46:34 2025] RIP: 0010:cpuidle_enter_state+0xbc/0x430 > [lör feb 22 23:46:34 2025] Code: 77 02 00 00 e8 65 31 ec fe e8 60 f8 > ff ff 49 89 c5 0f 1f 44 00 00 31 ff e8 a1 68 eb fe 45 84 ff 0f 85 49 > 02 00 00 fb 45 85 f6 <0f> 88 8d 01 00 00 49 63 ce 4c 8b 14 24 48 8d 04 > 49 48 8d 14 81 48 > [lör feb 22 23:46:34 2025] RSP: 0018:ffffb504000b7e88 EFLAGS: 00000202 > [lör feb 22 23:46:34 2025] RAX: ffff9c0a2fa40000 RBX: ffff9c0a2fa76e60 > RCX: 0000000000000000 > [lör feb 22 23:46:34 2025] RDX: 0000252e1dcfee30 RSI: fffffff3c1a65ecc > RDI: 0000000000000000 > [lör feb 22 23:46:34 2025] RBP: 0000000000000002 R08: 0000000000000000 > R09: 00000000000001f6 > [lör feb 22 23:46:34 2025] R10: 0000000000000018 R11: ffff9c0a2fa6c3ac > R12: ffffffffaac2de60 > [lör feb 22 23:46:34 2025] R13: 0000252e1dcfee30 R14: 0000000000000002 > R15: 0000000000000000 > [lör feb 22 23:46:34 2025] ? cpuidle_enter_state+0xaf/0x430 > [lör feb 22 23:46:34 2025] cpuidle_enter+0x24/0x40 > [lör feb 22 23:46:34 2025] do_idle+0x16e/0x1b0 > [lör feb 22 23:46:34 2025] cpu_startup_entry+0x20/0x30 > [lör feb 22 23:46:34 2025] start_secondary+0xf3/0x100 > [lör feb 22 23:46:34 2025] common_startup_64+0x13e/0x148 > [lör feb 22 23:46:34 2025] </TASK> > --- > > Asking gemini for help identified the machine in the basement as the > culprit - so it seems like it could send corrupt data - i haven't had > a closer look though > Interesting. :) > On Thu, Feb 27, 2025 at 5:41 PM Nikolay Aleksandrov <razor@blackwall.org> wrote: >> ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink 2025-02-28 12:49 ` Nikolay Aleksandrov @ 2025-02-28 12:55 ` Ian Kumlien 0 siblings, 0 replies; 5+ messages in thread From: Ian Kumlien @ 2025-02-28 12:55 UTC (permalink / raw) To: Nikolay Aleksandrov Cc: netdev, Ajit Khaparde, Sriharsha Basavapatna, Somnath Kotur, Andrew Lunn, davem, edumazet, Jakub Kicinski, Paolo Abeni On Fri, Feb 28, 2025 at 1:49 PM Nikolay Aleksandrov <razor@blackwall.org> wrote: > > On 2/28/25 14:46, Ian Kumlien wrote: > > Actually, while you might already have realized this, I didn't quite > > understand how important this fix seems to be.... > > > > You mean the be2net would send broken packets to this other machine with mlx5 card? > Or did I misunderstand you? That is correct, UDP so I assume it's the wireguard tunnel... > > From another machine i found this: > > [lör feb 22 23:46:32 2025] mlx5_core 0000:02:00.1 enp2s0f1np1: hw csum failure > > [lör feb 22 23:46:32 2025] skb len=2488 headroom=78 headlen=1480 tailroom=0 > > mac=(64,14) mac_len=14 net=(78,20) trans=98 > > shinfo(txflags=0 nr_frags=0 gso(size=1452 > > type=393216 segs=2)) > > csum(0x2baef95d start=63837 offset=11182 > > ip_summed=2 complete_sw=0 valid=0 level=0) > > hash(0xb9a84019 sw=0 l4=1) proto=0x0800 > > pkttype=0 iif=8 > > priority=0x0 mark=0x0 alloc_cpu=1 vlan_all=0x0 > > encapsulation=0 inner(proto=0x0000, mac=0, > > net=0, trans=0) > > [lör feb 22 23:46:32 2025] dev name=enp2s0f1np1 feat=0x0e12a1c21cd14ba9 > > > > And: > > [lör feb 22 23:46:33 2025] skb fraglist: > > [lör feb 22 23:46:33 2025] skb len=1008 headroom=106 headlen=1008 tailroom=38 > > mac=(64,14) mac_len=14 net=(78,20) trans=98 > > shinfo(txflags=0 nr_frags=0 gso(size=0 > > type=0 segs=0)) > > csum(0x86f9 start=34553 offset=0 > > ip_summed=2 complete_sw=0 valid=0 level=0) > > hash(0xb9a84019 sw=0 l4=1) proto=0x0800 > > pkttype=0 iif=0 > > priority=0x0 mark=0x0 alloc_cpu=1 vlan_all=0x0 > > encapsulation=0 inner(proto=0x0000, mac=0, > > net=0, trans=0) > > [lör feb 22 23:46:33 2025] dev name=enp2s0f1np1 feat=0x0e12a1c21cd14ba9 > > > > Including: > > [lör feb 22 23:46:34 2025] CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not > > tainted 6.13.4 #449 > > [lör feb 22 23:46:34 2025] Hardware name: Supermicro Super > > Server/A2SDi-12C-HLN4F, BIOS 1.9a 12/25/2023 > > [lör feb 22 23:46:34 2025] Call Trace: > > [lör feb 22 23:46:34 2025] <IRQ> > > [lör feb 22 23:46:34 2025] dump_stack_lvl+0x47/0x70 > > [lör feb 22 23:46:34 2025] __skb_checksum_complete+0xda/0xf0 > > [lör feb 22 23:46:34 2025] ? __pfx_csum_partial_ext+0x10/0x10 > > [lör feb 22 23:46:34 2025] ? __pfx_csum_block_add_ext+0x10/0x10 > > [lör feb 22 23:46:34 2025] nf_conntrack_udp_packet+0x171/0x260 > > [lör feb 22 23:46:34 2025] nf_conntrack_in+0x391/0x590 > > [lör feb 22 23:46:34 2025] nf_hook_slow+0x3c/0xf0 > > [lör feb 22 23:46:34 2025] nf_hook_slow_list+0x70/0xf0 > > [lör feb 22 23:46:34 2025] ip_sublist_rcv+0x1ee/0x200 > > [lör feb 22 23:46:34 2025] ? __pfx_ip_rcv_finish+0x10/0x10 > > [lör feb 22 23:46:34 2025] ip_list_rcv+0xf8/0x130 > > [lör feb 22 23:46:34 2025] __netif_receive_skb_list_core+0x24c/0x270 > > [lör feb 22 23:46:34 2025] netif_receive_skb_list_internal+0x18f/0x2b0 > > [lör feb 22 23:46:34 2025] ? mlx5e_handle_rx_cqe_mpwrq+0x116/0x210 > > [lör feb 22 23:46:34 2025] napi_complete_done+0x65/0x260 > > [lör feb 22 23:46:34 2025] mlx5e_napi_poll+0x172/0x760 > > [lör feb 22 23:46:34 2025] __napi_poll+0x26/0x160 > > [lör feb 22 23:46:34 2025] net_rx_action+0x173/0x300 > > [lör feb 22 23:46:34 2025] ? notifier_call_chain+0x54/0xc0 > > [lör feb 22 23:46:34 2025] ? atomic_notifier_call_chain+0x30/0x40 > > [lör feb 22 23:46:34 2025] handle_softirqs+0xcd/0x270 > > [lör feb 22 23:46:34 2025] irq_exit_rcu+0x85/0xa0 > > [lör feb 22 23:46:34 2025] common_interrupt+0x81/0xa0 > > [lör feb 22 23:46:34 2025] </IRQ> > > [lör feb 22 23:46:34 2025] <TASK> > > [lör feb 22 23:46:34 2025] asm_common_interrupt+0x22/0x40 > > [lör feb 22 23:46:34 2025] RIP: 0010:cpuidle_enter_state+0xbc/0x430 > > [lör feb 22 23:46:34 2025] Code: 77 02 00 00 e8 65 31 ec fe e8 60 f8 > > ff ff 49 89 c5 0f 1f 44 00 00 31 ff e8 a1 68 eb fe 45 84 ff 0f 85 49 > > 02 00 00 fb 45 85 f6 <0f> 88 8d 01 00 00 49 63 ce 4c 8b 14 24 48 8d 04 > > 49 48 8d 14 81 48 > > [lör feb 22 23:46:34 2025] RSP: 0018:ffffb504000b7e88 EFLAGS: 00000202 > > [lör feb 22 23:46:34 2025] RAX: ffff9c0a2fa40000 RBX: ffff9c0a2fa76e60 > > RCX: 0000000000000000 > > [lör feb 22 23:46:34 2025] RDX: 0000252e1dcfee30 RSI: fffffff3c1a65ecc > > RDI: 0000000000000000 > > [lör feb 22 23:46:34 2025] RBP: 0000000000000002 R08: 0000000000000000 > > R09: 00000000000001f6 > > [lör feb 22 23:46:34 2025] R10: 0000000000000018 R11: ffff9c0a2fa6c3ac > > R12: ffffffffaac2de60 > > [lör feb 22 23:46:34 2025] R13: 0000252e1dcfee30 R14: 0000000000000002 > > R15: 0000000000000000 > > [lör feb 22 23:46:34 2025] ? cpuidle_enter_state+0xaf/0x430 > > [lör feb 22 23:46:34 2025] cpuidle_enter+0x24/0x40 > > [lör feb 22 23:46:34 2025] do_idle+0x16e/0x1b0 > > [lör feb 22 23:46:34 2025] cpu_startup_entry+0x20/0x30 > > [lör feb 22 23:46:34 2025] start_secondary+0xf3/0x100 > > [lör feb 22 23:46:34 2025] common_startup_64+0x13e/0x148 > > [lör feb 22 23:46:34 2025] </TASK> > > --- > > > > Asking gemini for help identified the machine in the basement as the > > culprit - so it seems like it could send corrupt data - i haven't had > > a closer look though > > > > Interesting. :) Yeah... While i don't trust AI as such, if i take this at face value it's quite interesting: --- What we can tell: * The packet is an IPv4 UDP packet. * The hardware checksum failure indicates a potential data corruption issue. This could be caused by: ** A faulty network cable. ** A problem with the network card itself. ** Issues with network switches or routers along the path. ** Software bugs. * The packet was large and was handled using GSO. * The hex dump allows for a very deep packet inspection, in order to diagnose the problem. * The IP source and destination addresses can be obtained from the hex dump, and then the traffic can be analysed. --- > > On Thu, Feb 27, 2025 at 5:41 PM Nikolay Aleksandrov <razor@blackwall.org> wrote: > >> ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink 2025-02-27 16:41 [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink Nikolay Aleksandrov 2025-02-28 12:46 ` Ian Kumlien @ 2025-03-04 10:40 ` patchwork-bot+netdevbpf 1 sibling, 0 replies; 5+ messages in thread From: patchwork-bot+netdevbpf @ 2025-03-04 10:40 UTC (permalink / raw) To: Nikolay Aleksandrov Cc: netdev, ajit.khaparde, sriharsha.basavapatna, somnath.kotur, andrew+netdev, davem, edumazet, kuba, pabeni, ian.kumlien Hello: This patch was applied to netdev/net.git (main) by Paolo Abeni <pabeni@redhat.com>: On Thu, 27 Feb 2025 18:41:29 +0200 you wrote: > Partially revert commit b71724147e73 ("be2net: replace polling with > sleeping in the FW completion path") w.r.t mcc mutex it introduces and the > use of usleep_range. The be2net be_ndo_bridge_getlink() callback is > called with rcu_read_lock, so this code has been broken for a long time. > Both the mutex_lock and the usleep_range can cause the issue Ian Kumlien > reported[1]. The call path is: > be_ndo_bridge_getlink -> be_cmd_get_hsw_config -> be_mcc_notify_wait -> > be_mcc_wait_compl -> usleep_range() > > [...] Here is the summary with links: - [net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink https://git.kernel.org/netdev/net/c/1a82d19ca2d6 You are awesome, thank you! -- Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-03-04 10:39 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-02-27 16:41 [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink Nikolay Aleksandrov 2025-02-28 12:46 ` Ian Kumlien 2025-02-28 12:49 ` Nikolay Aleksandrov 2025-02-28 12:55 ` Ian Kumlien 2025-03-04 10:40 ` patchwork-bot+netdevbpf
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.