net: devlink: avoid false DEADLOCK warning reported by lockdep
[platform/kernel/linux-starfive.git] / net / core / devlink.c
index 5cc8849..d2a4e6e 100644 (file)
@@ -66,6 +66,7 @@ struct devlink {
         * port, sb, dpipe, resource, params, region, traps and more.
         */
        struct mutex lock;
+       struct lock_class_key lock_key;
        u8 reload_failed:1;
        refcount_t refcount;
        struct completion comp;
@@ -711,7 +712,7 @@ static int devlink_nl_pre_doit(const struct genl_ops *ops,
                return PTR_ERR(devlink);
        }
        if (~ops->internal_flags & DEVLINK_NL_FLAG_NO_LOCK)
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
        info->user_ptr[0] = devlink;
        if (ops->internal_flags & DEVLINK_NL_FLAG_NEED_PORT) {
                devlink_port = devlink_port_get_from_info(devlink, info);
@@ -754,7 +755,7 @@ static int devlink_nl_pre_doit(const struct genl_ops *ops,
 
 unlock:
        if (~ops->internal_flags & DEVLINK_NL_FLAG_NO_LOCK)
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
        devlink_put(devlink);
        mutex_unlock(&devlink_mutex);
        return err;
@@ -772,7 +773,7 @@ static void devlink_nl_post_doit(const struct genl_ops *ops,
                devlink_linecard_put(linecard);
        }
        if (~ops->internal_flags & DEVLINK_NL_FLAG_NO_LOCK)
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
        devlink_put(devlink);
        mutex_unlock(&devlink_mutex);
 }
@@ -1329,7 +1330,7 @@ static int devlink_nl_cmd_rate_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_rate, &devlink->rate_list, list) {
                        enum devlink_command cmd = DEVLINK_CMD_RATE_NEW;
                        u32 id = NETLINK_CB(cb->skb).portid;
@@ -1342,13 +1343,13 @@ static int devlink_nl_cmd_rate_get_dumpit(struct sk_buff *msg,
                                                   cb->nlh->nlmsg_seq,
                                                   NLM_F_MULTI, NULL);
                        if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -1495,7 +1496,7 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_port, &devlink->port_list, list) {
                        if (idx < start) {
                                idx++;
@@ -1507,13 +1508,13 @@ static int devlink_nl_cmd_port_get_dumpit(struct sk_buff *msg,
                                                   cb->nlh->nlmsg_seq,
                                                   NLM_F_MULTI, cb->extack);
                        if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -1700,9 +1701,9 @@ static int devlink_nl_cmd_port_unsplit_doit(struct sk_buff *skb,
        return devlink->ops->port_unsplit(devlink, devlink_port, info->extack);
 }
 
-static int devlink_port_new_notifiy(struct devlink *devlink,
-                                   unsigned int port_index,
-                                   struct genl_info *info)
+static int devlink_port_new_notify(struct devlink *devlink,
+                                  unsigned int port_index,
+                                  struct genl_info *info)
 {
        struct devlink_port *devlink_port;
        struct sk_buff *msg;
@@ -1712,7 +1713,7 @@ static int devlink_port_new_notifiy(struct devlink *devlink,
        if (!msg)
                return -ENOMEM;
 
-       mutex_lock(&devlink->lock);
+       lockdep_assert_held(&devlink->lock);
        devlink_port = devlink_port_get_by_index(devlink, port_index);
        if (!devlink_port) {
                err = -ENODEV;
@@ -1724,12 +1725,9 @@ static int devlink_port_new_notifiy(struct devlink *devlink,
        if (err)
                goto out;
 
-       err = genlmsg_reply(msg, info);
-       mutex_unlock(&devlink->lock);
-       return err;
+       return genlmsg_reply(msg, info);
 
 out:
-       mutex_unlock(&devlink->lock);
        nlmsg_free(msg);
        return err;
 }
@@ -1777,7 +1775,7 @@ static int devlink_nl_cmd_port_new_doit(struct sk_buff *skb,
        if (err)
                return err;
 
-       err = devlink_port_new_notifiy(devlink, new_port_index, info);
+       err = devlink_port_new_notify(devlink, new_port_index, info);
        if (err && err != -ENODEV) {
                /* Fail to send the response; destroy newly created port. */
                devlink->ops->port_del(devlink, new_port_index, extack);
@@ -2452,7 +2450,7 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
                        if (idx < start) {
                                idx++;
@@ -2464,13 +2462,13 @@ static int devlink_nl_cmd_sb_get_dumpit(struct sk_buff *msg,
                                                 cb->nlh->nlmsg_seq,
                                                 NLM_F_MULTI);
                        if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -2605,7 +2603,7 @@ static int devlink_nl_cmd_sb_pool_get_dumpit(struct sk_buff *msg,
                    !devlink->ops->sb_pool_get)
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
                        err = __sb_pool_get_dumpit(msg, start, &idx, devlink,
                                                   devlink_sb,
@@ -2614,12 +2612,12 @@ static int devlink_nl_cmd_sb_pool_get_dumpit(struct sk_buff *msg,
                        if (err == -EOPNOTSUPP) {
                                err = 0;
                        } else if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -2826,7 +2824,7 @@ static int devlink_nl_cmd_sb_port_pool_get_dumpit(struct sk_buff *msg,
                    !devlink->ops->sb_port_pool_get)
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
                        err = __sb_port_pool_get_dumpit(msg, start, &idx,
                                                        devlink, devlink_sb,
@@ -2835,12 +2833,12 @@ static int devlink_nl_cmd_sb_port_pool_get_dumpit(struct sk_buff *msg,
                        if (err == -EOPNOTSUPP) {
                                err = 0;
                        } else if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -3075,7 +3073,7 @@ devlink_nl_cmd_sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
                    !devlink->ops->sb_tc_pool_bind_get)
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_sb, &devlink->sb_list, list) {
                        err = __sb_tc_pool_bind_get_dumpit(msg, start, &idx,
                                                           devlink,
@@ -3085,12 +3083,12 @@ devlink_nl_cmd_sb_tc_pool_bind_get_dumpit(struct sk_buff *msg,
                        if (err == -EOPNOTSUPP) {
                                err = 0;
                        } else if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -5161,7 +5159,7 @@ static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(param_item, &devlink->param_list, list) {
                        if (idx < start) {
                                idx++;
@@ -5175,13 +5173,13 @@ static int devlink_nl_cmd_param_get_dumpit(struct sk_buff *msg,
                        if (err == -EOPNOTSUPP) {
                                err = 0;
                        } else if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -5396,7 +5394,7 @@ static int devlink_nl_cmd_port_param_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(devlink_port, &devlink->port_list, list) {
                        list_for_each_entry(param_item,
                                            &devlink_port->param_list, list) {
@@ -5414,14 +5412,14 @@ static int devlink_nl_cmd_port_param_get_dumpit(struct sk_buff *msg,
                                if (err == -EOPNOTSUPP) {
                                        err = 0;
                                } else if (err) {
-                                       mutex_unlock(&devlink->lock);
+                                       devl_unlock(devlink);
                                        devlink_put(devlink);
                                        goto out;
                                }
                                idx++;
                        }
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -5673,7 +5671,7 @@ static int __devlink_snapshot_id_increment(struct devlink *devlink, u32 id)
        unsigned long count;
        void *p;
 
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        p = xa_load(&devlink->snapshot_ids, id);
        if (WARN_ON(!p))
@@ -5709,7 +5707,7 @@ static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id)
        unsigned long count;
        void *p;
 
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        p = xa_load(&devlink->snapshot_ids, id);
        if (WARN_ON(!p))
@@ -5748,7 +5746,7 @@ static void __devlink_snapshot_id_decrement(struct devlink *devlink, u32 id)
  */
 static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id)
 {
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        if (xa_load(&devlink->snapshot_ids, id))
                return -EEXIST;
@@ -5775,7 +5773,7 @@ static int __devlink_snapshot_id_insert(struct devlink *devlink, u32 id)
  */
 static int __devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id)
 {
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        return xa_alloc(&devlink->snapshot_ids, id, xa_mk_value(1),
                        xa_limit_32b, GFP_KERNEL);
@@ -5803,7 +5801,7 @@ __devlink_region_snapshot_create(struct devlink_region *region,
        struct devlink_snapshot *snapshot;
        int err;
 
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        /* check if region can hold one more snapshot */
        if (region->cur_snapshots == region->max_snapshots)
@@ -5841,7 +5839,7 @@ static void devlink_region_snapshot_del(struct devlink_region *region,
 {
        struct devlink *devlink = region->devlink;
 
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        devlink_nl_region_notify(region, snapshot, DEVLINK_CMD_REGION_DEL);
        region->cur_snapshots--;
@@ -5935,7 +5933,7 @@ static int devlink_nl_cmd_region_get_devlink_dumpit(struct sk_buff *msg,
        struct devlink_port *port;
        int err = 0;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        list_for_each_entry(region, &devlink->region_list, list) {
                if (*idx < start) {
                        (*idx)++;
@@ -5959,7 +5957,7 @@ static int devlink_nl_cmd_region_get_devlink_dumpit(struct sk_buff *msg,
        }
 
 out:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 
@@ -6249,7 +6247,7 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
                goto out_dev;
        }
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
 
        if (!attrs[DEVLINK_ATTR_REGION_NAME] ||
            !attrs[DEVLINK_ATTR_REGION_SNAPSHOT_ID]) {
@@ -6345,7 +6343,7 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
 
        nla_nest_end(skb, chunks_attr);
        genlmsg_end(skb, hdr);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        devlink_put(devlink);
        mutex_unlock(&devlink_mutex);
 
@@ -6354,7 +6352,7 @@ static int devlink_nl_cmd_region_read_dumpit(struct sk_buff *skb,
 nla_put_failure:
        genlmsg_cancel(skb, hdr);
 out_unlock:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        devlink_put(devlink);
 out_dev:
        mutex_unlock(&devlink_mutex);
@@ -6517,12 +6515,12 @@ static int devlink_nl_cmd_info_get_dumpit(struct sk_buff *msg,
                if (idx < start || !devlink->ops->info_get)
                        goto inc;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                err = devlink_nl_info_fill(msg, devlink, DEVLINK_CMD_INFO_GET,
                                           NETLINK_CB(cb->skb).portid,
                                           cb->nlh->nlmsg_seq, NLM_F_MULTI,
                                           cb->extack);
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
                if (err == -EOPNOTSUPP)
                        err = 0;
                else if (err) {
@@ -7724,7 +7722,7 @@ retry_rep:
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry_port;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(port, &devlink->port_list, list) {
                        mutex_lock(&port->reporters_lock);
                        list_for_each_entry(reporter, &port->reporter_list, list) {
@@ -7739,7 +7737,7 @@ retry_rep:
                                        cb->nlh->nlmsg_seq, NLM_F_MULTI);
                                if (err) {
                                        mutex_unlock(&port->reporters_lock);
-                                       mutex_unlock(&devlink->lock);
+                                       devl_unlock(devlink);
                                        devlink_put(devlink);
                                        goto out;
                                }
@@ -7747,7 +7745,7 @@ retry_rep:
                        }
                        mutex_unlock(&port->reporters_lock);
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry_port:
                devlink_put(devlink);
        }
@@ -7946,8 +7944,8 @@ static int devlink_nl_cmd_health_reporter_test_doit(struct sk_buff *skb,
 }
 
 struct devlink_stats {
-       u64 rx_bytes;
-       u64 rx_packets;
+       u64_stats_t rx_bytes;
+       u64_stats_t rx_packets;
        struct u64_stats_sync syncp;
 };
 
@@ -8104,12 +8102,12 @@ static void devlink_trap_stats_read(struct devlink_stats __percpu *trap_stats,
                cpu_stats = per_cpu_ptr(trap_stats, i);
                do {
                        start = u64_stats_fetch_begin_irq(&cpu_stats->syncp);
-                       rx_packets = cpu_stats->rx_packets;
-                       rx_bytes = cpu_stats->rx_bytes;
+                       rx_packets = u64_stats_read(&cpu_stats->rx_packets);
+                       rx_bytes = u64_stats_read(&cpu_stats->rx_bytes);
                } while (u64_stats_fetch_retry_irq(&cpu_stats->syncp, start));
 
-               stats->rx_packets += rx_packets;
-               stats->rx_bytes += rx_bytes;
+               u64_stats_add(&stats->rx_packets, rx_packets);
+               u64_stats_add(&stats->rx_bytes, rx_bytes);
        }
 }
 
@@ -8127,11 +8125,13 @@ devlink_trap_group_stats_put(struct sk_buff *msg,
                return -EMSGSIZE;
 
        if (nla_put_u64_64bit(msg, DEVLINK_ATTR_STATS_RX_PACKETS,
-                             stats.rx_packets, DEVLINK_ATTR_PAD))
+                             u64_stats_read(&stats.rx_packets),
+                             DEVLINK_ATTR_PAD))
                goto nla_put_failure;
 
        if (nla_put_u64_64bit(msg, DEVLINK_ATTR_STATS_RX_BYTES,
-                             stats.rx_bytes, DEVLINK_ATTR_PAD))
+                             u64_stats_read(&stats.rx_bytes),
+                             DEVLINK_ATTR_PAD))
                goto nla_put_failure;
 
        nla_nest_end(msg, attr);
@@ -8171,11 +8171,13 @@ static int devlink_trap_stats_put(struct sk_buff *msg, struct devlink *devlink,
                goto nla_put_failure;
 
        if (nla_put_u64_64bit(msg, DEVLINK_ATTR_STATS_RX_PACKETS,
-                             stats.rx_packets, DEVLINK_ATTR_PAD))
+                             u64_stats_read(&stats.rx_packets),
+                             DEVLINK_ATTR_PAD))
                goto nla_put_failure;
 
        if (nla_put_u64_64bit(msg, DEVLINK_ATTR_STATS_RX_BYTES,
-                             stats.rx_bytes, DEVLINK_ATTR_PAD))
+                             u64_stats_read(&stats.rx_bytes),
+                             DEVLINK_ATTR_PAD))
                goto nla_put_failure;
 
        nla_nest_end(msg, attr);
@@ -8290,7 +8292,7 @@ static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(trap_item, &devlink->trap_list, list) {
                        if (idx < start) {
                                idx++;
@@ -8302,13 +8304,13 @@ static int devlink_nl_cmd_trap_get_dumpit(struct sk_buff *msg,
                                                   cb->nlh->nlmsg_seq,
                                                   NLM_F_MULTI);
                        if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -8517,7 +8519,7 @@ static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(group_item, &devlink->trap_group_list,
                                    list) {
                        if (idx < start) {
@@ -8530,13 +8532,13 @@ static int devlink_nl_cmd_trap_group_get_dumpit(struct sk_buff *msg,
                                                         cb->nlh->nlmsg_seq,
                                                         NLM_F_MULTI);
                        if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -8831,7 +8833,7 @@ static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
                if (!net_eq(devlink_net(devlink), sock_net(msg->sk)))
                        goto retry;
 
-               mutex_lock(&devlink->lock);
+               devl_lock(devlink);
                list_for_each_entry(policer_item, &devlink->trap_policer_list,
                                    list) {
                        if (idx < start) {
@@ -8844,13 +8846,13 @@ static int devlink_nl_cmd_trap_policer_get_dumpit(struct sk_buff *msg,
                                                           cb->nlh->nlmsg_seq,
                                                           NLM_F_MULTI);
                        if (err) {
-                               mutex_unlock(&devlink->lock);
+                               devl_unlock(devlink);
                                devlink_put(devlink);
                                goto out;
                        }
                        idx++;
                }
-               mutex_unlock(&devlink->lock);
+               devl_unlock(devlink);
 retry:
                devlink_put(devlink);
        }
@@ -9063,13 +9065,11 @@ static const struct genl_small_ops devlink_nl_ops[] = {
                .cmd = DEVLINK_CMD_PORT_NEW,
                .doit = devlink_nl_cmd_port_new_doit,
                .flags = GENL_ADMIN_PERM,
-               .internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
        },
        {
                .cmd = DEVLINK_CMD_PORT_DEL,
                .doit = devlink_nl_cmd_port_del_doit,
                .flags = GENL_ADMIN_PERM,
-               .internal_flags = DEVLINK_NL_FLAG_NO_LOCK,
        },
        {
                .cmd = DEVLINK_CMD_LINECARD_GET,
@@ -9473,7 +9473,9 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
        INIT_LIST_HEAD(&devlink->trap_list);
        INIT_LIST_HEAD(&devlink->trap_group_list);
        INIT_LIST_HEAD(&devlink->trap_policer_list);
+       lockdep_register_key(&devlink->lock_key);
        mutex_init(&devlink->lock);
+       lockdep_set_class(&devlink->lock, &devlink->lock_key);
        mutex_init(&devlink->reporters_lock);
        mutex_init(&devlink->linecards_lock);
        refcount_set(&devlink->refcount, 1);
@@ -9620,6 +9622,7 @@ void devlink_free(struct devlink *devlink)
        mutex_destroy(&devlink->linecards_lock);
        mutex_destroy(&devlink->reporters_lock);
        mutex_destroy(&devlink->lock);
+       lockdep_unregister_key(&devlink->lock_key);
        WARN_ON(!list_empty(&devlink->trap_policer_list));
        WARN_ON(!list_empty(&devlink->trap_group_list));
        WARN_ON(!list_empty(&devlink->trap_list));
@@ -9673,11 +9676,24 @@ static void devlink_port_type_warn_cancel(struct devlink_port *devlink_port)
        cancel_delayed_work_sync(&devlink_port->type_warn_dw);
 }
 
+/**
+ * devl_port_register() - Register devlink port
+ *
+ * @devlink: devlink
+ * @devlink_port: devlink port
+ * @port_index: driver-specific numerical identifier of the port
+ *
+ * Register devlink port with provided port index. User can use
+ * any indexing, even hw-related one. devlink_port structure
+ * is convenient to be embedded inside user driver private structure.
+ * Note that the caller should take care of zeroing the devlink_port
+ * structure.
+ */
 int devl_port_register(struct devlink *devlink,
                       struct devlink_port *devlink_port,
                       unsigned int port_index)
 {
-       lockdep_assert_held(&devlink->lock);
+       devl_assert_locked(devlink);
 
        if (devlink_port_index_exists(devlink, port_index))
                return -EEXIST;
@@ -9711,6 +9727,8 @@ EXPORT_SYMBOL_GPL(devl_port_register);
  *     is convenient to be embedded inside user driver private structure.
  *     Note that the caller should take care of zeroing the devlink_port
  *     structure.
+ *
+ *     Context: Takes and release devlink->lock <mutex>.
  */
 int devlink_port_register(struct devlink *devlink,
                          struct devlink_port *devlink_port,
@@ -9718,13 +9736,18 @@ int devlink_port_register(struct devlink *devlink,
 {
        int err;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        err = devl_port_register(devlink, devlink_port, port_index);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_port_register);
 
+/**
+ * devl_port_unregister() - Unregister devlink port
+ *
+ * @devlink_port: devlink port
+ */
 void devl_port_unregister(struct devlink_port *devlink_port)
 {
        lockdep_assert_held(&devlink_port->devlink->lock);
@@ -9742,14 +9765,16 @@ EXPORT_SYMBOL_GPL(devl_port_unregister);
  *     devlink_port_unregister - Unregister devlink port
  *
  *     @devlink_port: devlink port
+ *
+ *     Context: Takes and release devlink->lock <mutex>.
  */
 void devlink_port_unregister(struct devlink_port *devlink_port)
 {
        struct devlink *devlink = devlink_port->devlink;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        devl_port_unregister(devlink_port);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_port_unregister);
 
@@ -10002,20 +10027,13 @@ int devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv)
 }
 EXPORT_SYMBOL_GPL(devl_rate_leaf_create);
 
-int
-devlink_rate_leaf_create(struct devlink_port *devlink_port, void *priv)
-{
-       struct devlink *devlink = devlink_port->devlink;
-       int ret;
-
-       mutex_lock(&devlink->lock);
-       ret = devl_rate_leaf_create(devlink_port, priv);
-       mutex_unlock(&devlink->lock);
-
-       return ret;
-}
-EXPORT_SYMBOL_GPL(devlink_rate_leaf_create);
-
+/**
+ * devl_rate_leaf_destroy - destroy devlink rate leaf
+ *
+ * @devlink_port: devlink port linked to the rate object
+ *
+ * Destroy the devlink rate object of type leaf on provided @devlink_port.
+ */
 void devl_rate_leaf_destroy(struct devlink_port *devlink_port)
 {
        struct devlink_rate *devlink_rate = devlink_port->devlink_rate;
@@ -10034,27 +10052,6 @@ void devl_rate_leaf_destroy(struct devlink_port *devlink_port)
 EXPORT_SYMBOL_GPL(devl_rate_leaf_destroy);
 
 /**
- * devlink_rate_leaf_destroy - destroy devlink rate leaf
- *
- * @devlink_port: devlink port linked to the rate object
- *
- * Context: Takes and release devlink->lock <mutex>.
- */
-void devlink_rate_leaf_destroy(struct devlink_port *devlink_port)
-{
-       struct devlink_rate *devlink_rate = devlink_port->devlink_rate;
-       struct devlink *devlink = devlink_port->devlink;
-
-       if (!devlink_rate)
-               return;
-
-       mutex_lock(&devlink->lock);
-       devl_rate_leaf_destroy(devlink_port);
-       mutex_unlock(&devlink->lock);
-}
-EXPORT_SYMBOL_GPL(devlink_rate_leaf_destroy);
-
-/**
  * devl_rate_nodes_destroy - destroy all devlink rate nodes on device
  * @devlink: devlink instance
  *
@@ -10092,24 +10089,6 @@ void devl_rate_nodes_destroy(struct devlink *devlink)
 EXPORT_SYMBOL_GPL(devl_rate_nodes_destroy);
 
 /**
- * devlink_rate_nodes_destroy - destroy all devlink rate nodes on device
- *
- * @devlink: devlink instance
- *
- * Unset parent for all rate objects and destroy all rate nodes
- * on specified device.
- *
- * Context: Takes and release devlink->lock <mutex>.
- */
-void devlink_rate_nodes_destroy(struct devlink *devlink)
-{
-       mutex_lock(&devlink->lock);
-       devl_rate_nodes_destroy(devlink);
-       mutex_unlock(&devlink->lock);
-}
-EXPORT_SYMBOL_GPL(devlink_rate_nodes_destroy);
-
-/**
  *     devlink_port_linecard_set - Link port with a linecard
  *
  *     @devlink_port: devlink port
@@ -10404,7 +10383,7 @@ int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
        struct devlink_sb *devlink_sb;
        int err = 0;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        if (devlink_sb_index_exists(devlink, sb_index)) {
                err = -EEXIST;
                goto unlock;
@@ -10423,7 +10402,7 @@ int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
        devlink_sb->egress_tc_count = egress_tc_count;
        list_add_tail(&devlink_sb->list, &devlink->sb_list);
 unlock:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_sb_register);
@@ -10432,11 +10411,11 @@ void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index)
 {
        struct devlink_sb *devlink_sb;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        devlink_sb = devlink_sb_get_by_index(devlink, sb_index);
        WARN_ON(!devlink_sb);
        list_del(&devlink_sb->list);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        kfree(devlink_sb);
 }
 EXPORT_SYMBOL_GPL(devlink_sb_unregister);
@@ -10449,13 +10428,12 @@ EXPORT_SYMBOL_GPL(devlink_sb_unregister);
  *
  *     Register the headers supported by hardware.
  */
-int devlink_dpipe_headers_register(struct devlink *devlink,
-                                  struct devlink_dpipe_headers *dpipe_headers)
+void devlink_dpipe_headers_register(struct devlink *devlink,
+                                   struct devlink_dpipe_headers *dpipe_headers)
 {
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        devlink->dpipe_headers = dpipe_headers;
-       mutex_unlock(&devlink->lock);
-       return 0;
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_dpipe_headers_register);
 
@@ -10468,9 +10446,9 @@ EXPORT_SYMBOL_GPL(devlink_dpipe_headers_register);
  */
 void devlink_dpipe_headers_unregister(struct devlink *devlink)
 {
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        devlink->dpipe_headers = NULL;
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_dpipe_headers_unregister);
 
@@ -10525,7 +10503,7 @@ int devlink_dpipe_table_register(struct devlink *devlink,
        if (WARN_ON(!table_ops->size_get))
                return -EINVAL;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
 
        if (devlink_dpipe_table_find(&devlink->dpipe_table_list, table_name,
                                     devlink)) {
@@ -10546,7 +10524,7 @@ int devlink_dpipe_table_register(struct devlink *devlink,
 
        list_add_tail_rcu(&table->list, &devlink->dpipe_table_list);
 unlock:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_dpipe_table_register);
@@ -10562,17 +10540,17 @@ void devlink_dpipe_table_unregister(struct devlink *devlink,
 {
        struct devlink_dpipe_table *table;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
                                         table_name, devlink);
        if (!table)
                goto unlock;
        list_del_rcu(&table->list);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        kfree_rcu(table, rcu);
        return;
 unlock:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_dpipe_table_unregister);
 
@@ -10604,7 +10582,7 @@ int devlink_resource_register(struct devlink *devlink,
 
        top_hierarchy = parent_resource_id == DEVLINK_RESOURCE_ID_PARENT_TOP;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        resource = devlink_resource_find(devlink, NULL, resource_id);
        if (resource) {
                err = -EINVAL;
@@ -10644,7 +10622,7 @@ int devlink_resource_register(struct devlink *devlink,
        INIT_LIST_HEAD(&resource->resource_list);
        list_add_tail(&resource->list, resource_list);
 out:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_resource_register);
@@ -10671,7 +10649,7 @@ void devlink_resources_unregister(struct devlink *devlink)
 {
        struct devlink_resource *tmp, *child_resource;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
 
        list_for_each_entry_safe(child_resource, tmp, &devlink->resource_list,
                                 list) {
@@ -10680,7 +10658,7 @@ void devlink_resources_unregister(struct devlink *devlink)
                kfree(child_resource);
        }
 
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_resources_unregister);
 
@@ -10698,7 +10676,7 @@ int devlink_resource_size_get(struct devlink *devlink,
        struct devlink_resource *resource;
        int err = 0;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        resource = devlink_resource_find(devlink, NULL, resource_id);
        if (!resource) {
                err = -EINVAL;
@@ -10707,7 +10685,7 @@ int devlink_resource_size_get(struct devlink *devlink,
        *p_resource_size = resource->size_new;
        resource->size = resource->size_new;
 out:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_resource_size_get);
@@ -10727,7 +10705,7 @@ int devlink_dpipe_table_resource_set(struct devlink *devlink,
        struct devlink_dpipe_table *table;
        int err = 0;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        table = devlink_dpipe_table_find(&devlink->dpipe_table_list,
                                         table_name, devlink);
        if (!table) {
@@ -10738,7 +10716,7 @@ int devlink_dpipe_table_resource_set(struct devlink *devlink,
        table->resource_units = resource_units;
        table->resource_valid = true;
 out:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_dpipe_table_resource_set);
@@ -10758,7 +10736,7 @@ void devlink_resource_occ_get_register(struct devlink *devlink,
 {
        struct devlink_resource *resource;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        resource = devlink_resource_find(devlink, NULL, resource_id);
        if (WARN_ON(!resource))
                goto out;
@@ -10767,7 +10745,7 @@ void devlink_resource_occ_get_register(struct devlink *devlink,
        resource->occ_get = occ_get;
        resource->occ_get_priv = occ_get_priv;
 out:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_resource_occ_get_register);
 
@@ -10782,7 +10760,7 @@ void devlink_resource_occ_get_unregister(struct devlink *devlink,
 {
        struct devlink_resource *resource;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        resource = devlink_resource_find(devlink, NULL, resource_id);
        if (WARN_ON(!resource))
                goto out;
@@ -10791,7 +10769,7 @@ void devlink_resource_occ_get_unregister(struct devlink *devlink,
        resource->occ_get = NULL;
        resource->occ_get_priv = NULL;
 out:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_resource_occ_get_unregister);
 
@@ -11030,7 +11008,7 @@ devlink_region_create(struct devlink *devlink,
        if (WARN_ON(!ops) || WARN_ON(!ops->destructor))
                return ERR_PTR(-EINVAL);
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
 
        if (devlink_region_get_by_name(devlink, ops->name)) {
                err = -EEXIST;
@@ -11051,11 +11029,11 @@ devlink_region_create(struct devlink *devlink,
        list_add_tail(&region->list, &devlink->region_list);
        devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW);
 
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return region;
 
 unlock:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(devlink_region_create);
@@ -11080,7 +11058,7 @@ devlink_port_region_create(struct devlink_port *port,
        if (WARN_ON(!ops) || WARN_ON(!ops->destructor))
                return ERR_PTR(-EINVAL);
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
 
        if (devlink_port_region_get_by_name(port, ops->name)) {
                err = -EEXIST;
@@ -11102,11 +11080,11 @@ devlink_port_region_create(struct devlink_port *port,
        list_add_tail(&region->list, &port->region_list);
        devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW);
 
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return region;
 
 unlock:
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return ERR_PTR(err);
 }
 EXPORT_SYMBOL_GPL(devlink_port_region_create);
@@ -11121,7 +11099,7 @@ void devlink_region_destroy(struct devlink_region *region)
        struct devlink *devlink = region->devlink;
        struct devlink_snapshot *snapshot, *ts;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
 
        /* Free all snapshots of region */
        list_for_each_entry_safe(snapshot, ts, &region->snapshot_list, list)
@@ -11130,7 +11108,7 @@ void devlink_region_destroy(struct devlink_region *region)
        list_del(&region->list);
 
        devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_DEL);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        kfree(region);
 }
 EXPORT_SYMBOL_GPL(devlink_region_destroy);
@@ -11154,9 +11132,9 @@ int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id)
 {
        int err;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        err = __devlink_region_snapshot_id_get(devlink, id);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 
        return err;
 }
@@ -11174,9 +11152,9 @@ EXPORT_SYMBOL_GPL(devlink_region_snapshot_id_get);
  */
 void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id)
 {
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        __devlink_snapshot_id_decrement(devlink, id);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_region_snapshot_id_put);
 
@@ -11198,9 +11176,9 @@ int devlink_region_snapshot_create(struct devlink_region *region,
        struct devlink *devlink = region->devlink;
        int err;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        err = __devlink_region_snapshot_create(region, data, snapshot_id);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 
        return err;
 }
@@ -11583,7 +11561,7 @@ int devlink_traps_register(struct devlink *devlink,
        if (!devlink->ops->trap_init || !devlink->ops->trap_action_set)
                return -EINVAL;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        for (i = 0; i < traps_count; i++) {
                const struct devlink_trap *trap = &traps[i];
 
@@ -11595,7 +11573,7 @@ int devlink_traps_register(struct devlink *devlink,
                if (err)
                        goto err_trap_register;
        }
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 
        return 0;
 
@@ -11603,7 +11581,7 @@ err_trap_register:
 err_trap_verify:
        for (i--; i >= 0; i--)
                devlink_trap_unregister(devlink, &traps[i]);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_traps_register);
@@ -11620,7 +11598,7 @@ void devlink_traps_unregister(struct devlink *devlink,
 {
        int i;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        /* Make sure we do not have any packets in-flight while unregistering
         * traps by disabling all of them and waiting for a grace period.
         */
@@ -11629,7 +11607,7 @@ void devlink_traps_unregister(struct devlink *devlink,
        synchronize_rcu();
        for (i = traps_count - 1; i >= 0; i--)
                devlink_trap_unregister(devlink, &traps[i]);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_traps_unregister);
 
@@ -11641,8 +11619,8 @@ devlink_trap_stats_update(struct devlink_stats __percpu *trap_stats,
 
        stats = this_cpu_ptr(trap_stats);
        u64_stats_update_begin(&stats->syncp);
-       stats->rx_bytes += skb_len;
-       stats->rx_packets++;
+       u64_stats_add(&stats->rx_bytes, skb_len);
+       u64_stats_inc(&stats->rx_packets);
        u64_stats_update_end(&stats->syncp);
 }
 
@@ -11801,7 +11779,7 @@ int devlink_trap_groups_register(struct devlink *devlink,
 {
        int i, err;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        for (i = 0; i < groups_count; i++) {
                const struct devlink_trap_group *group = &groups[i];
 
@@ -11813,7 +11791,7 @@ int devlink_trap_groups_register(struct devlink *devlink,
                if (err)
                        goto err_trap_group_register;
        }
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 
        return 0;
 
@@ -11821,7 +11799,7 @@ err_trap_group_register:
 err_trap_group_verify:
        for (i--; i >= 0; i--)
                devlink_trap_group_unregister(devlink, &groups[i]);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_trap_groups_register);
@@ -11838,10 +11816,10 @@ void devlink_trap_groups_unregister(struct devlink *devlink,
 {
        int i;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        for (i = groups_count - 1; i >= 0; i--)
                devlink_trap_group_unregister(devlink, &groups[i]);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_trap_groups_unregister);
 
@@ -11941,7 +11919,7 @@ devlink_trap_policers_register(struct devlink *devlink,
 {
        int i, err;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        for (i = 0; i < policers_count; i++) {
                const struct devlink_trap_policer *policer = &policers[i];
 
@@ -11956,7 +11934,7 @@ devlink_trap_policers_register(struct devlink *devlink,
                if (err)
                        goto err_trap_policer_register;
        }
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 
        return 0;
 
@@ -11964,7 +11942,7 @@ err_trap_policer_register:
 err_trap_policer_verify:
        for (i--; i >= 0; i--)
                devlink_trap_policer_unregister(devlink, &policers[i]);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
        return err;
 }
 EXPORT_SYMBOL_GPL(devlink_trap_policers_register);
@@ -11982,10 +11960,10 @@ devlink_trap_policers_unregister(struct devlink *devlink,
 {
        int i;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        for (i = policers_count - 1; i >= 0; i--)
                devlink_trap_policer_unregister(devlink, &policers[i]);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 EXPORT_SYMBOL_GPL(devlink_trap_policers_unregister);
 
@@ -12039,9 +12017,9 @@ void devlink_compat_running_version(struct devlink *devlink,
        if (!devlink->ops->info_get)
                return;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        __devlink_compat_running_version(devlink, buf, len);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 }
 
 int devlink_compat_flash_update(struct devlink *devlink, const char *file_name)
@@ -12056,11 +12034,11 @@ int devlink_compat_flash_update(struct devlink *devlink, const char *file_name)
        if (ret)
                return ret;
 
-       mutex_lock(&devlink->lock);
+       devl_lock(devlink);
        devlink_flash_update_begin_notify(devlink);
        ret = devlink->ops->flash_update(devlink, &params, NULL);
        devlink_flash_update_end_notify(devlink);
-       mutex_unlock(&devlink->lock);
+       devl_unlock(devlink);
 
        release_firmware(params.fw);