[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAA85sZva1SbT_HDbAHgZEDeCgjcbTX_rBzj-RZQmsvST3Ky3LA@mail.gmail.com>
Date: Fri, 28 Feb 2025 13:46:15 +0100
From: Ian Kumlien <ian.kumlien@...il.com>
To: Nikolay Aleksandrov <razor@...ckwall.org>
Cc: netdev@...r.kernel.org, Ajit Khaparde <ajit.khaparde@...adcom.com>,
Sriharsha Basavapatna <sriharsha.basavapatna@...adcom.com>,
Somnath Kotur <somnath.kotur@...adcom.com>, Andrew Lunn <andrew+netdev@...n.ch>, davem@...emloft.net,
edumazet@...gle.com, Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>
Subject: Re: [PATCH net] be2net: fix sleeping while atomic bugs in be_ndo_bridge_getlink
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@...ckwall.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@...il.com>
> Fixes: b71724147e73 ("be2net: replace polling with sleeping in the FW completion path")
> Signed-off-by: Nikolay Aleksandrov <razor@...ckwall.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
>
Powered by blists - more mailing lists