struct mutex dump_lock; /* lock parallel read/write from dump buffers */
        u64 graceful_period;
        bool auto_recover;
+       bool auto_dump;
        u8 health_state;
        u64 dump_ts;
        u64 dump_real_ts;
        reporter->devlink = devlink;
        reporter->graceful_period = graceful_period;
        reporter->auto_recover = !!ops->recover;
+       reporter->auto_dump = !!ops->dump;
        mutex_init(&reporter->dump_lock);
        refcount_set(&reporter->refcount, 1);
        list_add_tail(&reporter->list, &devlink->reporter_list);
            nla_put_u64_64bit(msg, DEVLINK_ATTR_HEALTH_REPORTER_DUMP_TS_NS,
                              reporter->dump_real_ts, DEVLINK_ATTR_PAD))
                goto reporter_nest_cancel;
+       if (reporter->ops->dump &&
+           nla_put_u8(msg, DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP,
+                      reporter->auto_dump))
+               goto reporter_nest_cancel;
 
        nla_nest_end(msg, reporter_attr);
        genlmsg_end(msg, hdr);
 
        reporter->health_state = DEVLINK_HEALTH_REPORTER_STATE_ERROR;
 
-       mutex_lock(&reporter->dump_lock);
-       /* store current dump of current error, for later analysis */
-       devlink_health_do_dump(reporter, priv_ctx, NULL);
-       mutex_unlock(&reporter->dump_lock);
+       if (reporter->auto_dump) {
+               mutex_lock(&reporter->dump_lock);
+               /* store current dump of current error, for later analysis */
+               devlink_health_do_dump(reporter, priv_ctx, NULL);
+               mutex_unlock(&reporter->dump_lock);
+       }
 
        if (reporter->auto_recover)
                return devlink_health_reporter_recover(reporter,
                err = -EOPNOTSUPP;
                goto out;
        }
+       if (!reporter->ops->dump &&
+           info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP]) {
+               err = -EOPNOTSUPP;
+               goto out;
+       }
 
        if (info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_GRACEFUL_PERIOD])
                reporter->graceful_period =
                reporter->auto_recover =
                        nla_get_u8(info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_RECOVER]);
 
+       if (info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP])
+               reporter->auto_dump =
+               nla_get_u8(info->attrs[DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP]);
+
        devlink_health_reporter_put(reporter);
        return 0;
 out:
        [DEVLINK_ATTR_NETNS_PID] = { .type = NLA_U32 },
        [DEVLINK_ATTR_NETNS_FD] = { .type = NLA_U32 },
        [DEVLINK_ATTR_NETNS_ID] = { .type = NLA_U32 },
+       [DEVLINK_ATTR_HEALTH_REPORTER_AUTO_DUMP] = { .type = NLA_U8 },
 };
 
 static const struct genl_ops devlink_nl_ops[] = {