return test_bit(limit, &devlink->ops->reload_limits);
 }
 
+static int devlink_reload_stat_put(struct sk_buff *msg, enum devlink_reload_action action,
+                                  enum devlink_reload_limit limit, u32 value)
+{
+       struct nlattr *reload_stats_entry;
+
+       reload_stats_entry = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_STATS_ENTRY);
+       if (!reload_stats_entry)
+               return -EMSGSIZE;
+
+       if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_ACTION, action) ||
+           nla_put_u8(msg, DEVLINK_ATTR_RELOAD_STATS_LIMIT, limit) ||
+           nla_put_u32(msg, DEVLINK_ATTR_RELOAD_STATS_VALUE, value))
+               goto nla_put_failure;
+       nla_nest_end(msg, reload_stats_entry);
+       return 0;
+
+nla_put_failure:
+       nla_nest_cancel(msg, reload_stats_entry);
+       return -EMSGSIZE;
+}
+
+static int devlink_reload_stats_put(struct sk_buff *msg, struct devlink *devlink)
+{
+       struct nlattr *reload_stats_attr;
+       int i, j, stat_idx;
+       u32 value;
+
+       reload_stats_attr = nla_nest_start(msg, DEVLINK_ATTR_RELOAD_STATS);
+
+       if (!reload_stats_attr)
+               return -EMSGSIZE;
+
+       for (j = 0; j <= DEVLINK_RELOAD_LIMIT_MAX; j++) {
+               if (j != DEVLINK_RELOAD_LIMIT_UNSPEC &&
+                   !devlink_reload_limit_is_supported(devlink, j))
+                       continue;
+               for (i = 0; i <= DEVLINK_RELOAD_ACTION_MAX; i++) {
+                       if (!devlink_reload_action_is_supported(devlink, i) ||
+                           devlink_reload_combination_is_invalid(i, j))
+                               continue;
+
+                       stat_idx = j * __DEVLINK_RELOAD_ACTION_MAX + i;
+                       value = devlink->stats.reload_stats[stat_idx];
+                       if (devlink_reload_stat_put(msg, i, j, value))
+                               goto nla_put_failure;
+               }
+       }
+       nla_nest_end(msg, reload_stats_attr);
+       return 0;
+
+nla_put_failure:
+       nla_nest_cancel(msg, reload_stats_attr);
+       return -EMSGSIZE;
+}
+
 static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink,
                           enum devlink_command cmd, u32 portid,
                           u32 seq, int flags)
 {
+       struct nlattr *dev_stats;
        void *hdr;
 
        hdr = genlmsg_put(msg, portid, seq, &devlink_nl_family, flags, cmd);
        if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed))
                goto nla_put_failure;
 
+       dev_stats = nla_nest_start(msg, DEVLINK_ATTR_DEV_STATS);
+       if (!dev_stats)
+               goto nla_put_failure;
+
+       if (devlink_reload_stats_put(msg, devlink))
+               goto dev_stats_nest_cancel;
+
+       nla_nest_end(msg, dev_stats);
        genlmsg_end(msg, hdr);
        return 0;
 
+dev_stats_nest_cancel:
+       nla_nest_cancel(msg, dev_stats);
 nla_put_failure:
        genlmsg_cancel(msg, hdr);
        return -EMSGSIZE;
 }
 EXPORT_SYMBOL_GPL(devlink_is_reload_failed);
 
+static void
+__devlink_reload_stats_update(struct devlink *devlink, u32 *reload_stats,
+                             enum devlink_reload_limit limit, u32 actions_performed)
+{
+       unsigned long actions = actions_performed;
+       int stat_idx;
+       int action;
+
+       for_each_set_bit(action, &actions, __DEVLINK_RELOAD_ACTION_MAX) {
+               stat_idx = limit * __DEVLINK_RELOAD_ACTION_MAX + action;
+               reload_stats[stat_idx]++;
+       }
+       devlink_notify(devlink, DEVLINK_CMD_NEW);
+}
+
+static void
+devlink_reload_stats_update(struct devlink *devlink, enum devlink_reload_limit limit,
+                           u32 actions_performed)
+{
+       __devlink_reload_stats_update(devlink, devlink->stats.reload_stats, limit,
+                                     actions_performed);
+}
+
 static int devlink_reload(struct devlink *devlink, struct net *dest_net,
                          enum devlink_reload_action action, enum devlink_reload_limit limit,
                          u32 *actions_performed, struct netlink_ext_ack *extack)
                return err;
 
        WARN_ON(!(*actions_performed & BIT(action)));
+       devlink_reload_stats_update(devlink, limit, *actions_performed);
        return 0;
 }