mlx5 fixes 2022-10-14
Subsystems (6)
From: Saeed Mahameed <[email protected]>
v3->v4:
Drop the SF commit to comply with 15 patch limit and avoid build break
v2->v3:
Initialize sf_dev->sf_table mutex at correct location
v1->v2:
add missing sign-off.
This series provides bug fixes to mlx5 driver. Please pull and let me know if there is any problem.
Thanks,
Saeed.
The following changes since commit c5f0a17288740573f4de72965c5294a60244c5fc:
rhashtable: make test actually random (2022-10-26 13:39:09 +0100)
are available in the Git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux.git tags/mlx5-fixes-2022-10-26
for you to fetch changes up to efe8b237ea42d8e57f030136cd5c9b99318b9885:
net/mlx5e: Fix macsec sci endianness at rx sa update (2022-10-26 14:44:29 +0100)
----------------------------------------------------------------
mlx5-fixes-2022-10-26
----------------------------------------------------------------
Ariel Levkovich (1):
net/mlx5e: TC, Reject forwarding from internal port to internal port
Aya Levin (1):
net/mlx5e: Extend SKB room check to include PTP-SQ
Hyong Youb Kim (1):
net/mlx5e: Do not increment ESN when updating IPsec ESN state
Moshe Shemesh (1):
net/mlx5: Wait for firmware to enable CRS before pci_restore_state
Paul Blakey (1):
net/mlx5e: Update restore chain id for slow path packets
Raed Salem (4):
net/mlx5e: Fix macsec coverity issue at rx sa update
net/mlx5e: Fix macsec rx security association (SA) update/delete net/mlx5e: Fix wrong bitwise comparison usage in macsec_fs_rx_add_rule function net/mlx5e: Fix macsec sci endianness at rx sa update
Roi Dayan (1):
net/mlx5e: TC, Fix cloned flow attr instance dests are not zeroed
Rongwei Liu (1):
net/mlx5: DR, Fix matcher disconnect error flow
Roy Novich (1):
net/mlx5: Update fw fatal reporter state on PCI handlers successful recover
Saeed Mahameed (1):
net/mlx5: ASO, Create the ASO SQ with the correct timestamp format
Suresh Devarakonda (1):
net/mlx5: Fix crash during sync firmware reset
Tariq Toukan (1):
net/mlx5: Fix possible use-after-free in async command interface
drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 10 +-- drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h | 9 +++ .../net/ethernet/mellanox/mlx5/core/en/tc_priv.h | 2 + drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h | 6 ++ .../ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 3 - .../ethernet/mellanox/mlx5/core/en_accel/macsec.c | 16 ++--- .../mellanox/mlx5/core/en_accel/macsec_fs.c | 2 +- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 78 +++++++++++++++++++++- drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 6 ++ drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c | 17 +++++ drivers/net/ethernet/mellanox/mlx5/core/lib/aso.c | 7 ++ drivers/net/ethernet/mellanox/mlx5/core/lib/mpfs.c | 6 +- drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 ++ .../ethernet/mellanox/mlx5/core/steering/dr_rule.c | 3 +- include/linux/mlx5/driver.h | 2 +- 15 files changed, 146 insertions(+), 25 deletions(-)
PATCH v4 1/15 net/mlx5e: Do not increment ESN when updating IPsec ESN state
From: Hyong Youb Kim <[email protected]>
An offloaded SA stops receiving after about 2^32 + replay_window packets. For example, when SA reaches <seq-hi 0x1, seq 0x2c>, all subsequent packets get dropped with SA-icv-failure (integrity_failed).
To reproduce the bug:
- ConnectX-6 Dx with crypto enabled (FW 22.30.1004)
- ipsec.conf:
nic-offload = yes
replay-window = 32
esn = yes
salifetime=24h
- Run netperf for a long time to send more than 2^32 packets netperf -H <device-under-test> -t TCP_STREAM -l 20000
When 2^32 + replay_window packets are received, the replay window moves from the 2nd half of subspace (overlap=1) to the 1st half (overlap=0). The driver then updates the 'esn' value in NIC (i.e. seq_hi) as follows.
seq_hi = xfrm_replay_seqhi(seq_bottom)
new esn in NIC = seq_hi + 1
The +1 increment is wrong, as seq_hi already contains the correct seq_hi. For example, when seq_hi=1, the driver actually tells NIC to use seq_hi=2 (esn). This incorrect esn value causes all subsequent packets to fail integrity checks (SA-icv-failure). So, do not increment.
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c | 3 --- 1 file changed, 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c +0 -3
@@ -101,7 +101,6 @@ static bool mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry)struct xfrm_replay_state_esn *replay_esn;u32 seq_bottom =0 ;u8 overlap; -u32 *esn;if (!(sa_entry->x->props.flags &XFRM_STATE_ESN )) { sa_entry->esn_state.trigger =0 ;
@@ -116,11 +115,9 @@ static bool mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry) sa_entry->esn_state.esn =xfrm_replay_seqhi (sa_entry->x,htonl (seq_bottom)); - esn = &sa_entry->esn_state.esn; sa_entry->esn_state.trigger =1 ;if (unlikely (overlap && seq_bottom <MLX5E_IPSEC_ESN_SCOPE_MID )) { - ++(*esn); sa_entry->esn_state.overlap =0 ;return true; } else if (unlikely(!overlap &&
Signature · 1 line
2.37.3
Re: [V4 net 01/15] net/mlx5e: Do not increment ESN when updating IPsec ESN state
This series was applied to netdev/net.git (master) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net.git (master) by Jakub Kicinski <[email protected]>:
Quoted 16 lines · On Wed, 26 Oct 2022 14:51:39 +0100 you wrote:
From: Hyong Youb Kim <[email protected]>
An offloaded SA stops receiving after about 2^32 +
replay_windowpackets. For example, when SA reaches <seq-hi0x1, seq0x2c>, all subsequent packets get dropped with SA-icv-failure (integrity_failed).To reproduce the bug:
- ConnectX-6 Dx with crypto enabled (FW 22.30.1004)
- ipsec.conf:
nic-offload = yes
replay-window = 32
esn = yes
salifetime=24h
- Run netperf for a long time to send more than 2^32 packets netperf -H <device-under-test> -tTCP_STREAM-l 20000
Quoted 1 line
[...]
Here is the summary with links:
- [V4,net,01/15] net/mlx5e: Do not increment ESN when updating IPsec ESN state
https://git.kernel.org/netdev/net/c/888be6b279b7 - [V4,net,02/15] net/mlx5: Wait for firmware to enable CRS before pci_restore_state https://git.kernel.org/netdev/net/c/212b4d7251c1 - [V4,net,03/15] net/mlx5: DR, Fix matcher disconnect error flow https://git.kernel.org/netdev/net/c/4ea9891d6641 - [V4,net,04/15] net/mlx5e: Extend SKB room check to include PTP-SQ https://git.kernel.org/netdev/net/c/19b43a432e3e - [V4,net,05/15] net/mlx5e: Update restore chain id for slow path packets https://git.kernel.org/netdev/net/c/8dc47c0527c1 - [V4,net,06/15] net/mlx5: ASO, Create the ASO SQ with the correct timestamp format https://git.kernel.org/netdev/net/c/0f3caaa2c6fb - [V4,net,07/15] net/mlx5: Fix possible use-after-free in async command interface https://git.kernel.org/netdev/net/c/bacd22df9514 - [V4,net,08/15] net/mlx5e: TC, Reject forwarding from internal port to internal port https://git.kernel.org/netdev/net/c/f382a2413dae - [V4,net,09/15] net/mlx5e: TC, Fix cloned flow attr instance dests are not zeroed https://git.kernel.org/netdev/net/c/94d651739e17 - [V4,net,10/15] net/mlx5: Update fw fatal reporter state on PCI handlers successful recover https://git.kernel.org/netdev/net/c/416ef7136319 - [V4,net,11/15] net/mlx5: Fix crash during sync firmware reset https://git.kernel.org/netdev/net/c/aefb62a99887 - [V4,net,12/15] net/mlx5e: Fix macsec coverity issue at rx sa update https://git.kernel.org/netdev/net/c/d3ecf037569c - [V4,net,13/15] net/mlx5e: Fix macsec rx security association (SA) update/delete https://git.kernel.org/netdev/net/c/74573e38e933 - [V4,net,14/15] net/mlx5e: Fix wrong bitwise comparison usage in macsec_fs_rx_add_rule function https://git.kernel.org/netdev/net/c/d550956458a8 - [V4,net,15/15] net/mlx5e: Fix macsec sci endianness at rx sa update https://git.kernel.org/netdev/net/c/12ba40ba3dc3
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html
PATCH v4 2/15 net/mlx5: Wait for firmware to enable CRS before pci_restore_state
In reply to Saeed MahameedFrom: Moshe Shemesh <[email protected]>
After firmware reset driver should verify firmware already enabled CRS and became responsive to pci config cycles before restoring pci state. Fix that by waiting till device_id is readable through PCI again.
--- .../net/ethernet/mellanox/mlx5/core/fw_reset.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c +17 -0
@@ -358,6 +358,23 @@ static int mlx5_pci_link_toggle(struct mlx5_core_dev *dev) err = -ETIMEDOUT ; } +do { + err =pci_read_config_word (dev->pdev,PCI_DEVICE_ID , ®16); +if (err) +return err; +if (reg16 == dev_id) +break ; +msleep (20 ); + }while (!time_after (jiffies, timeout)); + +if (reg16 == dev_id) { +mlx5_core_info (dev,"Firmware responds to PCI config cycles again\n" ); + }else { +mlx5_core_err (dev,"Firmware is not responsive (0x%04x) after %llu ms\n" , + reg16,mlx5_tout_ms (dev,PCI_TOGGLE )); + err = -ETIMEDOUT ; + } + restore:list_for_each_entry (sdev, &bridge_bus->devices, bus_list) {pci_cfg_access_unlock (sdev);
Signature · 1 line
2.37.3
PATCH v4 3/15 net/mlx5: DR, Fix matcher disconnect error flow
In reply to Saeed MahameedFrom: Rongwei Liu <[email protected]>
When 2nd flow rules arrives, it will merge together with the 1st one if matcher criteria is the same.
If merge fails, driver will rollback the merge contents, and reject the 2nd rule. At rollback stage, matcher can't be disconnected unconditionally, otherise the 1st rule can't be hit anymore.
Add logic to check if the matcher should be disconnected or not.
--- drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_rule.c +2 -1
@@ -1200,7 +1200,8 @@ dr_rule_create_rule_nic(struct mlx5dr_rule *rule, } remove_from_nic_tbl: -mlx5dr_matcher_remove_from_tbl_nic (dmn, nic_matcher); +if (!nic_matcher->rules) +mlx5dr_matcher_remove_from_tbl_nic (dmn, nic_matcher); free_hw_ste:mlx5dr_domain_nic_unlock (nic_dmn);
Signature · 1 line
2.37.3
Jakub Kicinski
maintainerRe: [V4 net 03/15] net/mlx5: DR, Fix matcher disconnect error flow
Quoted 1 line · On Wed, 26 Oct 2022 14:51:41 +0100 Saeed Mahameed wrote:
Fixes cc2295cd54e4 ("net/mlx5: DR, Improve steering for empty or RX/TX-only matchers)
This is missing the terminating quotation marks.
Let me apply the series from the list and fix this for you. Sigh.
PATCH v4 4/15 net/mlx5e: Extend SKB room check to include PTP-SQ
In reply to Saeed MahameedFrom: Aya Levin <[email protected]>
When tx_port_ts is set, the driver diverts all UPD traffic over PTP port to a dedicated PTP-SQ. The SKBs are cached until the wire-CQE arrives. When the packet size is greater then MTU, the firmware might drop it and the packet won't be transmitted to the wire, hence the wire-CQE won't reach the driver. In this case the SKBs are accumulated in the SKB fifo. Add room check to consider the PTP-SQ SKB fifo, when the SKB fifo is full, driver stops the queue resulting in a TX timeout. Devlink TX-reporter can recover from it.
--- drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h | 9 +++++++++ drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h | 6 ++++++ drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 6 ++++++ 3 files changed, 21 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en/ptp.h +9 -0
@@ -6,6 +6,7 @@#include "en.h" #include "en_stats.h" +#include "en/txrx.h" #include <linux/ptp_classify.h> #define MLX5E_PTP_CHANNEL_IX 0
@@ -68,6 +69,14 @@ static inline bool mlx5e_use_ptpsq(struct sk_buff *skb) fk.ports.dst == htons(PTP_EV_PORT)); } +static inline bool mlx5e_ptpsq_fifo_has_room (struct mlx5e_txqsq *sq) +{ +if (!sq->ptpsq) +return true; + +return mlx5e_skb_fifo_has_room (&sq->ptpsq->skb_fifo); +} +int mlx5e_ptp_open (struct mlx5e_priv *priv,struct mlx5e_params *params,u8 lag_port,struct mlx5e_ptp **cp);void mlx5e_ptp_close (struct mlx5e_ptp *c);
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h +6 -0
@@ -57,6 +57,12 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev);bool mlx5e_poll_tx_cq (struct mlx5e_cq *cq,int napi_budget);void mlx5e_free_txqsq_descs (struct mlx5e_txqsq *sq); +static inline bool +mlx5e_skb_fifo_has_room (struct mlx5e_skb_fifo *fifo) +{ +return (*fifo->pc - *fifo->cc) < fifo->mask; +} +static inline bool mlx5e_wqc_has_room_for (struct mlx5_wq_cyc *wq,u16 cc,u16 pc,u16 n) {
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +6 -0
@@ -392,6 +392,11 @@ mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,if (unlikely (sq->ptpsq)) {mlx5e_skb_cb_hwtstamp_init (skb);mlx5e_skb_fifo_push (&sq->ptpsq->skb_fifo, skb); +if (!netif_tx_queue_stopped (sq->txq) && + !mlx5e_skb_fifo_has_room (&sq->ptpsq->skb_fifo)) { +netif_tx_stop_queue (sq->txq); + sq->stats->stopped++; + }skb_get (skb); }
@@ -868,6 +873,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)if (netif_tx_queue_stopped (sq->txq) &&mlx5e_wqc_has_room_for (&sq->wq, sq->cc, sq->pc, sq->stop_room) && +mlx5e_ptpsq_fifo_has_room (sq) && !test_bit (MLX5E_SQ_STATE_RECOVERING , &sq->state)) {netif_tx_wake_queue (sq->txq); stats->wake++;
Signature · 1 line
2.37.3
PATCH v4 5/15 net/mlx5e: Update restore chain id for slow path packets
In reply to Saeed MahameedFrom: Paul Blakey <[email protected]>
Currently encap slow path rules just forward to software without setting the chain id miss register, so driver doesn't restore the chain, and packets hitting this rule will restart from tc chain 0 instead of continuing to the chain the encap rule was on.
Fix this by setting the chain id miss register to the chain id mapping.
--- .../ethernet/mellanox/mlx5/core/en/tc_priv.h | 2 + .../net/ethernet/mellanox/mlx5/core/en_tc.c | 62 ++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en/tc_priv.h +2 -0
@@ -96,6 +96,7 @@ struct mlx5e_tc_flow {struct encap_flow_item encaps[MLX5_MAX_FLOW_FWD_VPORTS ];struct mlx5e_tc_flow *peer_flow;struct mlx5e_mod_hdr_handle *mh;/* attached mod header instance */ +struct mlx5e_mod_hdr_handle *slow_mh;/* attached mod header instance for slow path */ struct mlx5e_hairpin_entry *hpe;/* attached hairpin instance */ struct list_head hairpin;/* flows sharing the same hairpin */ struct list_head peer;/* flows with peer flow */
@@ -111,6 +112,7 @@ struct mlx5e_tc_flow {struct completion del_hw_done;struct mlx5_flow_attr *attr;struct list_head attrs; +u32 chain_mapping; }; struct mlx5_flow_handle *
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +60 -2
88 lines not on this page · raw message
Signature · 1 line
2.37.3
PATCH v4 6/15 net/mlx5: ASO, Create the ASO SQ with the correct timestamp format
In reply to Saeed MahameedFrom: Saeed Mahameed <[email protected]>
mlx5 SQs must select the timestamp format explicitly according to the active clock mode, select the current active timestamp mode so ASO SQ create will succeed.
This fixes the following error prints when trying to create ipsec ASO SQ while the timestamp format is real time mode.
mlx5_cmd_out_err:778:(pid 34874): CREATE_SQ(0x904) op_mod(0x0) failed, status bad parameter(0x3), syndrome (0xd61c0b), err(-22) mlx5_aso_create_sq:285:(pid 34874): Failed to open aso wq sq, err=-22
mlx5e_ipsec_init:436:(pid 34874): IPSec initialization failed, -22
--- drivers/net/ethernet/mellanox/mlx5/core/lib/aso.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/lib/aso.c +7 -0
@@ -3,6 +3,7 @@#include <linux/mlx5/device.h> #include <linux/mlx5/transobj.h> +#include "clock.h" #include "aso.h" #include "wq.h"
@@ -179,6 +180,7 @@ static int create_aso_sq(struct mlx5_core_dev *mdev, int pdn, {void *in, *sqc, *wq;int inlen, err; +u8 ts_format; inlen =MLX5_ST_SZ_BYTES (create_sq_in) +sizeof (u64) * sq->wq_ctrl.buf.npages;
@@ -195,6 +197,11 @@ static int create_aso_sq(struct mlx5_core_dev *mdev, int pdn,MLX5_SET (sqc, sqc, state,MLX5_SQC_STATE_RST );MLX5_SET (sqc, sqc, flush_in_error_en,1 ); + ts_format =mlx5_is_real_time_sq (mdev) ? +MLX5_TIMESTAMP_FORMAT_REAL_TIME : +MLX5_TIMESTAMP_FORMAT_FREE_RUNNING ; +MLX5_SET (sqc, sqc, ts_format, ts_format); +MLX5_SET (wq, wq, wq_type,MLX5_WQ_TYPE_CYCLIC );MLX5_SET (wq, wq, uar_page, mdev->mlx5e_res.hw_objs.bfreg.index); MLX5_SET(wq, wq, log_wq_pg_sz, sq->wq_ctrl.buf.page_shift -
Signature · 1 line
2.37.3
PATCH v4 7/15 net/mlx5: Fix possible use-after-free in async command interface
In reply to Saeed MahameedFrom: Tariq Toukan <[email protected]>
mlx5_cmd_cleanup_async_ctx should return only after all its callback handlers were completed. Before this patch, the below race between mlx5_cmd_cleanup_async_ctx and mlx5_cmd_exec_cb_handler was possible and lead to a use-after-free:
1. mlx5_cmd_cleanup_async_ctx is called while num_inflight is 2 (i.e. elevated by 1, a single inflight callback).
2. mlx5_cmd_cleanup_async_ctx decreases num_inflight to 1.
3. mlx5_cmd_exec_cb_handler is called, decreases num_inflight to 0 and is about to call wake_up().
4. mlx5_cmd_cleanup_async_ctx calls wait_event, which returns immediately as the condition (num_inflight == 0) holds.
5. mlx5_cmd_cleanup_async_ctx returns.
6. The caller of mlx5_cmd_cleanup_async_ctx frees the mlx5_async_ctx object.
7. mlx5_cmd_exec_cb_handler goes on and calls wake_up() on the freed object.
Fix it by syncing using a completion object. Mark it completed when num_inflight reaches 0.
Trace:
BUG: KASAN: use-after-free in do_raw_spin_lock+0x23d/0x270 Read of size 4 at addr ffff888139cd12f4 by task swapper/5/0 CPU: 5 PID: 0 Comm: swapper/5 Not tainted 6.0.0-rc3_for_upstream_debug_2022_08_30_13_10 #1 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.13.0-0-gf21b5a4aeb02-prebuilt.qemu.org 04/01/2014 Call Trace: <IRQ> dump_stack_lvl+0x57/0x7d print_report.cold+0x2d5/0x684 ? do_raw_spin_lock+0x23d/0x270 kasan_report+0xb1/0x1a0 ? do_raw_spin_lock+0x23d/0x270 do_raw_spin_lock+0x23d/0x270 ? rwlock_bug.part.0+0x90/0x90 ? __delete_object+0xb8/0x100 ? lock_downgrade+0x6e0/0x6e0 _raw_spin_lock_irqsave+0x43/0x60 ? __wake_up_common_lock+0xb9/0x140 __wake_up_common_lock+0xb9/0x140 ? __wake_up_common+0x650/0x650 ? destroy_tis_callback+0x53/0x70 [mlx5_core] ? kasan_set_track+0x21/0x30 ? destroy_tis_callback+0x53/0x70 [mlx5_core] ? kfree+0x1ba/0x520 ? do_raw_spin_unlock+0x54/0x220 mlx5_cmd_exec_cb_handler+0x136/0x1a0 [mlx5_core] ? mlx5_cmd_cleanup_async_ctx+0x220/0x220 [mlx5_core] ? mlx5_cmd_cleanup_async_ctx+0x220/0x220 [mlx5_core] mlx5_cmd_comp_handler+0x65a/0x12b0 [mlx5_core] ? dump_command+0xcc0/0xcc0 [mlx5_core] ? lockdep_hardirqs_on_prepare+0x400/0x400 ? cmd_comp_notifier+0x7e/0xb0 [mlx5_core] cmd_comp_notifier+0x7e/0xb0 [mlx5_core] atomic_notifier_call_chain+0xd7/0x1d0 mlx5_eq_async_int+0x3ce/0xa20 [mlx5_core] atomic_notifier_call_chain+0xd7/0x1d0 ? irq_release+0x140/0x140 [mlx5_core] irq_int_handler+0x19/0x30 [mlx5_core] __handle_irq_event_percpu+0x1f2/0x620 handle_irq_event+0xb2/0x1d0 handle_edge_irq+0x21e/0xb00 __common_interrupt+0x79/0x1a0 common_interrupt+0x78/0xa0 </IRQ> <TASK> asm_common_interrupt+0x22/0x40 RIP: 0010:default_idle+0x42/0x60 Code: c1 83 e0 07 48 c1 e9 03 83 c0 03 0f b6 14 11 38 d0 7c 04 84 d2 75 14 8b 05 eb 47 22 02 85 c0 7e 07 0f 00 2d e0 9f 48 00 fb f4 <c3> 48 c7 c7 80 08 7f 85 e8 d1 d3 3e fe eb de 66 66 2e 0f 1f 84 00 RSP: 0018:ffff888100dbfdf0 EFLAGS: 00000242 RAX: 0000000000000001 RBX: ffffffff84ecbd48 RCX: 1ffffffff0afe110 RDX: 0000000000000004 RSI: 0000000000000000 RDI: ffffffff835cc9bc RBP: 0000000000000005 R08: 0000000000000001 R09: ffff88881dec4ac3 R10: ffffed1103bd8958 R11: 0000017d0ca571c9 R12: 0000000000000005 R13: ffffffff84f024e0 R14: 0000000000000000 R15: dffffc0000000000 ? default_idle_call+0xcc/0x450 default_idle_call+0xec/0x450 do_idle+0x394/0x450 ? arch_cpu_idle_exit+0x40/0x40 ? do_idle+0x17/0x450 cpu_startup_entry+0x19/0x20 start_secondary+0x221/0x2b0 ? set_cpu_sibling_map+0x2070/0x2070 secondary_startup_64_no_verify+0xcd/0xdb </TASK> Allocated by task 49502: kasan_save_stack+0x1e/0x40 __kasan_kmalloc+0x81/0xa0 kvmalloc_node+0x48/0xe0 mlx5e_bulk_async_init+0x35/0x110 [mlx5_core] mlx5e_tls_priv_tx_list_cleanup+0x84/0x3e0 [mlx5_core] mlx5e_ktls_cleanup_tx+0x38f/0x760 [mlx5_core] mlx5e_cleanup_nic_tx+0xa7/0x100 [mlx5_core] mlx5e_detach_netdev+0x1ca/0x2b0 [mlx5_core] mlx5e_suspend+0xdb/0x140 [mlx5_core] mlx5e_remove+0x89/0x190 [mlx5_core] auxiliary_bus_remove+0x52/0x70 device_release_driver_internal+0x40f/0x650 driver_detach+0xc1/0x180 bus_remove_driver+0x125/0x2f0 auxiliary_driver_unregister+0x16/0x50 mlx5e_cleanup+0x26/0x30 [mlx5_core] cleanup+0xc/0x4e [mlx5_core] __x64_sys_delete_module+0x2b5/0x450 do_syscall_64+0x3d/0x90 entry_SYSCALL_64_after_hwframe+0x46/0xb0 Freed by task 49502: kasan_save_stack+0x1e/0x40 kasan_set_track+0x21/0x30 kasan_set_free_info+0x20/0x30 ____kasan_slab_free+0x11d/0x1b0 kfree+0x1ba/0x520 mlx5e_tls_priv_tx_list_cleanup+0x2e7/0x3e0 [mlx5_core] mlx5e_ktls_cleanup_tx+0x38f/0x760 [mlx5_core] mlx5e_cleanup_nic_tx+0xa7/0x100 [mlx5_core] mlx5e_detach_netdev+0x1ca/0x2b0 [mlx5_core] mlx5e_suspend+0xdb/0x140 [mlx5_core] mlx5e_remove+0x89/0x190 [mlx5_core] auxiliary_bus_remove+0x52/0x70 device_release_driver_internal+0x40f/0x650 driver_detach+0xc1/0x180 bus_remove_driver+0x125/0x2f0 auxiliary_driver_unregister+0x16/0x50 mlx5e_cleanup+0x26/0x30 [mlx5_core] cleanup+0xc/0x4e [mlx5_core] __x64_sys_delete_module+0x2b5/0x450 do_syscall_64+0x3d/0x90 entry_SYSCALL_64_after_hwframe+0x46/0xb0
--- drivers/net/ethernet/mellanox/mlx5/core/cmd.c | 10 +++++----- include/linux/mlx5/driver.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/cmd.c +5 -5
@@ -2004,7 +2004,7 @@ void mlx5_cmd_init_async_ctx(struct mlx5_core_dev *dev, ctx->dev = dev;/* Starts at 1 to avoid doing wake_up if we are not cleaning up */ atomic_set (&ctx->num_inflight,1 ); -init_waitqueue_head (&ctx->wait); +init_completion (&ctx->inflight_done); }EXPORT_SYMBOL (mlx5_cmd_init_async_ctx);
@@ -2018,8 +2018,8 @@ EXPORT_SYMBOL(mlx5_cmd_init_async_ctx);*/ void mlx5_cmd_cleanup_async_ctx (struct mlx5_async_ctx *ctx) { -atomic_dec (&ctx->num_inflight); -wait_event (ctx->wait,atomic_read (&ctx->num_inflight) ==0 ); +if (!atomic_dec_and_test (&ctx->num_inflight)) +wait_for_completion (&ctx->inflight_done); }EXPORT_SYMBOL (mlx5_cmd_cleanup_async_ctx);
@@ -2032,7 +2032,7 @@ static void mlx5_cmd_exec_cb_handler(int status, void *_work) status =cmd_status_err (ctx->dev, status, work->opcode, work->out); work->user_callback (status, work);if (atomic_dec_and_test (&ctx->num_inflight)) -wake_up (&ctx->wait); +complete (&ctx->inflight_done); } int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size,
@@ -2050,7 +2050,7 @@ int mlx5_cmd_exec_cb(struct mlx5_async_ctx *ctx, void *in, int in_size, ret =cmd_exec (ctx->dev, in, in_size, out, out_size, mlx5_cmd_exec_cb_handler, work, false);if (ret &&atomic_dec_and_test (&ctx->num_inflight)) -wake_up (&ctx->wait); +complete (&ctx->inflight_done);return ret; }
include/linux/mlx5/driver.h +1 -1
@@ -970,7 +970,7 @@ void mlx5_cmd_allowed_opcode(struct mlx5_core_dev *dev, u16 opcode);struct mlx5_async_ctx {struct mlx5_core_dev *dev;atomic_t num_inflight; -struct wait_queue_head wait; +struct completion inflight_done; };struct mlx5_async_work ;
Signature · 1 line
2.37.3
PATCH v4 8/15 net/mlx5e: TC, Reject forwarding from internal port to internal port
In reply to Saeed MahameedFrom: Ariel Levkovich <[email protected]>
Reject TC rules that forward from internal port to internal port as it is not supported.
This include rules that are explicitly have internal port as the filter device as well as rules that apply on tunnel interfaces as the route device for the tunnel interface can be an internal port.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +11 -1
@@ -4066,6 +4066,7 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv,struct mlx5e_tc_flow_parse_attr *parse_attr;struct mlx5_flow_attr *attr = flow->attr;struct mlx5_esw_flow_attr *esw_attr; +struct net_device *filter_dev;int err; err =flow_action_supported (flow_action, extack);
@@ -4074,6 +4075,7 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv, esw_attr = attr->esw_attr; parse_attr = attr->parse_attr; + filter_dev = parse_attr->filter_dev; parse_state = &parse_attr->parse_state;mlx5e_tc_act_init_parse_state (parse_state, flow, flow_action, extack); parse_state->ct_priv =get_ct_priv (priv);
@@ -4083,13 +4085,21 @@ parse_tc_fdb_actions(struct mlx5e_priv *priv,return err;/* Forward to/from internal port can only have 1 dest */ -if ((netif_is_ovs_master (parse_attr->filter_dev) || esw_attr->dest_int_port) && +if ((netif_is_ovs_master (filter_dev) || esw_attr->dest_int_port) && esw_attr->out_count >1 ) {NL_SET_ERR_MSG_MOD (extack,"Rules with internal port can have only one destination" );return -EOPNOTSUPP ; } +/* Forward from tunnel/internal port to internal port is not supported */ +if ((mlx5e_get_tc_tun (filter_dev) ||netif_is_ovs_master (filter_dev)) && + esw_attr->dest_int_port) { +NL_SET_ERR_MSG_MOD (extack, +"Forwarding from tunnel/internal port to internal port is not supported" ); +return -EOPNOTSUPP ; + } + err =actions_prepare_mod_hdr_actions (priv, flow, attr, extack);if (err)return err;
Signature · 1 line
2.37.3
PATCH v4 9/15 net/mlx5e: TC, Fix cloned flow attr instance dests are not zeroed
In reply to Saeed MahameedFrom: Roi Dayan <[email protected]>
On multi table split the driver creates a new attr instance with data being copied from prev attr instance zeroing action flags. Also need to reset dests properties to avoid incorrect dests per attr.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +4 -0
@@ -3633,6 +3633,10 @@ mlx5e_clone_flow_attr_for_post_act(struct mlx5_flow_attr *attr, attr2->action =0 ; attr2->flags =0 ; attr2->parse_attr = parse_attr; + attr2->esw_attr->out_count =0 ; + attr2->esw_attr->split_count =0 ; + attr2->dest_chain =0 ; + attr2->dest_ft =NULL ;return attr2; }
Signature · 1 line
2.37.3
PATCH v4 10/15 net/mlx5: Update fw fatal reporter state on PCI handlers successful recover
In reply to Saeed MahameedFrom: Roy Novich <[email protected]>
Update devlink health fw fatal reporter state to "healthy" is needed by strictly calling devlink_health_reporter_state_update() after recovery was done by PCI error handler. This is needed when fw_fatal reporter was triggered due to PCI error. Poll health is called and set reporter state to error. Health recovery failed (since EEH didn't re-enable the PCI). PCI handlers keep on recover flow and succeed later without devlink acknowledgment. Fix this by adding devlink state update at the end of the PCI handler recovery process.
--- drivers/net/ethernet/mellanox/mlx5/core/main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/mellanox/mlx5/core/main.c +4 -0
@@ -1872,6 +1872,10 @@ static void mlx5_pci_resume(struct pci_dev *pdev) err =mlx5_load_one (dev, false); +if (!err) +devlink_health_reporter_state_update (dev->priv.health.fw_fatal_reporter, +DEVLINK_HEALTH_REPORTER_STATE_HEALTHY ); +mlx5_pci_trace (dev,"Done, err = %d, device %s\n" , err, !err ?"recovered" :"Failed" ); }
Signature · 1 line
2.37.3
PATCH v4 11/15 net/mlx5: Fix crash during sync firmware reset
In reply to Saeed MahameedFrom: Suresh Devarakonda <[email protected]>
When setting Bluefield to DPU NIC mode using mlxconfig tool + sync firmware reset flow, we run into scenario where the host was not eswitch manager at the time of mlx5 driver load but becomes eswitch manager after the sync firmware reset flow. This results in null pointer access of mpfs structure during mac filter add. This change prevents null pointer access but mpfs table entries will not be added.
--- drivers/net/ethernet/mellanox/mlx5/core/lib/mpfs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/lib/mpfs.c +3 -3
@@ -122,7 +122,7 @@ void mlx5_mpfs_cleanup(struct mlx5_core_dev *dev) {struct mlx5_mpfs *mpfs = dev->priv.mpfs; -if (!MLX5_ESWITCH_MANAGER (dev)) +if (!mpfs)return ;WARN_ON (!hlist_empty (mpfs->hash));
@@ -137,7 +137,7 @@ int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac)int err =0 ;u32 index; -if (!MLX5_ESWITCH_MANAGER (dev)) +if (!mpfs)return 0 ;mutex_lock (&mpfs->lock);
@@ -185,7 +185,7 @@ int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac)int err =0 ;u32 index; -if (!MLX5_ESWITCH_MANAGER (dev)) +if (!mpfs)return 0 ;mutex_lock (&mpfs->lock);
Signature · 1 line
2.37.3
PATCH v4 12/15 net/mlx5e: Fix macsec coverity issue at rx sa update
In reply to Saeed MahameedFrom: Raed Salem <[email protected]>
The cited commit at update rx sa operation passes object attributes to MACsec object create function without initializing/setting all attributes fields leaving some of them with garbage values, therefore violating the implicit assumption at create object function, which assumes that all input object attributes fields are set.
Fix by initializing the object attributes struct to zero, thus leaving unset fields with the legal zero value.
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +1 -1
@@ -432,7 +432,7 @@ static int mlx5e_macsec_update_rx_sa(struct mlx5e_macsec *macsec, bool active) {struct mlx5_core_dev *mdev = macsec->mdev; -struct mlx5_macsec_obj_attrs attrs; +struct mlx5_macsec_obj_attrs attrs = {};int err =0 ;if (rx_sa->active != active)
Signature · 1 line
2.37.3
PATCH v4 13/15 net/mlx5e: Fix macsec rx security association (SA) update/delete
In reply to Saeed MahameedFrom: Raed Salem <[email protected]>
The cited commit adds the support for update/delete MACsec Rx SA, naturally, these operations need to check if the SA in question exists to update/delete the SA and return error code otherwise, however they do just the opposite i.e. return with error if the SA exists
Fix by change the check to return error in case the SA in question does not exist, adjust error message and code accordingly.
--- .../ethernet/mellanox/mlx5/core/en_accel/macsec.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +6 -6
@@ -999,11 +999,11 @@ static int mlx5e_macsec_upd_rxsa(struct macsec_context *ctx) } rx_sa = rx_sc->rx_sa[assoc_num]; -if (rx_sa) { +if (!rx_sa) {netdev_err (ctx->netdev, -"MACsec offload rx_sc sci %lld rx_sa %d already exist\n" , +"MACsec offload rx_sc sci %lld rx_sa %d doesn't exist\n" , sci, assoc_num); - err = -EEXIST ; + err = -EINVAL ; goto out; }
@@ -1055,11 +1055,11 @@ static int mlx5e_macsec_del_rxsa(struct macsec_context *ctx) } rx_sa = rx_sc->rx_sa[assoc_num]; -if (rx_sa) { +if (!rx_sa) {netdev_err (ctx->netdev, -"MACsec offload rx_sc sci %lld rx_sa %d already exist\n" , +"MACsec offload rx_sc sci %lld rx_sa %d doesn't exist\n" , sci, assoc_num); - err = -EEXIST ; + err = -EINVAL ; goto out; }
Signature · 1 line
2.37.3
PATCH v4 14/15 net/mlx5e: Fix wrong bitwise comparison usage in macsec_fs_rx_add_rule function
In reply to Saeed MahameedFrom: Raed Salem <[email protected]>
The cited commit produces a sparse check error of type "sparse: error: restricted __be64 degrades to integer". The offending line wrongly did a bitwise operation between two different storage types one of 64 bit when the other smaller side is 16 bit which caused the above sparse error, furthermore bitwise operation usage here is wrong in the first place as the constant MACSEC_PORT_ES is not a bitwise field.
Fix by using the right mask to get the lower 16 bit if the sci number, and use comparison operator '==' instead of bitwise '&' operator.
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec_fs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec_fs.c +1 -1
@@ -1180,7 +1180,7 @@ macsec_fs_rx_add_rule(struct mlx5e_macsec_fs *macsec_fs, rx_rule->rule[0 ] = rule;/* Rx crypto table without SCI rule */ -if (cpu_to_be64 ((__force u64 )attrs->sci) &ntohs (MACSEC_PORT_ES )) { +if ((cpu_to_be64 ((__force u64 )attrs->sci) &0xFFFF ) ==ntohs (MACSEC_PORT_ES )) {memset (spec,0 ,sizeof (struct mlx5_flow_spec ));memset (&dest,0 ,sizeof (struct mlx5_flow_destination ));memset (&flow_act,0 ,sizeof (flow_act));
Signature · 1 line
2.37.3
PATCH v4 15/15 net/mlx5e: Fix macsec sci endianness at rx sa update
In reply to Saeed MahameedFrom: Raed Salem <[email protected]>
The cited commit at rx sa update operation passes the sci object attribute, in the wrong endianness and not as expected by the HW effectively create malformed hw sa context in case of update rx sa consequently, HW produces unexpected MACsec packets which uses this sa.
Fix by passing sci to create macsec object with the correct endianness, while at it add __force u64 to prevent sparse check error of type "sparse: error: incorrect type in assignment".
--- drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en_accel/macsec.c +1 -1
@@ -444,7 +444,7 @@ static int mlx5e_macsec_update_rx_sa(struct mlx5e_macsec *macsec,return 0 ; } - attrs.sci = rx_sa->sci; + attrs.sci =cpu_to_be64 ((__force u64 )rx_sa->sci); attrs.enc_key_id = rx_sa->enc_key_id; err =mlx5e_macsec_create_object (mdev, &attrs, false, &rx_sa->macsec_obj_id);if (err)
Signature · 1 line
2.37.3