Skip to content

Commit 88d162b

Browse files
roidayanSaeed Mahameed
authored andcommitted
net/mlx5: Devcom, Infrastructure changes
Update devcom infrastructure to be more generic, without depending on max supported ports definition or a device guid, and also more encapsulated so callers don't need to pass the register devcom component id per event call. Signed-off-by: Eli Cohen <elic@nvidia.com> Signed-off-by: Roi Dayan <roid@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
1 parent 02ceda6 commit 88d162b

File tree

11 files changed

+359
-327
lines changed

11 files changed

+359
-327
lines changed

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

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -399,15 +399,13 @@ static void mlx5e_sqs2vport_stop(struct mlx5_eswitch *esw,
399399
}
400400

401401
static int mlx5e_sqs2vport_add_peers_rules(struct mlx5_eswitch *esw, struct mlx5_eswitch_rep *rep,
402-
struct mlx5_devcom *devcom,
403402
struct mlx5e_rep_sq *rep_sq, int i)
404403
{
405-
struct mlx5_eswitch *peer_esw = NULL;
406404
struct mlx5_flow_handle *flow_rule;
407-
int tmp;
405+
struct mlx5_devcom_comp_dev *tmp;
406+
struct mlx5_eswitch *peer_esw;
408407

409-
mlx5_devcom_for_each_peer_entry(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
410-
peer_esw, tmp) {
408+
mlx5_devcom_for_each_peer_entry(esw->devcom, peer_esw, tmp) {
411409
u16 peer_rule_idx = MLX5_CAP_GEN(peer_esw->dev, vhca_id);
412410
struct mlx5e_rep_sq_peer *sq_peer;
413411
int err;
@@ -443,18 +441,17 @@ static int mlx5e_sqs2vport_start(struct mlx5_eswitch *esw,
443441
struct mlx5_flow_handle *flow_rule;
444442
struct mlx5e_rep_priv *rpriv;
445443
struct mlx5e_rep_sq *rep_sq;
446-
struct mlx5_devcom *devcom;
447444
bool devcom_locked = false;
448445
int err;
449446
int i;
450447

451448
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
452449
return 0;
453450

454-
devcom = esw->dev->priv.devcom;
455451
rpriv = mlx5e_rep_to_rep_priv(rep);
456-
if (mlx5_devcom_comp_is_ready(devcom, MLX5_DEVCOM_ESW_OFFLOADS) &&
457-
mlx5_devcom_for_each_peer_begin(devcom, MLX5_DEVCOM_ESW_OFFLOADS))
452+
453+
if (mlx5_devcom_comp_is_ready(esw->devcom) &&
454+
mlx5_devcom_for_each_peer_begin(esw->devcom))
458455
devcom_locked = true;
459456

460457
for (i = 0; i < sqns_num; i++) {
@@ -477,7 +474,7 @@ static int mlx5e_sqs2vport_start(struct mlx5_eswitch *esw,
477474

478475
xa_init(&rep_sq->sq_peer);
479476
if (devcom_locked) {
480-
err = mlx5e_sqs2vport_add_peers_rules(esw, rep, devcom, rep_sq, i);
477+
err = mlx5e_sqs2vport_add_peers_rules(esw, rep, rep_sq, i);
481478
if (err) {
482479
mlx5_eswitch_del_send_to_vport_rule(rep_sq->send_to_vport_rule);
483480
xa_destroy(&rep_sq->sq_peer);
@@ -490,15 +487,15 @@ static int mlx5e_sqs2vport_start(struct mlx5_eswitch *esw,
490487
}
491488

492489
if (devcom_locked)
493-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
490+
mlx5_devcom_for_each_peer_end(esw->devcom);
494491

495492
return 0;
496493

497494
out_err:
498495
mlx5e_sqs2vport_stop(esw, rep);
499496

500497
if (devcom_locked)
501-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
498+
mlx5_devcom_for_each_peer_end(esw->devcom);
502499

503500
return err;
504501
}

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

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,11 +1668,10 @@ int mlx5e_tc_query_route_vport(struct net_device *out_dev, struct net_device *ro
16681668
{
16691669
struct mlx5e_priv *out_priv, *route_priv;
16701670
struct mlx5_core_dev *route_mdev;
1671-
struct mlx5_devcom *devcom;
1671+
struct mlx5_devcom_comp_dev *pos;
16721672
struct mlx5_eswitch *esw;
16731673
u16 vhca_id;
16741674
int err;
1675-
int i;
16761675

16771676
out_priv = netdev_priv(out_dev);
16781677
esw = out_priv->mdev->priv.eswitch;
@@ -1688,10 +1687,8 @@ int mlx5e_tc_query_route_vport(struct net_device *out_dev, struct net_device *ro
16881687
return err;
16891688

16901689
rcu_read_lock();
1691-
devcom = out_priv->mdev->priv.devcom;
16921690
err = -ENODEV;
1693-
mlx5_devcom_for_each_peer_entry_rcu(devcom, MLX5_DEVCOM_ESW_OFFLOADS,
1694-
esw, i) {
1691+
mlx5_devcom_for_each_peer_entry_rcu(esw->devcom, esw, pos) {
16951692
err = mlx5_eswitch_vhca_id_to_vport(esw, vhca_id, vport);
16961693
if (!err)
16971694
break;
@@ -2031,15 +2028,15 @@ static void mlx5e_tc_del_flow(struct mlx5e_priv *priv,
20312028
struct mlx5e_tc_flow *flow)
20322029
{
20332030
if (mlx5e_is_eswitch_flow(flow)) {
2034-
struct mlx5_devcom *devcom = flow->priv->mdev->priv.devcom;
2031+
struct mlx5_devcom_comp_dev *devcom = flow->priv->mdev->priv.eswitch->devcom;
20352032

2036-
if (!mlx5_devcom_for_each_peer_begin(devcom, MLX5_DEVCOM_ESW_OFFLOADS)) {
2033+
if (!mlx5_devcom_for_each_peer_begin(devcom)) {
20372034
mlx5e_tc_del_fdb_flow(priv, flow);
20382035
return;
20392036
}
20402037

20412038
mlx5e_tc_del_fdb_peers_flow(flow);
2042-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
2039+
mlx5_devcom_for_each_peer_end(devcom);
20432040
mlx5e_tc_del_fdb_flow(priv, flow);
20442041
} else {
20452042
mlx5e_tc_del_nic_flow(priv, flow);
@@ -4216,8 +4213,7 @@ static bool is_peer_flow_needed(struct mlx5e_tc_flow *flow)
42164213
flow_flag_test(flow, INGRESS);
42174214
bool act_is_encap = !!(attr->action &
42184215
MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT);
4219-
bool esw_paired = mlx5_devcom_comp_is_ready(esw_attr->in_mdev->priv.devcom,
4220-
MLX5_DEVCOM_ESW_OFFLOADS);
4216+
bool esw_paired = mlx5_devcom_comp_is_ready(esw_attr->in_mdev->priv.eswitch->devcom);
42214217

42224218
if (!esw_paired)
42234219
return false;
@@ -4471,14 +4467,13 @@ mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
44714467
struct net_device *filter_dev,
44724468
struct mlx5e_tc_flow **__flow)
44734469
{
4474-
struct mlx5_devcom *devcom = priv->mdev->priv.devcom;
4470+
struct mlx5_devcom_comp_dev *devcom = priv->mdev->priv.eswitch->devcom, *pos;
44754471
struct mlx5e_rep_priv *rpriv = priv->ppriv;
44764472
struct mlx5_eswitch_rep *in_rep = rpriv->rep;
44774473
struct mlx5_core_dev *in_mdev = priv->mdev;
44784474
struct mlx5_eswitch *peer_esw;
44794475
struct mlx5e_tc_flow *flow;
44804476
int err;
4481-
int i;
44824477

44834478
flow = __mlx5e_add_fdb_flow(priv, f, flow_flags, filter_dev, in_rep,
44844479
in_mdev);
@@ -4490,27 +4485,25 @@ mlx5e_add_fdb_flow(struct mlx5e_priv *priv,
44904485
return 0;
44914486
}
44924487

4493-
if (!mlx5_devcom_for_each_peer_begin(devcom, MLX5_DEVCOM_ESW_OFFLOADS)) {
4488+
if (!mlx5_devcom_for_each_peer_begin(devcom)) {
44944489
err = -ENODEV;
44954490
goto clean_flow;
44964491
}
44974492

4498-
mlx5_devcom_for_each_peer_entry(devcom,
4499-
MLX5_DEVCOM_ESW_OFFLOADS,
4500-
peer_esw, i) {
4493+
mlx5_devcom_for_each_peer_entry(devcom, peer_esw, pos) {
45014494
err = mlx5e_tc_add_fdb_peer_flow(f, flow, flow_flags, peer_esw);
45024495
if (err)
45034496
goto peer_clean;
45044497
}
45054498

4506-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
4499+
mlx5_devcom_for_each_peer_end(devcom);
45074500

45084501
*__flow = flow;
45094502
return 0;
45104503

45114504
peer_clean:
45124505
mlx5e_tc_del_fdb_peers_flow(flow);
4513-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
4506+
mlx5_devcom_for_each_peer_end(devcom);
45144507
clean_flow:
45154508
mlx5e_tc_del_fdb_flow(priv, flow);
45164509
return err;
@@ -4728,7 +4721,7 @@ int mlx5e_tc_fill_action_stats(struct mlx5e_priv *priv,
47284721
int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
47294722
struct flow_cls_offload *f, unsigned long flags)
47304723
{
4731-
struct mlx5_devcom *devcom = priv->mdev->priv.devcom;
4724+
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
47324725
struct rhashtable *tc_ht = get_tc_ht(priv, flags);
47334726
struct mlx5e_tc_flow *flow;
47344727
struct mlx5_fc *counter;
@@ -4764,7 +4757,7 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
47644757
/* Under multipath it's possible for one rule to be currently
47654758
* un-offloaded while the other rule is offloaded.
47664759
*/
4767-
if (!mlx5_devcom_for_each_peer_begin(devcom, MLX5_DEVCOM_ESW_OFFLOADS))
4760+
if (esw && !mlx5_devcom_for_each_peer_begin(esw->devcom))
47684761
goto out;
47694762

47704763
if (flow_flag_test(flow, DUP)) {
@@ -4795,7 +4788,8 @@ int mlx5e_stats_flower(struct net_device *dev, struct mlx5e_priv *priv,
47954788
}
47964789

47974790
no_peer_counter:
4798-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
4791+
if (esw)
4792+
mlx5_devcom_for_each_peer_end(esw->devcom);
47994793
out:
48004794
flow_stats_update(&f->stats, bytes, packets, 0, lastuse,
48014795
FLOW_ACTION_HW_STATS_DELAYED);

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -652,30 +652,30 @@ mlx5_esw_bridge_ingress_flow_peer_create(u16 vport_num, u16 esw_owner_vhca_id,
652652
struct mlx5_esw_bridge_vlan *vlan, u32 counter_id,
653653
struct mlx5_esw_bridge *bridge)
654654
{
655-
struct mlx5_devcom *devcom = bridge->br_offloads->esw->dev->priv.devcom;
655+
struct mlx5_devcom_comp_dev *devcom = bridge->br_offloads->esw->devcom, *pos;
656656
struct mlx5_eswitch *tmp, *peer_esw = NULL;
657657
static struct mlx5_flow_handle *handle;
658-
int i;
659658

660-
if (!mlx5_devcom_for_each_peer_begin(devcom, MLX5_DEVCOM_ESW_OFFLOADS))
659+
if (!mlx5_devcom_for_each_peer_begin(devcom))
661660
return ERR_PTR(-ENODEV);
662661

663-
mlx5_devcom_for_each_peer_entry(devcom,
664-
MLX5_DEVCOM_ESW_OFFLOADS,
665-
tmp, i) {
662+
mlx5_devcom_for_each_peer_entry(devcom, tmp, pos) {
666663
if (mlx5_esw_is_owner(tmp, vport_num, esw_owner_vhca_id)) {
667664
peer_esw = tmp;
668665
break;
669666
}
670667
}
668+
671669
if (!peer_esw) {
672-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
673-
return ERR_PTR(-ENODEV);
670+
handle = ERR_PTR(-ENODEV);
671+
goto out;
674672
}
675673

676674
handle = mlx5_esw_bridge_ingress_flow_with_esw_create(vport_num, addr, vlan, counter_id,
677675
bridge, peer_esw);
678-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
676+
677+
out:
678+
mlx5_devcom_for_each_peer_end(devcom);
679679
return handle;
680680
}
681681

@@ -1391,8 +1391,8 @@ mlx5_esw_bridge_fdb_entry_init(struct net_device *dev, u16 vport_num, u16 esw_ow
13911391
mlx5_fc_id(counter), bridge);
13921392
if (IS_ERR(handle)) {
13931393
err = PTR_ERR(handle);
1394-
esw_warn(esw->dev, "Failed to create ingress flow(vport=%u,err=%d)\n",
1395-
vport_num, err);
1394+
esw_warn(esw->dev, "Failed to create ingress flow(vport=%u,err=%d,peer=%d)\n",
1395+
vport_num, err, peer);
13961396
goto err_ingress_flow_create;
13971397
}
13981398
entry->ingress_handle = handle;

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -539,30 +539,29 @@ mlx5_esw_bridge_mcast_filter_flow_create(struct mlx5_esw_bridge_port *port)
539539
static struct mlx5_flow_handle *
540540
mlx5_esw_bridge_mcast_filter_flow_peer_create(struct mlx5_esw_bridge_port *port)
541541
{
542-
struct mlx5_devcom *devcom = port->bridge->br_offloads->esw->dev->priv.devcom;
542+
struct mlx5_devcom_comp_dev *devcom = port->bridge->br_offloads->esw->devcom, *pos;
543543
struct mlx5_eswitch *tmp, *peer_esw = NULL;
544544
static struct mlx5_flow_handle *handle;
545-
int i;
546545

547-
if (!mlx5_devcom_for_each_peer_begin(devcom, MLX5_DEVCOM_ESW_OFFLOADS))
546+
if (!mlx5_devcom_for_each_peer_begin(devcom))
548547
return ERR_PTR(-ENODEV);
549548

550-
mlx5_devcom_for_each_peer_entry(devcom,
551-
MLX5_DEVCOM_ESW_OFFLOADS,
552-
tmp, i) {
549+
mlx5_devcom_for_each_peer_entry(devcom, tmp, pos) {
553550
if (mlx5_esw_is_owner(tmp, port->vport_num, port->esw_owner_vhca_id)) {
554551
peer_esw = tmp;
555552
break;
556553
}
557554
}
555+
558556
if (!peer_esw) {
559-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
560-
return ERR_PTR(-ENODEV);
557+
handle = ERR_PTR(-ENODEV);
558+
goto out;
561559
}
562560

563561
handle = mlx5_esw_bridge_mcast_flow_with_esw_create(port, peer_esw);
564562

565-
mlx5_devcom_for_each_peer_end(devcom, MLX5_DEVCOM_ESW_OFFLOADS);
563+
out:
564+
mlx5_devcom_for_each_peer_end(devcom);
566565
return handle;
567566
}
568567

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ struct mlx5_eswitch {
354354
} params;
355355
struct blocking_notifier_head n_head;
356356
struct xarray paired;
357+
struct mlx5_devcom_comp_dev *devcom;
357358
};
358359

359360
void esw_offloads_disable(struct mlx5_eswitch *esw);
@@ -383,6 +384,7 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch *esw);
383384
void mlx5_eswitch_disable(struct mlx5_eswitch *esw);
384385
void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw);
385386
void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw);
387+
bool mlx5_esw_offloads_devcom_is_ready(struct mlx5_eswitch *esw);
386388
int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
387389
u16 vport, const u8 *mac);
388390
int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw,
@@ -818,6 +820,7 @@ static inline void mlx5_eswitch_disable_sriov(struct mlx5_eswitch *esw, bool cle
818820
static inline void mlx5_eswitch_disable(struct mlx5_eswitch *esw) {}
819821
static inline void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw) {}
820822
static inline void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw) {}
823+
static inline bool mlx5_esw_offloads_devcom_is_ready(struct mlx5_eswitch *esw) { return false; }
821824
static inline bool mlx5_eswitch_is_funcs_handler(struct mlx5_core_dev *dev) { return false; }
822825
static inline
823826
int mlx5_eswitch_set_vport_state(struct mlx5_eswitch *esw, u16 vport, int link_state) { return 0; }

0 commit comments

Comments
 (0)