Skip to content

Commit 045e42f

Browse files
committed
Merge tag 'mlx5-updates-2020-09-15' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5-updates-2020-09-15 Various updates to mlx5 driver, 1) Eli adds support for TC trap action. 2) Eran, minor improvements to clock.c code structure 3) Better handling of error reporting in LAG from Jianbo 4) IPv6 traffic class (DSCP) header rewrite support from Maor 5) Ofer Levi adds support for CQE compression of multi-strides packets 6) Vu, Enables use of vport meta data by default. 7) Some minor code cleanup ==================== Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
2 parents 897dccb + b7cf080 commit 045e42f

File tree

13 files changed

+181
-89
lines changed

13 files changed

+181
-89
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ enum {
265265
MLX5E_RQ_STATE_NO_CSUM_COMPLETE,
266266
MLX5E_RQ_STATE_CSUM_FULL, /* cqe_csum_full hw bit is set */
267267
MLX5E_RQ_STATE_FPGA_TLS, /* FPGA TLS enabled */
268+
MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX /* set when mini_cqe_resp_stride_index cap is used */
268269
};
269270

270271
struct mlx5e_cq {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,8 +242,8 @@ static int mlx5e_health_rsc_fmsg_binary(struct devlink_fmsg *fmsg,
242242

243243
{
244244
u32 data_size;
245+
int err = 0;
245246
u32 offset;
246-
int err;
247247

248248
for (offset = 0; offset < value_len; offset += data_size) {
249249
data_size = value_len - offset;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,6 @@ int mlx5e_ethtool_get_sset_count(struct mlx5e_priv *priv, int sset)
243243
return MLX5E_NUM_PFLAGS;
244244
case ETH_SS_TEST:
245245
return mlx5e_self_test_num(priv);
246-
fallthrough;
247246
default:
248247
return -EOPNOTSUPP;
249248
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,13 @@ int mlx5e_open_rq(struct mlx5e_channel *c, struct mlx5e_params *params,
848848
if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_NO_CSUM_COMPLETE) || c->xdp)
849849
__set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
850850

851+
/* For CQE compression on striding RQ, use stride index provided by
852+
* HW if capability is supported.
853+
*/
854+
if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_STRIDING_RQ) &&
855+
MLX5_CAP_GEN(c->mdev, mini_cqe_resp_stride_index))
856+
__set_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &c->rq.state);
857+
851858
return 0;
852859

853860
err_destroy_rq:
@@ -2182,21 +2189,24 @@ void mlx5e_build_rx_cq_param(struct mlx5e_priv *priv,
21822189
struct mlx5e_cq_param *param)
21832190
{
21842191
struct mlx5_core_dev *mdev = priv->mdev;
2192+
bool hw_stridx = false;
21852193
void *cqc = param->cqc;
21862194
u8 log_cq_size;
21872195

21882196
switch (params->rq_wq_type) {
21892197
case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ:
21902198
log_cq_size = mlx5e_mpwqe_get_log_rq_size(params, xsk) +
21912199
mlx5e_mpwqe_get_log_num_strides(mdev, params, xsk);
2200+
hw_stridx = MLX5_CAP_GEN(mdev, mini_cqe_resp_stride_index);
21922201
break;
21932202
default: /* MLX5_WQ_TYPE_CYCLIC */
21942203
log_cq_size = params->log_rq_mtu_frames;
21952204
}
21962205

21972206
MLX5_SET(cqc, cqc, log_cq_size, log_cq_size);
21982207
if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_CQE_COMPRESS)) {
2199-
MLX5_SET(cqc, cqc, mini_cqe_res_format, MLX5_CQE_FORMAT_CSUM);
2208+
MLX5_SET(cqc, cqc, mini_cqe_res_format, hw_stridx ?
2209+
MLX5_CQE_FORMAT_CSUM_STRIDX : MLX5_CQE_FORMAT_CSUM);
22002210
MLX5_SET(cqc, cqc, cqe_comp_en, 1);
22012211
}
22022212

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,17 @@ static inline void mlx5e_decompress_cqe(struct mlx5e_rq *rq,
137137
title->check_sum = mini_cqe->checksum;
138138
title->op_own &= 0xf0;
139139
title->op_own |= 0x01 & (cqcc >> wq->fbc.log_sz);
140-
title->wqe_counter = cpu_to_be16(cqd->wqe_counter);
141140

141+
/* state bit set implies linked-list striding RQ wq type and
142+
* HW stride index capability supported
143+
*/
144+
if (test_bit(MLX5E_RQ_STATE_MINI_CQE_HW_STRIDX, &rq->state)) {
145+
title->wqe_counter = mini_cqe->stridx;
146+
return;
147+
}
148+
149+
/* HW stride index capability not supported */
150+
title->wqe_counter = cpu_to_be16(cqd->wqe_counter);
142151
if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ)
143152
cqd->wqe_counter += mpwrq_get_cqe_consumed_strides(title);
144153
else

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2615,6 +2615,7 @@ static struct mlx5_fields fields[] = {
26152615
OFFLOAD(DIPV6_31_0, 32, U32_MAX, ip6.daddr.s6_addr32[3], 0,
26162616
dst_ipv4_dst_ipv6.ipv6_layout.ipv6[12]),
26172617
OFFLOAD(IPV6_HOPLIMIT, 8, U8_MAX, ip6.hop_limit, 0, ttl_hoplimit),
2618+
OFFLOAD(IP_DSCP, 16, 0xc00f, ip6, 0, ip_dscp),
26182619

26192620
OFFLOAD(TCP_SPORT, 16, U16_MAX, tcp.source, 0, tcp_sport),
26202621
OFFLOAD(TCP_DPORT, 16, U16_MAX, tcp.dest, 0, tcp_dport),
@@ -3943,6 +3944,16 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv,
39433944
action |= MLX5_FLOW_CONTEXT_ACTION_DROP |
39443945
MLX5_FLOW_CONTEXT_ACTION_COUNT;
39453946
break;
3947+
case FLOW_ACTION_TRAP:
3948+
if (!flow_offload_has_one_action(flow_action)) {
3949+
NL_SET_ERR_MSG_MOD(extack,
3950+
"action trap is supported as a sole action only");
3951+
return -EOPNOTSUPP;
3952+
}
3953+
action |= (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST |
3954+
MLX5_FLOW_CONTEXT_ACTION_COUNT);
3955+
attr->flags |= MLX5_ESW_ATTR_FLAG_SLOW_PATH;
3956+
break;
39463957
case FLOW_ACTION_MPLS_PUSH:
39473958
if (!MLX5_CAP_ESW_FLOWTABLE_FDB(priv->mdev,
39483959
reformat_l2_to_l3_tunnel) ||

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

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1864,18 +1864,6 @@ esw_check_vport_match_metadata_supported(const struct mlx5_eswitch *esw)
18641864
return true;
18651865
}
18661866

1867-
static bool
1868-
esw_check_vport_match_metadata_mandatory(const struct mlx5_eswitch *esw)
1869-
{
1870-
return mlx5_core_mp_enabled(esw->dev);
1871-
}
1872-
1873-
static bool esw_use_vport_metadata(const struct mlx5_eswitch *esw)
1874-
{
1875-
return esw_check_vport_match_metadata_mandatory(esw) &&
1876-
esw_check_vport_match_metadata_supported(esw);
1877-
}
1878-
18791867
u32 mlx5_esw_match_metadata_alloc(struct mlx5_eswitch *esw)
18801868
{
18811869
u32 num_vports = GENMASK(ESW_VPORT_BITS - 1, 0) - 1;
@@ -1908,9 +1896,6 @@ void mlx5_esw_match_metadata_free(struct mlx5_eswitch *esw, u32 metadata)
19081896
static int esw_offloads_vport_metadata_setup(struct mlx5_eswitch *esw,
19091897
struct mlx5_vport *vport)
19101898
{
1911-
if (vport->vport == MLX5_VPORT_UPLINK)
1912-
return 0;
1913-
19141899
vport->default_metadata = mlx5_esw_match_metadata_alloc(esw);
19151900
vport->metadata = vport->default_metadata;
19161901
return vport->metadata ? 0 : -ENOSPC;
@@ -1919,26 +1904,56 @@ static int esw_offloads_vport_metadata_setup(struct mlx5_eswitch *esw,
19191904
static void esw_offloads_vport_metadata_cleanup(struct mlx5_eswitch *esw,
19201905
struct mlx5_vport *vport)
19211906
{
1922-
if (vport->vport == MLX5_VPORT_UPLINK || !vport->default_metadata)
1907+
if (!vport->default_metadata)
19231908
return;
19241909

19251910
WARN_ON(vport->metadata != vport->default_metadata);
19261911
mlx5_esw_match_metadata_free(esw, vport->default_metadata);
19271912
}
19281913

1914+
static void esw_offloads_metadata_uninit(struct mlx5_eswitch *esw)
1915+
{
1916+
struct mlx5_vport *vport;
1917+
int i;
1918+
1919+
if (!mlx5_eswitch_vport_match_metadata_enabled(esw))
1920+
return;
1921+
1922+
mlx5_esw_for_all_vports_reverse(esw, i, vport)
1923+
esw_offloads_vport_metadata_cleanup(esw, vport);
1924+
}
1925+
1926+
static int esw_offloads_metadata_init(struct mlx5_eswitch *esw)
1927+
{
1928+
struct mlx5_vport *vport;
1929+
int err;
1930+
int i;
1931+
1932+
if (!mlx5_eswitch_vport_match_metadata_enabled(esw))
1933+
return 0;
1934+
1935+
mlx5_esw_for_all_vports(esw, i, vport) {
1936+
err = esw_offloads_vport_metadata_setup(esw, vport);
1937+
if (err)
1938+
goto metadata_err;
1939+
}
1940+
1941+
return 0;
1942+
1943+
metadata_err:
1944+
esw_offloads_metadata_uninit(esw);
1945+
return err;
1946+
}
1947+
19291948
int
19301949
esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
19311950
struct mlx5_vport *vport)
19321951
{
19331952
int err;
19341953

1935-
err = esw_offloads_vport_metadata_setup(esw, vport);
1936-
if (err)
1937-
goto metadata_err;
1938-
19391954
err = esw_acl_ingress_ofld_setup(esw, vport);
19401955
if (err)
1941-
goto ingress_err;
1956+
return err;
19421957

19431958
if (mlx5_eswitch_is_vf_vport(esw, vport->vport)) {
19441959
err = esw_acl_egress_ofld_setup(esw, vport);
@@ -1950,9 +1965,6 @@ esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
19501965

19511966
egress_err:
19521967
esw_acl_ingress_ofld_cleanup(esw, vport);
1953-
ingress_err:
1954-
esw_offloads_vport_metadata_cleanup(esw, vport);
1955-
metadata_err:
19561968
return err;
19571969
}
19581970

@@ -1962,22 +1974,14 @@ esw_vport_destroy_offloads_acl_tables(struct mlx5_eswitch *esw,
19621974
{
19631975
esw_acl_egress_ofld_cleanup(vport);
19641976
esw_acl_ingress_ofld_cleanup(esw, vport);
1965-
esw_offloads_vport_metadata_cleanup(esw, vport);
19661977
}
19671978

19681979
static int esw_create_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
19691980
{
19701981
struct mlx5_vport *vport;
1971-
int err;
1972-
1973-
if (esw_use_vport_metadata(esw))
1974-
esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
19751982

19761983
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_UPLINK);
1977-
err = esw_vport_create_offloads_acl_tables(esw, vport);
1978-
if (err)
1979-
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
1980-
return err;
1984+
return esw_vport_create_offloads_acl_tables(esw, vport);
19811985
}
19821986

19831987
static void esw_destroy_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
@@ -1986,7 +1990,6 @@ static void esw_destroy_uplink_offloads_acl_tables(struct mlx5_eswitch *esw)
19861990

19871991
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_UPLINK);
19881992
esw_vport_destroy_offloads_acl_tables(esw, vport);
1989-
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
19901993
}
19911994

19921995
static int esw_offloads_steering_init(struct mlx5_eswitch *esw)
@@ -2144,7 +2147,14 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
21442147

21452148
err = mlx5_esw_host_number_init(esw);
21462149
if (err)
2147-
goto err_vport_metadata;
2150+
goto err_metadata;
2151+
2152+
if (esw_check_vport_match_metadata_supported(esw))
2153+
esw->flags |= MLX5_ESWITCH_VPORT_MATCH_METADATA;
2154+
2155+
err = esw_offloads_metadata_init(esw);
2156+
if (err)
2157+
goto err_metadata;
21482158

21492159
err = esw_set_passing_vport_metadata(esw, true);
21502160
if (err)
@@ -2178,6 +2188,9 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
21782188
err_steering_init:
21792189
esw_set_passing_vport_metadata(esw, false);
21802190
err_vport_metadata:
2191+
esw_offloads_metadata_uninit(esw);
2192+
err_metadata:
2193+
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
21812194
mlx5_rdma_disable_roce(esw->dev);
21822195
mutex_destroy(&esw->offloads.termtbl_mutex);
21832196
return err;
@@ -2211,6 +2224,8 @@ void esw_offloads_disable(struct mlx5_eswitch *esw)
22112224
esw_offloads_unload_rep(esw, MLX5_VPORT_UPLINK);
22122225
esw_set_passing_vport_metadata(esw, false);
22132226
esw_offloads_steering_cleanup(esw);
2227+
esw_offloads_metadata_uninit(esw);
2228+
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
22142229
mlx5_rdma_disable_roce(esw->dev);
22152230
mutex_destroy(&esw->offloads.termtbl_mutex);
22162231
esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE;

0 commit comments

Comments
 (0)