Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'net-mlx5e-rx-datapath-enhancements'

Tariq Toukan says:

====================
net/mlx5e: RX datapath enhancements

This series by Dragos introduces multiple RX datapath enhancements to
the mlx5e driver.

First patch adds SW handling for oversized packets in non-linear SKB
mode.

Second patch adds a reclaim mechanism to mitigate memory allocation
failures with memory providers.
====================

Link: https://patch.msgid.link/20260203072130.1710255-1-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+41 -26
+2 -23
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
··· 4716 4716 struct mlx5e_priv *priv = netdev_priv(netdev); 4717 4717 struct mlx5e_params new_params; 4718 4718 struct mlx5e_params *params; 4719 - bool reset = true; 4720 4719 int err = 0; 4721 4720 4722 4721 mutex_lock(&priv->state_lock); ··· 4741 4742 goto out; 4742 4743 } 4743 4744 4744 - if (params->packet_merge.type == MLX5E_PACKET_MERGE_LRO) 4745 - reset = false; 4746 - 4747 - if (params->rq_wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ && 4748 - params->packet_merge.type != MLX5E_PACKET_MERGE_SHAMPO) { 4749 - bool is_linear_old = mlx5e_rx_mpwqe_is_linear_skb(priv->mdev, params, NULL); 4750 - bool is_linear_new = mlx5e_rx_mpwqe_is_linear_skb(priv->mdev, 4751 - &new_params, NULL); 4752 - u8 sz_old = mlx5e_mpwqe_get_log_rq_size(priv->mdev, params, NULL); 4753 - u8 sz_new = mlx5e_mpwqe_get_log_rq_size(priv->mdev, &new_params, NULL); 4754 - 4755 - /* Always reset in linear mode - hw_mtu is used in data path. 4756 - * Check that the mode was non-linear and didn't change. 4757 - * If XSK is active, XSK RQs are linear. 4758 - * Reset if the RQ size changed, even if it's non-linear. 4759 - */ 4760 - if (!is_linear_old && !is_linear_new && !priv->xsk.refcnt && 4761 - sz_old == sz_new) 4762 - reset = false; 4763 - } 4764 - 4765 - err = mlx5e_safe_switch_params(priv, &new_params, preactivate, NULL, reset); 4745 + err = mlx5e_safe_switch_params(priv, &new_params, preactivate, NULL, 4746 + true); 4766 4747 4767 4748 out: 4768 4749 WRITE_ONCE(netdev->mtu, params->sw_mtu);
+34 -3
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
··· 1087 1087 return i; 1088 1088 } 1089 1089 1090 + static void mlx5e_reclaim_mpwqe_pages(struct mlx5e_rq *rq, int head, 1091 + int reclaim) 1092 + { 1093 + struct mlx5_wq_ll *wq = &rq->mpwqe.wq; 1094 + 1095 + for (int i = 0; i < reclaim; i++) { 1096 + head = mlx5_wq_ll_get_wqe_next_ix(wq, head); 1097 + 1098 + mlx5e_dealloc_rx_mpwqe(rq, head); 1099 + } 1100 + } 1101 + 1090 1102 INDIRECT_CALLABLE_SCOPE bool mlx5e_post_rx_mpwqes(struct mlx5e_rq *rq) 1091 1103 { 1092 1104 struct mlx5_wq_ll *wq = &rq->mpwqe.wq; 1093 1105 u8 umr_completed = rq->mpwqe.umr_completed; 1094 1106 struct mlx5e_icosq *sq = rq->icosq; 1107 + bool reclaimed = false; 1095 1108 int alloc_err = 0; 1096 1109 u8 missing, i; 1097 1110 u16 head; ··· 1139 1126 /* Deferred free for better page pool cache usage. */ 1140 1127 mlx5e_free_rx_mpwqe(rq, wi); 1141 1128 1129 + retry: 1142 1130 alloc_err = rq->xsk_pool ? mlx5e_xsk_alloc_rx_mpwqe(rq, head) : 1143 1131 mlx5e_alloc_rx_mpwqe(rq, head); 1132 + if (unlikely(alloc_err)) { 1133 + int reclaim = i - 1; 1144 1134 1145 - if (unlikely(alloc_err)) 1146 - break; 1135 + if (reclaimed || !reclaim) 1136 + break; 1137 + 1138 + mlx5e_reclaim_mpwqe_pages(rq, head, reclaim); 1139 + reclaimed = true; 1140 + 1141 + goto retry; 1142 + } 1147 1143 head = mlx5_wq_ll_get_wqe_next_ix(wq, head); 1148 1144 } while (--i); 1149 1145 ··· 1596 1574 struct mlx5e_rq *rq, 1597 1575 struct sk_buff *skb) 1598 1576 { 1599 - u8 lro_num_seg = be32_to_cpu(cqe->srqn) >> 24; 1577 + u8 lro_num_seg = get_cqe_lro_num_seg(cqe); 1600 1578 struct mlx5e_rq_stats *stats = rq->stats; 1601 1579 struct net_device *netdev = rq->netdev; 1602 1580 ··· 2079 2057 u16 linear_data_len; 2080 2058 u16 linear_hr; 2081 2059 void *va; 2060 + 2061 + if (unlikely(cqe_bcnt > rq->hw_mtu)) { 2062 + u8 lro_num_seg = get_cqe_lro_num_seg(cqe); 2063 + 2064 + if (lro_num_seg <= 1) { 2065 + rq->stats->oversize_pkts_sw_drop++; 2066 + return NULL; 2067 + } 2068 + } 2082 2069 2083 2070 prog = rcu_dereference(rq->xdp_prog); 2084 2071
+5
include/linux/mlx5/device.h
··· 962 962 return be32_to_cpu(cqe->sop_drop_qpn) & 0xFFF; 963 963 } 964 964 965 + static inline u8 get_cqe_lro_num_seg(struct mlx5_cqe64 *cqe) 966 + { 967 + return be32_to_cpu(cqe->srqn) >> 24; 968 + } 969 + 965 970 #define MLX5_MPWQE_LOG_NUM_STRIDES_EXT_BASE 3 966 971 #define MLX5_MPWQE_LOG_NUM_STRIDES_BASE 9 967 972 #define MLX5_MPWQE_LOG_NUM_STRIDES_MAX 16