netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).