Skip to content

Commit e63b162

Browse files
committed
Merge branch 'net-mlx5-support-disabling-host-pfs'
Tariq Toukan says: ==================== net/mlx5: Support disabling host PFs This small series by Daniel adds support for disabling host PFs. If device is capable and configured, the driver won't access vports of disabled host functions. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents d0f1107 + 520369e commit e63b162

File tree

3 files changed

+90
-37
lines changed

3 files changed

+90
-37
lines changed

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

Lines changed: 62 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,6 +1038,25 @@ const u32 *mlx5_esw_query_functions(struct mlx5_core_dev *dev)
10381038
return ERR_PTR(err);
10391039
}
10401040

1041+
static int mlx5_esw_host_functions_enabled_query(struct mlx5_eswitch *esw)
1042+
{
1043+
const u32 *query_host_out;
1044+
1045+
if (!mlx5_core_is_ecpf_esw_manager(esw->dev))
1046+
return 0;
1047+
1048+
query_host_out = mlx5_esw_query_functions(esw->dev);
1049+
if (IS_ERR(query_host_out))
1050+
return PTR_ERR(query_host_out);
1051+
1052+
esw->esw_funcs.host_funcs_disabled =
1053+
MLX5_GET(query_esw_functions_out, query_host_out,
1054+
host_params_context.host_pf_not_exist);
1055+
1056+
kvfree(query_host_out);
1057+
return 0;
1058+
}
1059+
10411060
static void mlx5_eswitch_event_handler_register(struct mlx5_eswitch *esw)
10421061
{
10431062
if (esw->mode == MLX5_ESWITCH_OFFLOADS && mlx5_eswitch_is_funcs_handler(esw->dev)) {
@@ -1278,17 +1297,19 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
12781297
esw->mode == MLX5_ESWITCH_LEGACY;
12791298

12801299
/* Enable PF vport */
1281-
if (pf_needed) {
1300+
if (pf_needed && mlx5_esw_host_functions_enabled(esw->dev)) {
12821301
ret = mlx5_eswitch_load_pf_vf_vport(esw, MLX5_VPORT_PF,
12831302
enabled_events);
12841303
if (ret)
12851304
return ret;
12861305
}
12871306

1288-
/* Enable external host PF HCA */
1289-
ret = host_pf_enable_hca(esw->dev);
1290-
if (ret)
1291-
goto pf_hca_err;
1307+
if (mlx5_esw_host_functions_enabled(esw->dev)) {
1308+
/* Enable external host PF HCA */
1309+
ret = host_pf_enable_hca(esw->dev);
1310+
if (ret)
1311+
goto pf_hca_err;
1312+
}
12921313

12931314
/* Enable ECPF vport */
12941315
if (mlx5_ecpf_vport_exists(esw->dev)) {
@@ -1320,9 +1341,10 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
13201341
if (mlx5_ecpf_vport_exists(esw->dev))
13211342
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
13221343
ecpf_err:
1323-
host_pf_disable_hca(esw->dev);
1344+
if (mlx5_esw_host_functions_enabled(esw->dev))
1345+
host_pf_disable_hca(esw->dev);
13241346
pf_hca_err:
1325-
if (pf_needed)
1347+
if (pf_needed && mlx5_esw_host_functions_enabled(esw->dev))
13261348
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
13271349
return ret;
13281350
}
@@ -1342,10 +1364,12 @@ void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw)
13421364
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_ECPF);
13431365
}
13441366

1345-
host_pf_disable_hca(esw->dev);
1367+
if (mlx5_esw_host_functions_enabled(esw->dev))
1368+
host_pf_disable_hca(esw->dev);
13461369

1347-
if (mlx5_core_is_ecpf_esw_manager(esw->dev) ||
1348-
esw->mode == MLX5_ESWITCH_LEGACY)
1370+
if ((mlx5_core_is_ecpf_esw_manager(esw->dev) ||
1371+
esw->mode == MLX5_ESWITCH_LEGACY) &&
1372+
mlx5_esw_host_functions_enabled(esw->dev))
13491373
mlx5_eswitch_unload_pf_vf_vport(esw, MLX5_VPORT_PF);
13501374
}
13511375

@@ -1674,7 +1698,8 @@ int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *
16741698
void *hca_caps;
16751699
int err;
16761700

1677-
if (!mlx5_core_is_ecpf(dev)) {
1701+
if (!mlx5_core_is_ecpf(dev) ||
1702+
!mlx5_esw_host_functions_enabled(dev)) {
16781703
*max_sfs = 0;
16791704
return 0;
16801705
}
@@ -1750,21 +1775,23 @@ static int mlx5_esw_vports_init(struct mlx5_eswitch *esw)
17501775

17511776
xa_init(&esw->vports);
17521777

1753-
err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_PF);
1754-
if (err)
1755-
goto err;
1756-
if (esw->first_host_vport == MLX5_VPORT_PF)
1757-
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
1758-
idx++;
1759-
1760-
for (i = 0; i < mlx5_core_max_vfs(dev); i++) {
1761-
err = mlx5_esw_vport_alloc(esw, idx, idx);
1778+
if (mlx5_esw_host_functions_enabled(dev)) {
1779+
err = mlx5_esw_vport_alloc(esw, idx, MLX5_VPORT_PF);
17621780
if (err)
17631781
goto err;
1764-
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_VF);
1765-
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
1782+
if (esw->first_host_vport == MLX5_VPORT_PF)
1783+
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
17661784
idx++;
1785+
for (i = 0; i < mlx5_core_max_vfs(dev); i++) {
1786+
err = mlx5_esw_vport_alloc(esw, idx, idx);
1787+
if (err)
1788+
goto err;
1789+
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_VF);
1790+
xa_set_mark(&esw->vports, idx, MLX5_ESW_VPT_HOST_FN);
1791+
idx++;
1792+
}
17671793
}
1794+
17681795
base_sf_num = mlx5_sf_start_function_id(dev);
17691796
for (i = 0; i < mlx5_sf_max_functions(dev); i++) {
17701797
err = mlx5_esw_vport_alloc(esw, idx, base_sf_num + i);
@@ -1864,6 +1891,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
18641891
goto free_esw;
18651892

18661893
esw->dev = dev;
1894+
dev->priv.eswitch = esw;
18671895
esw->manager_vport = mlx5_eswitch_manager_vport(dev);
18681896
esw->first_host_vport = mlx5_eswitch_first_host_vport_num(dev);
18691897

@@ -1874,11 +1902,14 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
18741902
goto abort;
18751903
}
18761904

1905+
err = mlx5_esw_host_functions_enabled_query(esw);
1906+
if (err)
1907+
goto abort;
1908+
18771909
err = mlx5_esw_vports_init(esw);
18781910
if (err)
18791911
goto abort;
18801912

1881-
dev->priv.eswitch = esw;
18821913
err = esw_offloads_init(esw);
18831914
if (err)
18841915
goto reps_err;
@@ -2410,3 +2441,11 @@ void mlx5_eswitch_unblock_ipsec(struct mlx5_core_dev *dev)
24102441
dev->num_ipsec_offloads--;
24112442
mutex_unlock(&esw->state_lock);
24122443
}
2444+
2445+
bool mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev)
2446+
{
2447+
if (!dev->priv.eswitch)
2448+
return true;
2449+
2450+
return !dev->priv.eswitch->esw_funcs.host_funcs_disabled;
2451+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ struct mlx5_host_work {
323323

324324
struct mlx5_esw_functions {
325325
struct mlx5_nb nb;
326+
bool host_funcs_disabled;
326327
u16 num_vfs;
327328
u16 num_ec_vfs;
328329
};
@@ -898,6 +899,7 @@ int mlx5_esw_ipsec_vf_packet_offload_set(struct mlx5_eswitch *esw, struct mlx5_v
898899
bool enable);
899900
int mlx5_esw_ipsec_vf_packet_offload_supported(struct mlx5_core_dev *dev,
900901
u16 vport_num);
902+
bool mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev);
901903
#else /* CONFIG_MLX5_ESWITCH */
902904
/* eswitch API stubs */
903905
static inline int mlx5_eswitch_init(struct mlx5_core_dev *dev) { return 0; }
@@ -965,6 +967,12 @@ static inline bool mlx5_eswitch_block_ipsec(struct mlx5_core_dev *dev)
965967
}
966968

967969
static inline void mlx5_eswitch_unblock_ipsec(struct mlx5_core_dev *dev) {}
970+
971+
static inline bool
972+
mlx5_esw_host_functions_enabled(const struct mlx5_core_dev *dev)
973+
{
974+
return true;
975+
}
968976
#endif /* CONFIG_MLX5_ESWITCH */
969977

970978
#endif /* __MLX5_ESWITCH_H__ */

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

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,7 +1213,8 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12131213
misc = MLX5_ADDR_OF(fte_match_param, spec->match_value,
12141214
misc_parameters);
12151215

1216-
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1216+
if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
1217+
mlx5_esw_host_functions_enabled(peer_dev)) {
12171218
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
12181219
esw_set_peer_miss_rule_source_port(esw, peer_esw, spec,
12191220
MLX5_VPORT_PF);
@@ -1239,19 +1240,21 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12391240
flows[peer_vport->index] = flow;
12401241
}
12411242

1242-
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1243-
mlx5_core_max_vfs(peer_dev)) {
1244-
esw_set_peer_miss_rule_source_port(esw,
1245-
peer_esw,
1246-
spec, peer_vport->vport);
1243+
if (mlx5_esw_host_functions_enabled(esw->dev)) {
1244+
mlx5_esw_for_each_vf_vport(peer_esw, i, peer_vport,
1245+
mlx5_core_max_vfs(peer_dev)) {
1246+
esw_set_peer_miss_rule_source_port(esw, peer_esw,
1247+
spec,
1248+
peer_vport->vport);
12471249

1248-
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
1249-
spec, &flow_act, &dest, 1);
1250-
if (IS_ERR(flow)) {
1251-
err = PTR_ERR(flow);
1252-
goto add_vf_flow_err;
1250+
flow = mlx5_add_flow_rules(mlx5_eswitch_get_slow_fdb(esw),
1251+
spec, &flow_act, &dest, 1);
1252+
if (IS_ERR(flow)) {
1253+
err = PTR_ERR(flow);
1254+
goto add_vf_flow_err;
1255+
}
1256+
flows[peer_vport->index] = flow;
12531257
}
1254-
flows[peer_vport->index] = flow;
12551258
}
12561259

12571260
if (mlx5_core_ec_sriov_enabled(peer_dev)) {
@@ -1301,7 +1304,9 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
13011304
mlx5_del_flow_rules(flows[peer_vport->index]);
13021305
}
13031306
add_ecpf_flow_err:
1304-
if (mlx5_core_is_ecpf_esw_manager(peer_dev)) {
1307+
1308+
if (mlx5_core_is_ecpf_esw_manager(peer_dev) &&
1309+
mlx5_esw_host_functions_enabled(peer_dev)) {
13051310
peer_vport = mlx5_eswitch_get_vport(peer_esw, MLX5_VPORT_PF);
13061311
mlx5_del_flow_rules(flows[peer_vport->index]);
13071312
}
@@ -4059,7 +4064,8 @@ mlx5_eswitch_vport_has_rep(const struct mlx5_eswitch *esw, u16 vport_num)
40594064
{
40604065
/* Currently, only ECPF based device has representor for host PF. */
40614066
if (vport_num == MLX5_VPORT_PF &&
4062-
!mlx5_core_is_ecpf_esw_manager(esw->dev))
4067+
(!mlx5_core_is_ecpf_esw_manager(esw->dev) ||
4068+
!mlx5_esw_host_functions_enabled(esw->dev)))
40634069
return false;
40644070

40654071
if (vport_num == MLX5_VPORT_ECPF &&

0 commit comments

Comments
 (0)