Commit 7cde4743 authored by Michal Swiatkowski's avatar Michal Swiatkowski Committed by Tony Nguyen

ice: support subfunction devlink Tx topology

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: default avatarSimon Horman <horms@kernel.org>
Reviewed-by: default avatarPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: default avatarWojciech Drewek <wojciech.drewek@intel.com>
Signed-off-by: default avatarMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tested-by: default avatarRafal Romanowski <rafal.romanowski@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 54f07712
...@@ -746,6 +746,7 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node ...@@ -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 ice_sched_node *tc_node, struct ice_pf *pf)
{ {
struct devlink_rate *rate_node = NULL; struct devlink_rate *rate_node = NULL;
struct ice_dynamic_port *sf;
struct ice_vf *vf; struct ice_vf *vf;
int i; int i;
...@@ -757,6 +758,7 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node ...@@ -757,6 +758,7 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node
/* create root node */ /* create root node */
rate_node = devl_rate_node_create(devlink, node, node->name, NULL); rate_node = devl_rate_node_create(devlink, node, node->name, NULL);
} else if (node->vsi_handle && } else if (node->vsi_handle &&
pf->vsi[node->vsi_handle]->type == ICE_VSI_VF &&
pf->vsi[node->vsi_handle]->vf) { pf->vsi[node->vsi_handle]->vf) {
vf = pf->vsi[node->vsi_handle]->vf; vf = pf->vsi[node->vsi_handle]->vf;
if (!vf->devlink_port.devlink_rate) if (!vf->devlink_port.devlink_rate)
...@@ -765,6 +767,16 @@ static void ice_traverse_tx_tree(struct devlink *devlink, struct ice_sched_node ...@@ -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, devl_rate_leaf_create(&vf->devlink_port, node,
node->parent->rate_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 && } else if (node->info.data.elem_type != ICE_AQC_ELEM_TYPE_LEAF &&
node->parent->rate_node) { node->parent->rate_node) {
rate_node = devl_rate_node_create(devlink, node, node->name, rate_node = devl_rate_node_create(devlink, node, node->name,
......
...@@ -711,6 +711,7 @@ int ice_devlink_create_sf_port(struct ice_dynamic_port *dyn_port) ...@@ -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) 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); devl_port_unregister(&dyn_port->devlink_port);
} }
......
...@@ -347,16 +347,13 @@ static void ice_repr_rem_sf(struct ice_repr *repr) ...@@ -347,16 +347,13 @@ static void ice_repr_rem_sf(struct ice_repr *repr)
ice_devlink_destroy_sf_port(repr->sf); 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*/ /* only export if ADQ and DCB disabled and eswitch enabled*/
if (ice_is_adq_active(pf) || ice_is_dcb_active(pf) || if (ice_is_adq_active(pf) || ice_is_dcb_active(pf) ||
!ice_is_switchdev_running(pf)) !ice_is_switchdev_running(pf))
return; return;
devlink = priv_to_devlink(pf);
ice_devlink_rate_init_tx_topology(devlink, ice_get_main_vsi(pf)); ice_devlink_rate_init_tx_topology(devlink, ice_get_main_vsi(pf));
} }
...@@ -408,6 +405,7 @@ static struct ice_repr *ice_repr_create(struct ice_vsi *src_vsi) ...@@ -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) static int ice_repr_add_vf(struct ice_repr *repr)
{ {
struct ice_vf *vf = repr->vf; struct ice_vf *vf = repr->vf;
struct devlink *devlink;
int err; int err;
err = ice_devlink_create_vf_port(vf); err = ice_devlink_create_vf_port(vf);
...@@ -424,7 +422,9 @@ static int ice_repr_add_vf(struct ice_repr *repr) ...@@ -424,7 +422,9 @@ static int ice_repr_add_vf(struct ice_repr *repr)
goto err_cfg_vsi; goto err_cfg_vsi;
ice_virtchnl_set_repr_ops(vf); 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; return 0;
...@@ -480,6 +480,8 @@ static int ice_repr_add_sf(struct ice_repr *repr) ...@@ -480,6 +480,8 @@ static int ice_repr_add_sf(struct ice_repr *repr)
if (err) if (err)
goto err_netdev; goto err_netdev;
ice_repr_set_tx_topology(sf->vsi->back, priv_to_devlink(sf->vsi->back));
return 0; return 0;
err_netdev: err_netdev:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment