Skip to content

Commit bdc454f

Browse files
committed
Merge branch 'mlx5-fixes-2023-11-13-manual'
Saeed Mahameed says: ==================== This series provides bug fixes to mlx5 driver. ==================== Link: https://lore.kernel.org/r/[email protected]/ Signed-off-by: Jakub Kicinski <[email protected]>
2 parents a6a6a0a + 1b2bd0c commit bdc454f

File tree

15 files changed

+131
-216
lines changed

15 files changed

+131
-216
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en/ptp.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,8 @@ static void mlx5e_ptpsq_mark_ts_cqes_undelivered(struct mlx5e_ptpsq *ptpsq,
177177

178178
static void mlx5e_ptp_handle_ts_cqe(struct mlx5e_ptpsq *ptpsq,
179179
struct mlx5_cqe64 *cqe,
180+
u8 *md_buff,
181+
u8 *md_buff_sz,
180182
int budget)
181183
{
182184
struct mlx5e_ptp_port_ts_cqe_list *pending_cqe_list = ptpsq->ts_cqe_pending_list;
@@ -211,19 +213,24 @@ static void mlx5e_ptp_handle_ts_cqe(struct mlx5e_ptpsq *ptpsq,
211213
mlx5e_ptpsq_mark_ts_cqes_undelivered(ptpsq, hwtstamp);
212214
out:
213215
napi_consume_skb(skb, budget);
214-
mlx5e_ptp_metadata_fifo_push(&ptpsq->metadata_freelist, metadata_id);
216+
md_buff[*md_buff_sz++] = metadata_id;
215217
if (unlikely(mlx5e_ptp_metadata_map_unhealthy(&ptpsq->metadata_map)) &&
216218
!test_and_set_bit(MLX5E_SQ_STATE_RECOVERING, &sq->state))
217219
queue_work(ptpsq->txqsq.priv->wq, &ptpsq->report_unhealthy_work);
218220
}
219221

220-
static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int budget)
222+
static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int napi_budget)
221223
{
222224
struct mlx5e_ptpsq *ptpsq = container_of(cq, struct mlx5e_ptpsq, ts_cq);
223-
struct mlx5_cqwq *cqwq = &cq->wq;
225+
int budget = min(napi_budget, MLX5E_TX_CQ_POLL_BUDGET);
226+
u8 metadata_buff[MLX5E_TX_CQ_POLL_BUDGET];
227+
u8 metadata_buff_sz = 0;
228+
struct mlx5_cqwq *cqwq;
224229
struct mlx5_cqe64 *cqe;
225230
int work_done = 0;
226231

232+
cqwq = &cq->wq;
233+
227234
if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &ptpsq->txqsq.state)))
228235
return false;
229236

@@ -234,14 +241,19 @@ static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int budget)
234241
do {
235242
mlx5_cqwq_pop(cqwq);
236243

237-
mlx5e_ptp_handle_ts_cqe(ptpsq, cqe, budget);
244+
mlx5e_ptp_handle_ts_cqe(ptpsq, cqe,
245+
metadata_buff, &metadata_buff_sz, napi_budget);
238246
} while ((++work_done < budget) && (cqe = mlx5_cqwq_get_cqe(cqwq)));
239247

240248
mlx5_cqwq_update_db_record(cqwq);
241249

242250
/* ensure cq space is freed before enabling more cqes */
243251
wmb();
244252

253+
while (metadata_buff_sz > 0)
254+
mlx5e_ptp_metadata_fifo_push(&ptpsq->metadata_freelist,
255+
metadata_buff[--metadata_buff_sz]);
256+
245257
mlx5e_txqsq_wake(&ptpsq->txqsq);
246258

247259
return work_done == budget;

drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -492,11 +492,11 @@ static int mlx5e_rx_reporter_dump(struct devlink_health_reporter *reporter,
492492

493493
void mlx5e_reporter_rx_timeout(struct mlx5e_rq *rq)
494494
{
495-
char icosq_str[MLX5E_REPORTER_PER_Q_MAX_LEN] = {};
496495
char err_str[MLX5E_REPORTER_PER_Q_MAX_LEN];
497496
struct mlx5e_icosq *icosq = rq->icosq;
498497
struct mlx5e_priv *priv = rq->priv;
499498
struct mlx5e_err_ctx err_ctx = {};
499+
char icosq_str[32] = {};
500500

501501
err_ctx.ctx = rq;
502502
err_ctx.recover = mlx5e_rx_reporter_timeout_recover;
@@ -505,7 +505,7 @@ void mlx5e_reporter_rx_timeout(struct mlx5e_rq *rq)
505505
if (icosq)
506506
snprintf(icosq_str, sizeof(icosq_str), "ICOSQ: 0x%x, ", icosq->sqn);
507507
snprintf(err_str, sizeof(err_str),
508-
"RX timeout on channel: %d, %sRQ: 0x%x, CQ: 0x%x",
508+
"RX timeout on channel: %d, %s RQ: 0x%x, CQ: 0x%x",
509509
rq->ix, icosq_str, rq->rqn, rq->cq.mcq.cqn);
510510

511511
mlx5e_health_report(priv, priv->rx_reporter, err_str, &err_ctx);

drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -300,9 +300,6 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
300300
if (err)
301301
goto destroy_neigh_entry;
302302

303-
e->encap_size = ipv4_encap_size;
304-
e->encap_header = encap_header;
305-
306303
if (!(nud_state & NUD_VALID)) {
307304
neigh_event_send(attr.n, NULL);
308305
/* the encap entry will be made valid on neigh update event
@@ -322,6 +319,8 @@ int mlx5e_tc_tun_create_header_ipv4(struct mlx5e_priv *priv,
322319
goto destroy_neigh_entry;
323320
}
324321

322+
e->encap_size = ipv4_encap_size;
323+
e->encap_header = encap_header;
325324
e->flags |= MLX5_ENCAP_ENTRY_VALID;
326325
mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev));
327326
mlx5e_route_lookup_ipv4_put(&attr);
@@ -404,16 +403,12 @@ int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv,
404403
if (err)
405404
goto free_encap;
406405

407-
e->encap_size = ipv4_encap_size;
408-
kfree(e->encap_header);
409-
e->encap_header = encap_header;
410-
411406
if (!(nud_state & NUD_VALID)) {
412407
neigh_event_send(attr.n, NULL);
413408
/* the encap entry will be made valid on neigh update event
414409
* and not used before that.
415410
*/
416-
goto release_neigh;
411+
goto free_encap;
417412
}
418413

419414
memset(&reformat_params, 0, sizeof(reformat_params));
@@ -427,6 +422,10 @@ int mlx5e_tc_tun_update_header_ipv4(struct mlx5e_priv *priv,
427422
goto free_encap;
428423
}
429424

425+
e->encap_size = ipv4_encap_size;
426+
kfree(e->encap_header);
427+
e->encap_header = encap_header;
428+
430429
e->flags |= MLX5_ENCAP_ENTRY_VALID;
431430
mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev));
432431
mlx5e_route_lookup_ipv4_put(&attr);
@@ -568,9 +567,6 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
568567
if (err)
569568
goto destroy_neigh_entry;
570569

571-
e->encap_size = ipv6_encap_size;
572-
e->encap_header = encap_header;
573-
574570
if (!(nud_state & NUD_VALID)) {
575571
neigh_event_send(attr.n, NULL);
576572
/* the encap entry will be made valid on neigh update event
@@ -590,6 +586,8 @@ int mlx5e_tc_tun_create_header_ipv6(struct mlx5e_priv *priv,
590586
goto destroy_neigh_entry;
591587
}
592588

589+
e->encap_size = ipv6_encap_size;
590+
e->encap_header = encap_header;
593591
e->flags |= MLX5_ENCAP_ENTRY_VALID;
594592
mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev));
595593
mlx5e_route_lookup_ipv6_put(&attr);
@@ -671,16 +669,12 @@ int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv,
671669
if (err)
672670
goto free_encap;
673671

674-
e->encap_size = ipv6_encap_size;
675-
kfree(e->encap_header);
676-
e->encap_header = encap_header;
677-
678672
if (!(nud_state & NUD_VALID)) {
679673
neigh_event_send(attr.n, NULL);
680674
/* the encap entry will be made valid on neigh update event
681675
* and not used before that.
682676
*/
683-
goto release_neigh;
677+
goto free_encap;
684678
}
685679

686680
memset(&reformat_params, 0, sizeof(reformat_params));
@@ -694,6 +688,10 @@ int mlx5e_tc_tun_update_header_ipv6(struct mlx5e_priv *priv,
694688
goto free_encap;
695689
}
696690

691+
e->encap_size = ipv6_encap_size;
692+
kfree(e->encap_header);
693+
e->encap_header = encap_header;
694+
697695
e->flags |= MLX5_ENCAP_ENTRY_VALID;
698696
mlx5e_rep_queue_neigh_stats_work(netdev_priv(attr.out_dev));
699697
mlx5e_route_lookup_ipv6_put(&attr);

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,17 @@ void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
4343
struct ethtool_drvinfo *drvinfo)
4444
{
4545
struct mlx5_core_dev *mdev = priv->mdev;
46+
int count;
4647

4748
strscpy(drvinfo->driver, KBUILD_MODNAME, sizeof(drvinfo->driver));
48-
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
49-
"%d.%d.%04d (%.16s)",
50-
fw_rev_maj(mdev), fw_rev_min(mdev), fw_rev_sub(mdev),
51-
mdev->board_id);
49+
count = snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
50+
"%d.%d.%04d (%.16s)", fw_rev_maj(mdev),
51+
fw_rev_min(mdev), fw_rev_sub(mdev), mdev->board_id);
52+
if (count == sizeof(drvinfo->fw_version))
53+
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
54+
"%d.%d.%04d", fw_rev_maj(mdev),
55+
fw_rev_min(mdev), fw_rev_sub(mdev));
56+
5257
strscpy(drvinfo->bus_info, dev_name(mdev->device),
5358
sizeof(drvinfo->bus_info));
5459
}

drivers/net/ethernet/mellanox/mlx5/core/en_rep.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,17 @@ static void mlx5e_rep_get_drvinfo(struct net_device *dev,
7171
{
7272
struct mlx5e_priv *priv = netdev_priv(dev);
7373
struct mlx5_core_dev *mdev = priv->mdev;
74+
int count;
7475

7576
strscpy(drvinfo->driver, mlx5e_rep_driver_name,
7677
sizeof(drvinfo->driver));
77-
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
78-
"%d.%d.%04d (%.16s)",
79-
fw_rev_maj(mdev), fw_rev_min(mdev),
80-
fw_rev_sub(mdev), mdev->board_id);
78+
count = snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
79+
"%d.%d.%04d (%.16s)", fw_rev_maj(mdev),
80+
fw_rev_min(mdev), fw_rev_sub(mdev), mdev->board_id);
81+
if (count == sizeof(drvinfo->fw_version))
82+
snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version),
83+
"%d.%d.%04d", fw_rev_maj(mdev),
84+
fw_rev_min(mdev), fw_rev_sub(mdev));
8185
}
8286

8387
static const struct counter_desc sw_rep_stats_desc[] = {

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3147,7 +3147,7 @@ static struct mlx5_fields fields[] = {
31473147
OFFLOAD(DIPV6_31_0, 32, U32_MAX, ip6.daddr.s6_addr32[3], 0,
31483148
dst_ipv4_dst_ipv6.ipv6_layout.ipv6[12]),
31493149
OFFLOAD(IPV6_HOPLIMIT, 8, U8_MAX, ip6.hop_limit, 0, ttl_hoplimit),
3150-
OFFLOAD(IP_DSCP, 16, 0xc00f, ip6, 0, ip_dscp),
3150+
OFFLOAD(IP_DSCP, 16, 0x0fc0, ip6, 0, ip_dscp),
31513151

31523152
OFFLOAD(TCP_SPORT, 16, U16_MAX, tcp.source, 0, tcp_sport),
31533153
OFFLOAD(TCP_DPORT, 16, U16_MAX, tcp.dest, 0, tcp_dport),
@@ -3158,21 +3158,31 @@ static struct mlx5_fields fields[] = {
31583158
OFFLOAD(UDP_DPORT, 16, U16_MAX, udp.dest, 0, udp_dport),
31593159
};
31603160

3161-
static unsigned long mask_to_le(unsigned long mask, int size)
3161+
static u32 mask_field_get(void *mask, struct mlx5_fields *f)
31623162
{
3163-
__be32 mask_be32;
3164-
__be16 mask_be16;
3165-
3166-
if (size == 32) {
3167-
mask_be32 = (__force __be32)(mask);
3168-
mask = (__force unsigned long)cpu_to_le32(be32_to_cpu(mask_be32));
3169-
} else if (size == 16) {
3170-
mask_be32 = (__force __be32)(mask);
3171-
mask_be16 = *(__be16 *)&mask_be32;
3172-
mask = (__force unsigned long)cpu_to_le16(be16_to_cpu(mask_be16));
3163+
switch (f->field_bsize) {
3164+
case 32:
3165+
return be32_to_cpu(*(__be32 *)mask) & f->field_mask;
3166+
case 16:
3167+
return be16_to_cpu(*(__be16 *)mask) & (u16)f->field_mask;
3168+
default:
3169+
return *(u8 *)mask & (u8)f->field_mask;
31733170
}
3171+
}
31743172

3175-
return mask;
3173+
static void mask_field_clear(void *mask, struct mlx5_fields *f)
3174+
{
3175+
switch (f->field_bsize) {
3176+
case 32:
3177+
*(__be32 *)mask &= ~cpu_to_be32(f->field_mask);
3178+
break;
3179+
case 16:
3180+
*(__be16 *)mask &= ~cpu_to_be16((u16)f->field_mask);
3181+
break;
3182+
default:
3183+
*(u8 *)mask &= ~(u8)f->field_mask;
3184+
break;
3185+
}
31763186
}
31773187

31783188
static int offload_pedit_fields(struct mlx5e_priv *priv,
@@ -3184,11 +3194,12 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
31843194
struct pedit_headers *set_masks, *add_masks, *set_vals, *add_vals;
31853195
struct pedit_headers_action *hdrs = parse_attr->hdrs;
31863196
void *headers_c, *headers_v, *action, *vals_p;
3187-
u32 *s_masks_p, *a_masks_p, s_mask, a_mask;
31883197
struct mlx5e_tc_mod_hdr_acts *mod_acts;
3189-
unsigned long mask, field_mask;
3198+
void *s_masks_p, *a_masks_p;
31903199
int i, first, last, next_z;
31913200
struct mlx5_fields *f;
3201+
unsigned long mask;
3202+
u32 s_mask, a_mask;
31923203
u8 cmd;
31933204

31943205
mod_acts = &parse_attr->mod_hdr_acts;
@@ -3204,15 +3215,11 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
32043215
bool skip;
32053216

32063217
f = &fields[i];
3207-
/* avoid seeing bits set from previous iterations */
3208-
s_mask = 0;
3209-
a_mask = 0;
3210-
32113218
s_masks_p = (void *)set_masks + f->offset;
32123219
a_masks_p = (void *)add_masks + f->offset;
32133220

3214-
s_mask = *s_masks_p & f->field_mask;
3215-
a_mask = *a_masks_p & f->field_mask;
3221+
s_mask = mask_field_get(s_masks_p, f);
3222+
a_mask = mask_field_get(a_masks_p, f);
32163223

32173224
if (!s_mask && !a_mask) /* nothing to offload here */
32183225
continue;
@@ -3239,22 +3246,20 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
32393246
match_mask, f->field_bsize))
32403247
skip = true;
32413248
/* clear to denote we consumed this field */
3242-
*s_masks_p &= ~f->field_mask;
3249+
mask_field_clear(s_masks_p, f);
32433250
} else {
32443251
cmd = MLX5_ACTION_TYPE_ADD;
32453252
mask = a_mask;
32463253
vals_p = (void *)add_vals + f->offset;
32473254
/* add 0 is no change */
3248-
if ((*(u32 *)vals_p & f->field_mask) == 0)
3255+
if (!mask_field_get(vals_p, f))
32493256
skip = true;
32503257
/* clear to denote we consumed this field */
3251-
*a_masks_p &= ~f->field_mask;
3258+
mask_field_clear(a_masks_p, f);
32523259
}
32533260
if (skip)
32543261
continue;
32553262

3256-
mask = mask_to_le(mask, f->field_bsize);
3257-
32583263
first = find_first_bit(&mask, f->field_bsize);
32593264
next_z = find_next_zero_bit(&mask, f->field_bsize, first);
32603265
last = find_last_bit(&mask, f->field_bsize);
@@ -3281,10 +3286,9 @@ static int offload_pedit_fields(struct mlx5e_priv *priv,
32813286
MLX5_SET(set_action_in, action, field, f->field);
32823287

32833288
if (cmd == MLX5_ACTION_TYPE_SET) {
3289+
unsigned long field_mask = f->field_mask;
32843290
int start;
32853291

3286-
field_mask = mask_to_le(f->field_mask, f->field_bsize);
3287-
32883292
/* if field is bit sized it can start not from first bit */
32893293
start = find_first_bit(&field_mask, f->field_bsize);
32903294

drivers/net/ethernet/mellanox/mlx5/core/en_tx.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -399,9 +399,9 @@ mlx5e_txwqe_complete(struct mlx5e_txqsq *sq, struct sk_buff *skb,
399399
u8 metadata_index = be32_to_cpu(eseg->flow_table_metadata);
400400

401401
mlx5e_skb_cb_hwtstamp_init(skb);
402-
mlx5e_ptpsq_track_metadata(sq->ptpsq, metadata_index);
403402
mlx5e_ptp_metadata_map_put(&sq->ptpsq->metadata_map, skb,
404403
metadata_index);
404+
mlx5e_ptpsq_track_metadata(sq->ptpsq, metadata_index);
405405
if (!netif_tx_queue_stopped(sq->txq) &&
406406
mlx5e_ptpsq_metadata_freelist_empty(sq->ptpsq)) {
407407
netif_tx_stop_queue(sq->txq);
@@ -494,10 +494,10 @@ mlx5e_sq_xmit_wqe(struct mlx5e_txqsq *sq, struct sk_buff *skb,
494494

495495
err_drop:
496496
stats->dropped++;
497-
dev_kfree_skb_any(skb);
498497
if (unlikely(sq->ptpsq && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)))
499498
mlx5e_ptp_metadata_fifo_push(&sq->ptpsq->metadata_freelist,
500499
be32_to_cpu(eseg->flow_table_metadata));
500+
dev_kfree_skb_any(skb);
501501
mlx5e_tx_flush(sq);
502502
}
503503

0 commit comments

Comments
 (0)