devlink: Allow to set up parent in devl_rate_leaf_create()
authorMichal Wilczynski <michal.wilczynski@intel.com>
Tue, 15 Nov 2022 10:48:19 +0000 (11:48 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 18 Nov 2022 05:41:27 +0000 (21:41 -0800)
Currently the driver is able to create leaf nodes for the devlink-rate,
but is unable to set parent for them. This wasn't as issue before the
possibility to export hierarchy from the driver. After adding the export
feature, in order for the driver to supply correct hierarchy, it's
necessary for it to be able to supply a parent name to
devl_rate_leaf_create().

Introduce a new parameter 'parent_name' in devl_rate_leaf_create().

Signed-off-by: Michal Wilczynski <michal.wilczynski@intel.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
drivers/net/netdevsim/dev.c
include/net/devlink.h
net/core/devlink.c

index 9bc7be95db5413a366d83387bcf3c363090abd21..084a910bb4e74045021a67ef7fff18f150a656db 100644 (file)
@@ -91,7 +91,7 @@ int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_
        if (err)
                goto reg_err;
 
-       err = devl_rate_leaf_create(dl_port, vport);
+       err = devl_rate_leaf_create(dl_port, vport, NULL);
        if (err)
                goto rate_err;
 
@@ -160,7 +160,7 @@ int mlx5_esw_devlink_sf_port_register(struct mlx5_eswitch *esw, struct devlink_p
        if (err)
                return err;
 
-       err = devl_rate_leaf_create(dl_port, vport);
+       err = devl_rate_leaf_create(dl_port, vport, NULL);
        if (err)
                goto rate_err;
 
index 705872eb756488f37c256d1292186ba946522554..e14686594a71248dc868433a474e31f82bd807e8 100644 (file)
@@ -1401,7 +1401,7 @@ static int __nsim_dev_port_add(struct nsim_dev *nsim_dev, enum nsim_dev_port_typ
 
        if (nsim_dev_port_is_vf(nsim_dev_port)) {
                err = devl_rate_leaf_create(&nsim_dev_port->devlink_port,
-                                           nsim_dev_port);
+                                           nsim_dev_port, NULL);
                if (err)
                        goto err_nsim_destroy;
        }
index 339a2ed02d3683468c90dc2446f536b1893df716..074a79b8933fad9f2cabf14e55da438237f236cf 100644 (file)
@@ -1617,10 +1617,12 @@ void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 contro
 void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
                                   u32 controller, u16 pf, u32 sf,
                                   bool external);
-int devl_rate_leaf_create(struct devlink_port *port, void *priv);
 struct devlink_rate *
 devl_rate_node_create(struct devlink *devlink, void *priv, char *node_name,
                      struct devlink_rate *parent);
+int
+devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv,
+                     struct devlink_rate *parent);
 void devl_rate_leaf_destroy(struct devlink_port *devlink_port);
 void devl_rate_nodes_destroy(struct devlink *devlink);
 void devlink_port_linecard_set(struct devlink_port *devlink_port,
index 61d431578f5f35662b982c212d1de46784c64db4..d93bc95cd7cb8cda89c987e32f76c2372da35b25 100644 (file)
@@ -10435,10 +10435,12 @@ EXPORT_SYMBOL_GPL(devl_rate_node_create);
  * devl_rate_leaf_create - create devlink rate leaf
  * @devlink_port: devlink port object to create rate object on
  * @priv: driver private data
+ * @parent: parent devlink_rate struct
  *
  * Create devlink rate object of type leaf on provided @devlink_port.
  */
-int devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv)
+int devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv,
+                         struct devlink_rate *parent)
 {
        struct devlink *devlink = devlink_port->devlink;
        struct devlink_rate *devlink_rate;
@@ -10452,6 +10454,11 @@ int devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv)
        if (!devlink_rate)
                return -ENOMEM;
 
+       if (parent) {
+               devlink_rate->parent = parent;
+               refcount_inc(&devlink_rate->parent->refcnt);
+       }
+
        devlink_rate->type = DEVLINK_RATE_TYPE_LEAF;
        devlink_rate->devlink = devlink;
        devlink_rate->devlink_port = devlink_port;