ice: support subfunction devlink Tx topology
authorMichal Swiatkowski <michal.swiatkowski@linux.intel.com>
Tue, 20 Aug 2024 06:57:58 +0000 (08:57 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 6 Sep 2024 18:01:24 +0000 (11:01 -0700)
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>
drivers/net/ethernet/intel/ice/devlink/devlink.c
drivers/net/ethernet/intel/ice/devlink/devlink_port.c
drivers/net/ethernet/intel/ice/ice_repr.c

index 445538959459b6f6baff22c91605d94d61b01242..415445cefdb2aa0c17d98dd0d61bb2b9fc945a24 100644 (file)
@@ -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;
 
@@ -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)
@@ -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,
index dc62046e26b7a7468cf18c9262518cfd9a738e12..c653a1f44bda4d22244ed15a60ec69c7b0b6b2ea 100644 (file)
@@ -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);
 }
 
index 78abfdf5d47b411ffbc859e54c0fd4fd974a92f5..00d4a9125dfa2eac516307dc9ae0b3f8d817fd18 100644 (file)
@@ -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));
 }
 
@@ -408,6 +405,7 @@ err_alloc:
 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);
@@ -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;
 
@@ -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: