Skip to content

Commit

Permalink
ice: support subfunction devlink Tx topology
Browse files Browse the repository at this point in the history
Flow for creating Tx topology is the same as for VF port representors,
but the devlink port is stored in different place (sf->devlink_port).

When creating VF devlink lock isn't taken, when creating subfunction it
is. Setting Tx topology function needs to take this lock, check if it
was taken before to not do it twice.

Reviewed-by: Simon Horman <horms@kernel.org>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
Signed-off-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: Rafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Michal Swiatkowski authored and Tony Nguyen committed Sep 6, 2024
1 parent 54f0771 commit 7cde474
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
12 changes: 12 additions & 0 deletions drivers/net/ethernet/intel/ice/devlink/devlink.c
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,7 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node
struct ice_sched_node *tc_node, struct ice_pf *pf)
{
struct devlink_rate *rate_node = NULL;
struct ice_dynamic_port *sf;
struct ice_vf *vf;
int i;

Expand All @@ -757,6 +758,7 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node
/* create root node */
rate_node = devl_rate_node_create(devlink, node, node->name, NULL);
} else if (node->vsi_handle &&
pf->vsi[node->vsi_handle]->type == ICE_VSI_VF &&
pf->vsi[node->vsi_handle]->vf) {
vf = pf->vsi[node->vsi_handle]->vf;
if (!vf->devlink_port.devlink_rate)
Expand All @@ -765,6 +767,16 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node
*/
devl_rate_leaf_create(&vf->devlink_port, node,
node->parent->rate_node);
} else if (node->vsi_handle &&
pf->vsi[node->vsi_handle]->type == ICE_VSI_SF &&
pf->vsi[node->vsi_handle]->sf) {
sf = pf->vsi[node->vsi_handle]->sf;
if (!sf->devlink_port.devlink_rate)
/* leaf nodes doesn't have children
* so we don't set rate_node
*/
devl_rate_leaf_create(&sf->devlink_port, node,
node->parent->rate_node);
} else if (node->info.data.elem_type != ICE_AQC_ELEM_TYPE_LEAF &&
node->parent->rate_node) {
rate_node = devl_rate_node_create(devlink, node, node->name,
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/intel/ice/devlink/devlink_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -711,6 +711,7 @@ int ice_devlink_create_sf_port(struct ice_dynamic_port *dyn_port)
*/
void ice_devlink_destroy_sf_port(struct ice_dynamic_port *dyn_port)
{
devl_rate_leaf_destroy(&dyn_port->devlink_port);
devl_port_unregister(&dyn_port->devlink_port);
}

Expand Down
12 changes: 7 additions & 5 deletions drivers/net/ethernet/intel/ice/ice_repr.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,16 +347,13 @@ static void ice_repr_rem_sf(struct ice_repr *repr)
ice_devlink_destroy_sf_port(repr->sf);
}

static void ice_repr_set_tx_topology(struct ice_pf *pf)
static void ice_repr_set_tx_topology(struct ice_pf *pf, struct devlink *devlink)
{
struct devlink *devlink;

/* only export if ADQ and DCB disabled and eswitch enabled*/
if (ice_is_adq_active(pf) || ice_is_dcb_active(pf) ||
!ice_is_switchdev_running(pf))
return;

devlink = priv_to_devlink(pf);
ice_devlink_rate_init_tx_topology(devlink, ice_get_main_vsi(pf));
}

Expand Down Expand Up @@ -408,6 +405,7 @@ static struct ice_repr *ice_repr_create(struct ice_vsi *src_vsi)
static int ice_repr_add_vf(struct ice_repr *repr)
{
struct ice_vf *vf = repr->vf;
struct devlink *devlink;
int err;

err = ice_devlink_create_vf_port(vf);
Expand All @@ -424,7 +422,9 @@ static int ice_repr_add_vf(struct ice_repr *repr)
goto err_cfg_vsi;

ice_virtchnl_set_repr_ops(vf);
ice_repr_set_tx_topology(vf->pf);

devlink = priv_to_devlink(vf->pf);
ice_repr_set_tx_topology(vf->pf, devlink);

return 0;

Expand Down Expand Up @@ -480,6 +480,8 @@ static int ice_repr_add_sf(struct ice_repr *repr)
if (err)
goto err_netdev;

ice_repr_set_tx_topology(sf->vsi->back, priv_to_devlink(sf->vsi->back));

return 0;

err_netdev:
Expand Down

0 comments on commit 7cde474

Please sign in to comment.