Skip to content

Commit 4326d04

Browse files
committed
Merge tag 'mlx5-fixes-2021-11-30' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5 fixes 2021-11-30 This series provides bug fixes to mlx5 driver. Please pull and let me know if there is any problem. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 74b95b0 + 8c8cf03 commit 4326d04

File tree

15 files changed

+97
-61
lines changed

15 files changed

+97
-61
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
341341
case MLX5_CMD_OP_DEALLOC_SF:
342342
case MLX5_CMD_OP_DESTROY_UCTX:
343343
case MLX5_CMD_OP_DESTROY_UMEM:
344+
case MLX5_CMD_OP_MODIFY_RQT:
344345
return MLX5_CMD_STAT_OK;
345346

346347
case MLX5_CMD_OP_QUERY_HCA_CAP:
@@ -446,7 +447,6 @@ static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
446447
case MLX5_CMD_OP_MODIFY_TIS:
447448
case MLX5_CMD_OP_QUERY_TIS:
448449
case MLX5_CMD_OP_CREATE_RQT:
449-
case MLX5_CMD_OP_MODIFY_RQT:
450450
case MLX5_CMD_OP_QUERY_RQT:
451451

452452
case MLX5_CMD_OP_CREATE_FLOW_TABLE:

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

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ struct mlx5e_rx_res {
1313
unsigned int max_nch;
1414
u32 drop_rqn;
1515

16+
struct mlx5e_packet_merge_param pkt_merge_param;
17+
struct rw_semaphore pkt_merge_param_sem;
18+
1619
struct mlx5e_rss *rss[MLX5E_MAX_NUM_RSS];
1720
bool rss_active;
1821
u32 rss_rqns[MLX5E_INDIR_RQT_SIZE];
@@ -392,6 +395,7 @@ static int mlx5e_rx_res_ptp_init(struct mlx5e_rx_res *res)
392395
if (err)
393396
goto out;
394397

398+
/* Separated from the channels RQs, does not share pkt_merge state with them */
395399
mlx5e_tir_builder_build_rqt(builder, res->mdev->mlx5e_res.hw_objs.td.tdn,
396400
mlx5e_rqt_get_rqtn(&res->ptp.rqt),
397401
inner_ft_support);
@@ -447,6 +451,9 @@ int mlx5e_rx_res_init(struct mlx5e_rx_res *res, struct mlx5_core_dev *mdev,
447451
res->max_nch = max_nch;
448452
res->drop_rqn = drop_rqn;
449453

454+
res->pkt_merge_param = *init_pkt_merge_param;
455+
init_rwsem(&res->pkt_merge_param_sem);
456+
450457
err = mlx5e_rx_res_rss_init_def(res, init_pkt_merge_param, init_nch);
451458
if (err)
452459
goto err_out;
@@ -513,7 +520,7 @@ u32 mlx5e_rx_res_get_tirn_ptp(struct mlx5e_rx_res *res)
513520
return mlx5e_tir_get_tirn(&res->ptp.tir);
514521
}
515522

516-
u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
523+
static u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix)
517524
{
518525
return mlx5e_rqt_get_rqtn(&res->channels[ix].direct_rqt);
519526
}
@@ -656,6 +663,9 @@ int mlx5e_rx_res_packet_merge_set_param(struct mlx5e_rx_res *res,
656663
if (!builder)
657664
return -ENOMEM;
658665

666+
down_write(&res->pkt_merge_param_sem);
667+
res->pkt_merge_param = *pkt_merge_param;
668+
659669
mlx5e_tir_builder_build_packet_merge(builder, pkt_merge_param);
660670

661671
final_err = 0;
@@ -681,6 +691,7 @@ int mlx5e_rx_res_packet_merge_set_param(struct mlx5e_rx_res *res,
681691
}
682692
}
683693

694+
up_write(&res->pkt_merge_param_sem);
684695
mlx5e_tir_builder_free(builder);
685696
return final_err;
686697
}
@@ -689,3 +700,31 @@ struct mlx5e_rss_params_hash mlx5e_rx_res_get_current_hash(struct mlx5e_rx_res *
689700
{
690701
return mlx5e_rss_get_hash(res->rss[0]);
691702
}
703+
704+
int mlx5e_rx_res_tls_tir_create(struct mlx5e_rx_res *res, unsigned int rxq,
705+
struct mlx5e_tir *tir)
706+
{
707+
bool inner_ft_support = res->features & MLX5E_RX_RES_FEATURE_INNER_FT;
708+
struct mlx5e_tir_builder *builder;
709+
u32 rqtn;
710+
int err;
711+
712+
builder = mlx5e_tir_builder_alloc(false);
713+
if (!builder)
714+
return -ENOMEM;
715+
716+
rqtn = mlx5e_rx_res_get_rqtn_direct(res, rxq);
717+
718+
mlx5e_tir_builder_build_rqt(builder, res->mdev->mlx5e_res.hw_objs.td.tdn, rqtn,
719+
inner_ft_support);
720+
mlx5e_tir_builder_build_direct(builder);
721+
mlx5e_tir_builder_build_tls(builder);
722+
down_read(&res->pkt_merge_param_sem);
723+
mlx5e_tir_builder_build_packet_merge(builder, &res->pkt_merge_param);
724+
err = mlx5e_tir_init(tir, builder, res->mdev, false);
725+
up_read(&res->pkt_merge_param_sem);
726+
727+
mlx5e_tir_builder_free(builder);
728+
729+
return err;
730+
}

drivers/net/ethernet/mellanox/mlx5/core/en/rx_res.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ u32 mlx5e_rx_res_get_tirn_rss(struct mlx5e_rx_res *res, enum mlx5_traffic_types
3737
u32 mlx5e_rx_res_get_tirn_rss_inner(struct mlx5e_rx_res *res, enum mlx5_traffic_types tt);
3838
u32 mlx5e_rx_res_get_tirn_ptp(struct mlx5e_rx_res *res);
3939

40-
/* RQTN getters for modules that create their own TIRs */
41-
u32 mlx5e_rx_res_get_rqtn_direct(struct mlx5e_rx_res *res, unsigned int ix);
42-
4340
/* Activate/deactivate API */
4441
void mlx5e_rx_res_channels_activate(struct mlx5e_rx_res *res, struct mlx5e_channels *chs);
4542
void mlx5e_rx_res_channels_deactivate(struct mlx5e_rx_res *res);
@@ -69,4 +66,7 @@ struct mlx5e_rss *mlx5e_rx_res_rss_get(struct mlx5e_rx_res *res, u32 rss_idx);
6966
/* Workaround for hairpin */
7067
struct mlx5e_rss_params_hash mlx5e_rx_res_get_current_hash(struct mlx5e_rx_res *res);
7168

69+
/* Accel TIRs */
70+
int mlx5e_rx_res_tls_tir_create(struct mlx5e_rx_res *res, unsigned int rxq,
71+
struct mlx5e_tir *tir);
7272
#endif /* __MLX5_EN_RX_RES_H__ */

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ static void mlx5e_ipsec_set_swp(struct sk_buff *skb,
191191
eseg->swp_inner_l3_offset = skb_inner_network_offset(skb) / 2;
192192
eseg->swp_inner_l4_offset =
193193
(skb->csum_start + skb->head - skb->data) / 2;
194-
if (skb->protocol == htons(ETH_P_IPV6))
194+
if (inner_ip_hdr(skb)->version == 6)
195195
eseg->swp_flags |= MLX5_ETH_WQE_SWP_INNER_L3_IPV6;
196196
break;
197197
default:

drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_rx.c

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -100,25 +100,6 @@ mlx5e_ktls_rx_resync_create_resp_list(void)
100100
return resp_list;
101101
}
102102

103-
static int mlx5e_ktls_create_tir(struct mlx5_core_dev *mdev, struct mlx5e_tir *tir, u32 rqtn)
104-
{
105-
struct mlx5e_tir_builder *builder;
106-
int err;
107-
108-
builder = mlx5e_tir_builder_alloc(false);
109-
if (!builder)
110-
return -ENOMEM;
111-
112-
mlx5e_tir_builder_build_rqt(builder, mdev->mlx5e_res.hw_objs.td.tdn, rqtn, false);
113-
mlx5e_tir_builder_build_direct(builder);
114-
mlx5e_tir_builder_build_tls(builder);
115-
err = mlx5e_tir_init(tir, builder, mdev, false);
116-
117-
mlx5e_tir_builder_free(builder);
118-
119-
return err;
120-
}
121-
122103
static void accel_rule_handle_work(struct work_struct *work)
123104
{
124105
struct mlx5e_ktls_offload_context_rx *priv_rx;
@@ -609,7 +590,6 @@ int mlx5e_ktls_add_rx(struct net_device *netdev, struct sock *sk,
609590
struct mlx5_core_dev *mdev;
610591
struct mlx5e_priv *priv;
611592
int rxq, err;
612-
u32 rqtn;
613593

614594
tls_ctx = tls_get_ctx(sk);
615595
priv = netdev_priv(netdev);
@@ -635,9 +615,7 @@ int mlx5e_ktls_add_rx(struct net_device *netdev, struct sock *sk,
635615
priv_rx->sw_stats = &priv->tls->sw_stats;
636616
mlx5e_set_ktls_rx_priv_ctx(tls_ctx, priv_rx);
637617

638-
rqtn = mlx5e_rx_res_get_rqtn_direct(priv->rx_res, rxq);
639-
640-
err = mlx5e_ktls_create_tir(mdev, &priv_rx->tir, rqtn);
618+
err = mlx5e_rx_res_tls_tir_create(priv->rx_res, rxq, &priv_rx->tir);
641619
if (err)
642620
goto err_create_tir;
643621

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,10 @@ static mlx5e_stats_grp_t mlx5e_ul_rep_stats_grps[] = {
10801080
&MLX5E_STATS_GRP(pme),
10811081
&MLX5E_STATS_GRP(channels),
10821082
&MLX5E_STATS_GRP(per_port_buff_congest),
1083+
#ifdef CONFIG_MLX5_EN_IPSEC
1084+
&MLX5E_STATS_GRP(ipsec_sw),
1085+
&MLX5E_STATS_GRP(ipsec_hw),
1086+
#endif
10831087
};
10841088

10851089
static unsigned int mlx5e_ul_rep_stats_grps_num(struct mlx5e_priv *priv)

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -543,13 +543,13 @@ static int mlx5e_build_shampo_hd_umr(struct mlx5e_rq *rq,
543543
u16 klm_entries, u16 index)
544544
{
545545
struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo;
546-
u16 entries, pi, i, header_offset, err, wqe_bbs, new_entries;
546+
u16 entries, pi, header_offset, err, wqe_bbs, new_entries;
547547
u32 lkey = rq->mdev->mlx5e_res.hw_objs.mkey;
548548
struct page *page = shampo->last_page;
549549
u64 addr = shampo->last_addr;
550550
struct mlx5e_dma_info *dma_info;
551551
struct mlx5e_umr_wqe *umr_wqe;
552-
int headroom;
552+
int headroom, i;
553553

554554
headroom = rq->buff.headroom;
555555
new_entries = klm_entries - (shampo->pi & (MLX5_UMR_KLM_ALIGNMENT - 1));
@@ -601,9 +601,7 @@ static int mlx5e_build_shampo_hd_umr(struct mlx5e_rq *rq,
601601

602602
err_unmap:
603603
while (--i >= 0) {
604-
if (--index < 0)
605-
index = shampo->hd_per_wq - 1;
606-
dma_info = &shampo->info[index];
604+
dma_info = &shampo->info[--index];
607605
if (!(i & (MLX5E_SHAMPO_WQ_HEADER_PER_PAGE - 1))) {
608606
dma_info->addr = ALIGN_DOWN(dma_info->addr, PAGE_SIZE);
609607
mlx5e_page_release(rq, dma_info, true);

drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ static u32 esw_qos_calculate_min_rate_divider(struct mlx5_eswitch *esw,
130130
/* If vports min rate divider is 0 but their group has bw_share configured, then
131131
* need to set bw_share for vports to minimal value.
132132
*/
133-
if (!group_level && !max_guarantee && group->bw_share)
133+
if (!group_level && !max_guarantee && group && group->bw_share)
134134
return 1;
135135
return 0;
136136
}
@@ -423,7 +423,7 @@ static int esw_qos_vport_update_group(struct mlx5_eswitch *esw,
423423
return err;
424424

425425
/* Recalculate bw share weights of old and new groups */
426-
if (vport->qos.bw_share) {
426+
if (vport->qos.bw_share || new_group->bw_share) {
427427
esw_qos_normalize_vports_min_rate(esw, curr_group, extack);
428428
esw_qos_normalize_vports_min_rate(esw, new_group, extack);
429429
}

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -329,14 +329,25 @@ static bool
329329
esw_is_indir_table(struct mlx5_eswitch *esw, struct mlx5_flow_attr *attr)
330330
{
331331
struct mlx5_esw_flow_attr *esw_attr = attr->esw_attr;
332+
bool result = false;
332333
int i;
333334

334-
for (i = esw_attr->split_count; i < esw_attr->out_count; i++)
335+
/* Indirect table is supported only for flows with in_port uplink
336+
* and the destination is vport on the same eswitch as the uplink,
337+
* return false in case at least one of destinations doesn't meet
338+
* this criteria.
339+
*/
340+
for (i = esw_attr->split_count; i < esw_attr->out_count; i++) {
335341
if (esw_attr->dests[i].rep &&
336342
mlx5_esw_indir_table_needed(esw, attr, esw_attr->dests[i].rep->vport,
337-
esw_attr->dests[i].mdev))
338-
return true;
339-
return false;
343+
esw_attr->dests[i].mdev)) {
344+
result = true;
345+
} else {
346+
result = false;
347+
break;
348+
}
349+
}
350+
return result;
340351
}
341352

342353
static int
@@ -2512,6 +2523,7 @@ static int esw_set_master_egress_rule(struct mlx5_core_dev *master,
25122523
struct mlx5_eswitch *esw = master->priv.eswitch;
25132524
struct mlx5_flow_table_attr ft_attr = {
25142525
.max_fte = 1, .prio = 0, .level = 0,
2526+
.flags = MLX5_FLOW_TABLE_OTHER_VPORT,
25152527
};
25162528
struct mlx5_flow_namespace *egress_ns;
25172529
struct mlx5_flow_table *acl;

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -835,6 +835,9 @@ void mlx5_start_health_poll(struct mlx5_core_dev *dev)
835835

836836
health->timer.expires = jiffies + msecs_to_jiffies(poll_interval_ms);
837837
add_timer(&health->timer);
838+
839+
if (mlx5_core_is_pf(dev) && MLX5_CAP_MCAM_REG(dev, mrtc))
840+
queue_delayed_work(health->wq, &health->update_fw_log_ts_work, 0);
838841
}
839842

840843
void mlx5_stop_health_poll(struct mlx5_core_dev *dev, bool disable_health)
@@ -902,8 +905,6 @@ int mlx5_health_init(struct mlx5_core_dev *dev)
902905
INIT_WORK(&health->fatal_report_work, mlx5_fw_fatal_reporter_err_work);
903906
INIT_WORK(&health->report_work, mlx5_fw_reporter_err_work);
904907
INIT_DELAYED_WORK(&health->update_fw_log_ts_work, mlx5_health_log_ts_update);
905-
if (mlx5_core_is_pf(dev))
906-
queue_delayed_work(health->wq, &health->update_fw_log_ts_work, 0);
907908

908909
return 0;
909910

0 commit comments

Comments
 (0)