Skip to content

Commit b545a13

Browse files
committed
Merge tag 'mlx5-updates-2023-06-21' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux
Saeed Mahameed says: ==================== mlx5-updates-2023-06-21 mlx5 driver minor cleanup and fixes to net-next * tag 'mlx5-updates-2023-06-21' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5: Remove pointless vport lookup from mlx5_esw_check_port_type() net/mlx5: Remove redundant check from mlx5_esw_query_vport_vhca_id() net/mlx5: Remove redundant is_mdev_switchdev_mode() check from is_ib_rep_supported() net/mlx5: Remove redundant MLX5_ESWITCH_MANAGER() check from is_ib_rep_supported() net/mlx5e: E-Switch, Fix shared fdb error flow net/mlx5e: Remove redundant comment net/mlx5e: E-Switch, Pass other_vport flag if vport is not 0 net/mlx5e: E-Switch, Use xarray for devcom paired device index net/mlx5e: E-Switch, Add peer fdb miss rules for vport manager or ecpf net/mlx5e: Use vhca_id for device index in vport rx rules net/mlx5: Lag, Remove duplicate code checking lag is supported net/mlx5: Fix error code in mlx5_is_reset_now_capable() net/mlx5: Fix reserved at offset in hca_cap register net/mlx5: Fix SFs kernel documentation error net/mlx5: Fix UAF in mlx5_eswitch_cleanup() ==================== Link: https://lore.kernel.org/r/20230623192907.39033-1-saeed@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
2 parents 35bf34b + 29e4c95 commit b545a13

10 files changed

Lines changed: 84 additions & 68 deletions

File tree

Documentation/networking/device_drivers/ethernet/mellanox/mlx5/switchdev.rst

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,21 @@ This will allow user to configure the SF before the SF have been fully probed,
5151
which will save time.
5252

5353
Usage example:
54-
Create SF:
55-
$ devlink port add pci/0000:08:00.0 flavour pcisf pfnum 0 sfnum 11
56-
$ devlink port function set pci/0000:08:00.0/32768 \
57-
hw_addr 00:00:00:00:00:11 state active
5854

59-
Enable ETH auxiliary device:
60-
$ devlink dev param set auxiliary/mlx5_core.sf.1 \
61-
name enable_eth value true cmode driverinit
55+
- Create SF::
6256

63-
Now, in order to fully probe the SF, use devlink reload:
64-
$ devlink dev reload auxiliary/mlx5_core.sf.1
57+
$ devlink port add pci/0000:08:00.0 flavour pcisf pfnum 0 sfnum 11
58+
$ devlink port function set pci/0000:08:00.0/32768 hw_addr 00:00:00:00:00:11 state active
6559

66-
mlx5 supports ETH,rdma and vdpa (vnet) auxiliary devices devlink params (see :ref:`Documentation/networking/devlink/devlink-params.rst`)
60+
- Enable ETH auxiliary device::
61+
62+
$ devlink dev param set auxiliary/mlx5_core.sf.1 name enable_eth value true cmode driverinit
63+
64+
- Now, in order to fully probe the SF, use devlink reload::
65+
66+
$ devlink dev reload auxiliary/mlx5_core.sf.1
67+
68+
mlx5 supports ETH,rdma and vdpa (vnet) auxiliary devices devlink params (see :ref:`Documentation/networking/devlink/devlink-params.rst <devlink_params_generic>`).
6769

6870
mlx5 supports subfunction management using devlink port (see :ref:`Documentation/networking/devlink/devlink-port.rst <devlink_port>`) interface.
6971

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,12 +151,6 @@ static bool is_ib_rep_supported(struct mlx5_core_dev *dev)
151151
if (!is_eth_rep_supported(dev))
152152
return false;
153153

154-
if (!MLX5_ESWITCH_MANAGER(dev))
155-
return false;
156-
157-
if (!is_mdev_switchdev_mode(dev))
158-
return false;
159-
160154
if (mlx5_core_mp_enabled(dev))
161155
return false;
162156

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ static int mlx5e_sqs2vport_add_peers_rules(struct mlx5_eswitch *esw, struct mlx5
408408

409409
mlx5_devcom_for_each_peer_entry(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
410410
peer_esw, tmp) {
411-
int peer_rule_idx = mlx5_get_dev_index(peer_esw->dev);
411+
u16 peer_rule_idx = MLX5_CAP_GEN(peer_esw->dev, vhca_id);
412412
struct mlx5e_rep_sq_peer *sq_peer;
413413
int err;
414414

@@ -1581,7 +1581,7 @@ static void *mlx5e_vport_rep_get_proto_dev(struct mlx5_eswitch_rep *rep)
15811581
static void mlx5e_vport_rep_event_unpair(struct mlx5_eswitch_rep *rep,
15821582
struct mlx5_eswitch *peer_esw)
15831583
{
1584-
int i = mlx5_get_dev_index(peer_esw->dev);
1584+
u16 i = MLX5_CAP_GEN(peer_esw->dev, vhca_id);
15851585
struct mlx5e_rep_priv *rpriv;
15861586
struct mlx5e_rep_sq *rep_sq;
15871587

@@ -1603,7 +1603,7 @@ static int mlx5e_vport_rep_event_pair(struct mlx5_eswitch *esw,
16031603
struct mlx5_eswitch_rep *rep,
16041604
struct mlx5_eswitch *peer_esw)
16051605
{
1606-
int i = mlx5_get_dev_index(peer_esw->dev);
1606+
u16 i = MLX5_CAP_GEN(peer_esw->dev, vhca_id);
16071607
struct mlx5_flow_handle *flow_rule;
16081608
struct mlx5e_rep_sq_peer *sq_peer;
16091609
struct mlx5e_rep_priv *rpriv;

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

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,16 +1751,14 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
17511751
if (!MLX5_VPORT_MANAGER(dev) && !MLX5_ESWITCH_MANAGER(dev))
17521752
return 0;
17531753

1754+
esw = kzalloc(sizeof(*esw), GFP_KERNEL);
1755+
if (!esw)
1756+
return -ENOMEM;
1757+
17541758
err = devl_params_register(priv_to_devlink(dev), mlx5_eswitch_params,
17551759
ARRAY_SIZE(mlx5_eswitch_params));
17561760
if (err)
1757-
return err;
1758-
1759-
esw = kzalloc(sizeof(*esw), GFP_KERNEL);
1760-
if (!esw) {
1761-
err = -ENOMEM;
1762-
goto unregister_param;
1763-
}
1761+
goto free_esw;
17641762

17651763
esw->dev = dev;
17661764
esw->manager_vport = mlx5_eswitch_manager_vport(dev);
@@ -1821,10 +1819,10 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
18211819
if (esw->work_queue)
18221820
destroy_workqueue(esw->work_queue);
18231821
debugfs_remove_recursive(esw->debugfs_root);
1824-
kfree(esw);
1825-
unregister_param:
18261822
devl_params_unregister(priv_to_devlink(dev), mlx5_eswitch_params,
18271823
ARRAY_SIZE(mlx5_eswitch_params));
1824+
free_esw:
1825+
kfree(esw);
18281826
return err;
18291827
}
18301828

@@ -1848,9 +1846,9 @@ void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
18481846
esw_offloads_cleanup(esw);
18491847
mlx5_esw_vports_cleanup(esw);
18501848
debugfs_remove_recursive(esw->debugfs_root);
1851-
kfree(esw);
18521849
devl_params_unregister(priv_to_devlink(esw->dev), mlx5_eswitch_params,
18531850
ARRAY_SIZE(mlx5_eswitch_params));
1851+
kfree(esw);
18541852
}
18551853

18561854
/* Vport Administration */
@@ -1910,12 +1908,6 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
19101908

19111909
static bool mlx5_esw_check_port_type(struct mlx5_eswitch *esw, u16 vport_num, xa_mark_t mark)
19121910
{
1913-
struct mlx5_vport *vport;
1914-
1915-
vport = mlx5_eswitch_get_vport(esw, vport_num);
1916-
if (IS_ERR(vport))
1917-
return false;
1918-
19191911
return xa_get_mark(&esw->vports, vport_num, mark);
19201912
}
19211913

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ struct mlx5_eswitch {
353353
u32 large_group_num;
354354
} params;
355355
struct blocking_notifier_head n_head;
356-
bool paired[MLX5_MAX_PORTS];
356+
struct xarray paired;
357357
};
358358

359359
void esw_offloads_disable(struct mlx5_eswitch *esw);

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

Lines changed: 45 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,9 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
10691069
void *misc;
10701070
int err;
10711071

1072+
if (!MLX5_VPORT_MANAGER(esw->dev) && !mlx5_core_is_ecpf_esw_manager(esw->dev))
1073+
return 0;
1074+
10721075
spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
10731076
if (!spec)
10741077
return -ENOMEM;
@@ -1177,11 +1180,14 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
11771180
static void esw_del_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
11781181
struct mlx5_core_dev *peer_dev)
11791182
{
1183+
u16 peer_index = mlx5_get_dev_index(peer_dev);
11801184
struct mlx5_flow_handle **flows;
11811185
struct mlx5_vport *vport;
11821186
unsigned long i;
11831187

1184-
flows = esw->fdb_table.offloads.peer_miss_rules[mlx5_get_dev_index(peer_dev)];
1188+
flows = esw->fdb_table.offloads.peer_miss_rules[peer_index];
1189+
if (!flows)
1190+
return;
11851191

11861192
if (mlx5_core_ec_sriov_enabled(esw->dev)) {
11871193
mlx5_esw_for_each_ec_vf_vport(esw, i, vport, mlx5_core_max_ec_vfs(esw->dev)) {
@@ -1206,7 +1212,9 @@ static void esw_del_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12061212
vport = mlx5_eswitch_get_vport(esw, MLX5_VPORT_PF);
12071213
mlx5_del_flow_rules(flows[vport->index]);
12081214
}
1215+
12091216
kvfree(flows);
1217+
esw->fdb_table.offloads.peer_miss_rules[peer_index] = NULL;
12101218
}
12111219

12121220
static int esw_add_fdb_miss_rule(struct mlx5_eswitch *esw)
@@ -1896,7 +1904,6 @@ static int esw_create_vport_rx_group(struct mlx5_eswitch *esw)
18961904
if (!flow_group_in)
18971905
return -ENOMEM;
18981906

1899-
/* create vport rx group */
19001907
mlx5_esw_set_flow_group_source_port(esw, flow_group_in, 0);
19011908

19021909
MLX5_SET(create_flow_group_in, flow_group_in, start_flow_index, 0);
@@ -2543,13 +2550,13 @@ static int __esw_set_master_egress_rule(struct mlx5_core_dev *master,
25432550
return err;
25442551
}
25452552

2546-
static int esw_master_egress_create_resources(struct mlx5_flow_namespace *egress_ns,
2553+
static int esw_master_egress_create_resources(struct mlx5_eswitch *esw,
2554+
struct mlx5_flow_namespace *egress_ns,
25472555
struct mlx5_vport *vport, size_t count)
25482556
{
25492557
int inlen = MLX5_ST_SZ_BYTES(create_flow_group_in);
25502558
struct mlx5_flow_table_attr ft_attr = {
25512559
.max_fte = count, .prio = 0, .level = 0,
2552-
.flags = MLX5_FLOW_TABLE_OTHER_VPORT,
25532560
};
25542561
struct mlx5_flow_table *acl;
25552562
struct mlx5_flow_group *g;
@@ -2564,6 +2571,9 @@ static int esw_master_egress_create_resources(struct mlx5_flow_namespace *egress
25642571
if (!flow_group_in)
25652572
return -ENOMEM;
25662573

2574+
if (vport->vport || mlx5_core_is_ecpf(esw->dev))
2575+
ft_attr.flags = MLX5_FLOW_TABLE_OTHER_VPORT;
2576+
25672577
acl = mlx5_create_vport_flow_table(egress_ns, &ft_attr, vport->vport);
25682578
if (IS_ERR(acl)) {
25692579
err = PTR_ERR(acl);
@@ -2608,8 +2618,12 @@ static int esw_master_egress_create_resources(struct mlx5_flow_namespace *egress
26082618

26092619
static void esw_master_egress_destroy_resources(struct mlx5_vport *vport)
26102620
{
2621+
if (!xa_empty(&vport->egress.offloads.bounce_rules))
2622+
return;
26112623
mlx5_destroy_flow_group(vport->egress.offloads.bounce_grp);
2624+
vport->egress.offloads.bounce_grp = NULL;
26122625
mlx5_destroy_flow_table(vport->egress.acl);
2626+
vport->egress.acl = NULL;
26132627
}
26142628

26152629
static int esw_set_master_egress_rule(struct mlx5_core_dev *master,
@@ -2634,7 +2648,7 @@ static int esw_set_master_egress_rule(struct mlx5_core_dev *master,
26342648
if (vport->egress.acl && vport->egress.type != VPORT_EGRESS_ACL_TYPE_SHARED_FDB)
26352649
return 0;
26362650

2637-
err = esw_master_egress_create_resources(egress_ns, vport, count);
2651+
err = esw_master_egress_create_resources(esw, egress_ns, vport, count);
26382652
if (err)
26392653
return err;
26402654

@@ -2799,15 +2813,21 @@ static int mlx5_esw_offloads_devcom_event(int event,
27992813
struct mlx5_eswitch *esw = my_data;
28002814
struct mlx5_devcom *devcom = esw->dev->priv.devcom;
28012815
struct mlx5_eswitch *peer_esw = event_data;
2816+
u16 esw_i, peer_esw_i;
2817+
bool esw_paired;
28022818
int err;
28032819

2820+
peer_esw_i = MLX5_CAP_GEN(peer_esw->dev, vhca_id);
2821+
esw_i = MLX5_CAP_GEN(esw->dev, vhca_id);
2822+
esw_paired = !!xa_load(&esw->paired, peer_esw_i);
2823+
28042824
switch (event) {
28052825
case ESW_OFFLOADS_DEVCOM_PAIR:
28062826
if (mlx5_eswitch_vport_match_metadata_enabled(esw) !=
28072827
mlx5_eswitch_vport_match_metadata_enabled(peer_esw))
28082828
break;
28092829

2810-
if (esw->paired[mlx5_get_dev_index(peer_esw->dev)])
2830+
if (esw_paired)
28112831
break;
28122832

28132833
err = mlx5_esw_offloads_set_ns_peer(esw, peer_esw, true);
@@ -2821,23 +2841,29 @@ static int mlx5_esw_offloads_devcom_event(int event,
28212841
if (err)
28222842
goto err_pair;
28232843

2824-
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = true;
2825-
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = true;
2844+
err = xa_insert(&esw->paired, peer_esw_i, peer_esw, GFP_KERNEL);
2845+
if (err)
2846+
goto err_xa;
2847+
2848+
err = xa_insert(&peer_esw->paired, esw_i, esw, GFP_KERNEL);
2849+
if (err)
2850+
goto err_peer_xa;
2851+
28262852
esw->num_peers++;
28272853
peer_esw->num_peers++;
28282854
mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, true);
28292855
break;
28302856

28312857
case ESW_OFFLOADS_DEVCOM_UNPAIR:
2832-
if (!esw->paired[mlx5_get_dev_index(peer_esw->dev)])
2858+
if (!esw_paired)
28332859
break;
28342860

28352861
peer_esw->num_peers--;
28362862
esw->num_peers--;
28372863
if (!esw->num_peers && !peer_esw->num_peers)
28382864
mlx5_devcom_comp_set_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS, false);
2839-
esw->paired[mlx5_get_dev_index(peer_esw->dev)] = false;
2840-
peer_esw->paired[mlx5_get_dev_index(esw->dev)] = false;
2865+
xa_erase(&peer_esw->paired, esw_i);
2866+
xa_erase(&esw->paired, peer_esw_i);
28412867
mlx5_esw_offloads_unpair(peer_esw, esw);
28422868
mlx5_esw_offloads_unpair(esw, peer_esw);
28432869
mlx5_esw_offloads_set_ns_peer(esw, peer_esw, false);
@@ -2846,6 +2872,10 @@ static int mlx5_esw_offloads_devcom_event(int event,
28462872

28472873
return 0;
28482874

2875+
err_peer_xa:
2876+
xa_erase(&esw->paired, peer_esw_i);
2877+
err_xa:
2878+
mlx5_esw_offloads_unpair(peer_esw, esw);
28492879
err_pair:
28502880
mlx5_esw_offloads_unpair(esw, peer_esw);
28512881
err_peer:
@@ -2868,9 +2898,10 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
28682898
if (!MLX5_CAP_ESW(esw->dev, merged_eswitch))
28692899
return;
28702900

2871-
if (!mlx5_is_lag_supported(esw->dev))
2901+
if (!mlx5_lag_is_supported(esw->dev))
28722902
return;
28732903

2904+
xa_init(&esw->paired);
28742905
mlx5_devcom_register_component(devcom,
28752906
MLX5_DEVCOM_ESW_OFFLOADS,
28762907
mlx5_esw_offloads_devcom_event,
@@ -2890,14 +2921,15 @@ void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw)
28902921
if (!MLX5_CAP_ESW(esw->dev, merged_eswitch))
28912922
return;
28922923

2893-
if (!mlx5_is_lag_supported(esw->dev))
2924+
if (!mlx5_lag_is_supported(esw->dev))
28942925
return;
28952926

28962927
mlx5_devcom_send_event(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
28972928
ESW_OFFLOADS_DEVCOM_UNPAIR,
28982929
ESW_OFFLOADS_DEVCOM_UNPAIR, esw);
28992930

29002931
mlx5_devcom_unregister_component(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
2932+
xa_destroy(&esw->paired);
29012933
}
29022934

29032935
bool mlx5_esw_vport_match_metadata_supported(const struct mlx5_eswitch *esw)
@@ -3929,9 +3961,6 @@ static int mlx5_esw_query_vport_vhca_id(struct mlx5_eswitch *esw, u16 vport_num,
39293961
int err;
39303962

39313963
*vhca_id = 0;
3932-
if (mlx5_esw_is_manager_vport(esw, vport_num) ||
3933-
!MLX5_CAP_GEN(esw->dev, vhca_resource_manager))
3934-
return -EPERM;
39353964

39363965
query_ctx = kzalloc(query_out_sz, GFP_KERNEL);
39373966
if (!query_ctx)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ static bool mlx5_is_reset_now_capable(struct mlx5_core_dev *dev)
327327

328328
if (!MLX5_CAP_GEN(dev, fast_teardown)) {
329329
mlx5_core_warn(dev, "fast teardown is not supported by firmware\n");
330-
return -EOPNOTSUPP;
330+
return false;
331331
}
332332

333333
err = pci_read_config_word(dev->pdev, PCI_DEVICE_ID, &dev_id);

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1268,14 +1268,21 @@ void mlx5_lag_remove_mdev(struct mlx5_core_dev *dev)
12681268
mlx5_ldev_put(ldev);
12691269
}
12701270

1271+
bool mlx5_lag_is_supported(struct mlx5_core_dev *dev)
1272+
{
1273+
if (!MLX5_CAP_GEN(dev, vport_group_manager) ||
1274+
!MLX5_CAP_GEN(dev, lag_master) ||
1275+
MLX5_CAP_GEN(dev, num_lag_ports) < 2 ||
1276+
MLX5_CAP_GEN(dev, num_lag_ports) > MLX5_MAX_PORTS)
1277+
return false;
1278+
return true;
1279+
}
1280+
12711281
void mlx5_lag_add_mdev(struct mlx5_core_dev *dev)
12721282
{
12731283
int err;
12741284

1275-
if (!MLX5_CAP_GEN(dev, vport_group_manager) ||
1276-
!MLX5_CAP_GEN(dev, lag_master) ||
1277-
(MLX5_CAP_GEN(dev, num_lag_ports) > MLX5_MAX_PORTS ||
1278-
MLX5_CAP_GEN(dev, num_lag_ports) <= 1))
1285+
if (!mlx5_lag_is_supported(dev))
12791286
return;
12801287

12811288
recheck:

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

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,7 @@ struct mlx5_lag {
7474
struct lag_mpesw lag_mpesw;
7575
};
7676

77-
static inline bool mlx5_is_lag_supported(struct mlx5_core_dev *dev)
78-
{
79-
if (!MLX5_CAP_GEN(dev, vport_group_manager) ||
80-
!MLX5_CAP_GEN(dev, lag_master) ||
81-
MLX5_CAP_GEN(dev, num_lag_ports) < 2 ||
82-
MLX5_CAP_GEN(dev, num_lag_ports) > MLX5_MAX_PORTS)
83-
return false;
84-
return true;
85-
}
77+
bool mlx5_lag_is_supported(struct mlx5_core_dev *dev);
8678

8779
static inline struct mlx5_lag *
8880
mlx5_lag_dev(struct mlx5_core_dev *dev)

0 commit comments

Comments
 (0)