net: devlink: add unlocked variants of devlink_sb*() functions
authorJiri Pirko <jiri@nvidia.com>
Sat, 16 Jul 2022 11:02:36 +0000 (13:02 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 19 Jul 2022 03:10:47 +0000 (20:10 -0700)
Add unlocked variants of devlink_sb*() functions to be used
in drivers called-in with devlink->lock held.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/devlink.h
net/core/devlink.c

index d341753753ce26f2670a7d1c5669fa4ad4bd931b..0057809a13b077b5ea5aecd6406e785e76557a4b 100644 (file)
@@ -1579,10 +1579,15 @@ void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
 void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
 void devlink_linecard_activate(struct devlink_linecard *linecard);
 void devlink_linecard_deactivate(struct devlink_linecard *linecard);
+int devl_sb_register(struct devlink *devlink, unsigned int sb_index,
+                    u32 size, u16 ingress_pools_count,
+                    u16 egress_pools_count, u16 ingress_tc_count,
+                    u16 egress_tc_count);
 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
                        u32 size, u16 ingress_pools_count,
                        u16 egress_pools_count, u16 ingress_tc_count,
                        u16 egress_tc_count);
+void devl_sb_unregister(struct devlink *devlink, unsigned int sb_index);
 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index);
 int devlink_dpipe_table_register(struct devlink *devlink,
                                 const char *table_name,
index 1688271ef7b2ea859deec7ccf9a0b6146b929558..64dab4024d116924d55b746faa611b21af71ee09 100644 (file)
@@ -10375,25 +10375,21 @@ void devlink_linecard_deactivate(struct devlink_linecard *linecard)
 }
 EXPORT_SYMBOL_GPL(devlink_linecard_deactivate);
 
-int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
-                       u32 size, u16 ingress_pools_count,
-                       u16 egress_pools_count, u16 ingress_tc_count,
-                       u16 egress_tc_count)
+int devl_sb_register(struct devlink *devlink, unsigned int sb_index,
+                    u32 size, u16 ingress_pools_count,
+                    u16 egress_pools_count, u16 ingress_tc_count,
+                    u16 egress_tc_count)
 {
        struct devlink_sb *devlink_sb;
-       int err = 0;
 
-       devl_lock(devlink);
-       if (devlink_sb_index_exists(devlink, sb_index)) {
-               err = -EEXIST;
-               goto unlock;
-       }
+       lockdep_assert_held(&devlink->lock);
+
+       if (devlink_sb_index_exists(devlink, sb_index))
+               return -EEXIST;
 
        devlink_sb = kzalloc(sizeof(*devlink_sb), GFP_KERNEL);
-       if (!devlink_sb) {
-               err = -ENOMEM;
-               goto unlock;
-       }
+       if (!devlink_sb)
+               return -ENOMEM;
        devlink_sb->index = sb_index;
        devlink_sb->size = size;
        devlink_sb->ingress_pools_count = ingress_pools_count;
@@ -10401,23 +10397,45 @@ int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
        devlink_sb->ingress_tc_count = ingress_tc_count;
        devlink_sb->egress_tc_count = egress_tc_count;
        list_add_tail(&devlink_sb->list, &devlink->sb_list);
-unlock:
+       return 0;
+}
+EXPORT_SYMBOL_GPL(devl_sb_register);
+
+int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
+                       u32 size, u16 ingress_pools_count,
+                       u16 egress_pools_count, u16 ingress_tc_count,
+                       u16 egress_tc_count)
+{
+       int err;
+
+       devl_lock(devlink);
+       err = devl_sb_register(devlink, sb_index, size, ingress_pools_count,
+                              egress_pools_count, ingress_tc_count,
+                              egress_tc_count);
        devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_sb_register);
 
-void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index)
+void devl_sb_unregister(struct devlink *devlink, unsigned int sb_index)
 {
        struct devlink_sb *devlink_sb;
 
-       devl_lock(devlink);
+       lockdep_assert_held(&devlink->lock);
+
        devlink_sb = devlink_sb_get_by_index(devlink, sb_index);
        WARN_ON(!devlink_sb);
        list_del(&devlink_sb->list);
-       devl_unlock(devlink);
        kfree(devlink_sb);
 }
+EXPORT_SYMBOL_GPL(devl_sb_unregister);
+
+void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index)
+{
+       devl_lock(devlink);
+       devl_sb_unregister(devlink, sb_index);
+       devl_unlock(devlink);
+}
 EXPORT_SYMBOL_GPL(devlink_sb_unregister);
 
 /**