diff options
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r-- | net/core/devlink.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/net/core/devlink.c b/net/core/devlink.c index 4a2fb94c44cf..e48680efe54a 100644 --- a/net/core/devlink.c +++ b/net/core/devlink.c | |||
@@ -471,6 +471,8 @@ static int devlink_nl_fill(struct sk_buff *msg, struct devlink *devlink, | |||
471 | 471 | ||
472 | if (devlink_nl_put_handle(msg, devlink)) | 472 | if (devlink_nl_put_handle(msg, devlink)) |
473 | goto nla_put_failure; | 473 | goto nla_put_failure; |
474 | if (nla_put_u8(msg, DEVLINK_ATTR_RELOAD_FAILED, devlink->reload_failed)) | ||
475 | goto nla_put_failure; | ||
474 | 476 | ||
475 | genlmsg_end(msg, hdr); | 477 | genlmsg_end(msg, hdr); |
476 | return 0; | 478 | return 0; |
@@ -2672,12 +2674,32 @@ devlink_resources_validate(struct devlink *devlink, | |||
2672 | return err; | 2674 | return err; |
2673 | } | 2675 | } |
2674 | 2676 | ||
2677 | static bool devlink_reload_supported(struct devlink *devlink) | ||
2678 | { | ||
2679 | return devlink->ops->reload_down && devlink->ops->reload_up; | ||
2680 | } | ||
2681 | |||
2682 | static void devlink_reload_failed_set(struct devlink *devlink, | ||
2683 | bool reload_failed) | ||
2684 | { | ||
2685 | if (devlink->reload_failed == reload_failed) | ||
2686 | return; | ||
2687 | devlink->reload_failed = reload_failed; | ||
2688 | devlink_notify(devlink, DEVLINK_CMD_NEW); | ||
2689 | } | ||
2690 | |||
2691 | bool devlink_is_reload_failed(const struct devlink *devlink) | ||
2692 | { | ||
2693 | return devlink->reload_failed; | ||
2694 | } | ||
2695 | EXPORT_SYMBOL_GPL(devlink_is_reload_failed); | ||
2696 | |||
2675 | static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) | 2697 | static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) |
2676 | { | 2698 | { |
2677 | struct devlink *devlink = info->user_ptr[0]; | 2699 | struct devlink *devlink = info->user_ptr[0]; |
2678 | int err; | 2700 | int err; |
2679 | 2701 | ||
2680 | if (!devlink->ops->reload) | 2702 | if (!devlink_reload_supported(devlink)) |
2681 | return -EOPNOTSUPP; | 2703 | return -EOPNOTSUPP; |
2682 | 2704 | ||
2683 | err = devlink_resources_validate(devlink, NULL, info); | 2705 | err = devlink_resources_validate(devlink, NULL, info); |
@@ -2685,7 +2707,12 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) | |||
2685 | NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed"); | 2707 | NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed"); |
2686 | return err; | 2708 | return err; |
2687 | } | 2709 | } |
2688 | return devlink->ops->reload(devlink, info->extack); | 2710 | err = devlink->ops->reload_down(devlink, info->extack); |
2711 | if (err) | ||
2712 | return err; | ||
2713 | err = devlink->ops->reload_up(devlink, info->extack); | ||
2714 | devlink_reload_failed_set(devlink, !!err); | ||
2715 | return err; | ||
2689 | } | 2716 | } |
2690 | 2717 | ||
2691 | static int devlink_nl_flash_update_fill(struct sk_buff *msg, | 2718 | static int devlink_nl_flash_update_fill(struct sk_buff *msg, |
@@ -7150,7 +7177,7 @@ __devlink_param_driverinit_value_set(struct devlink *devlink, | |||
7150 | int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, | 7177 | int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, |
7151 | union devlink_param_value *init_val) | 7178 | union devlink_param_value *init_val) |
7152 | { | 7179 | { |
7153 | if (!devlink->ops->reload) | 7180 | if (!devlink_reload_supported(devlink)) |
7154 | return -EOPNOTSUPP; | 7181 | return -EOPNOTSUPP; |
7155 | 7182 | ||
7156 | return __devlink_param_driverinit_value_get(&devlink->param_list, | 7183 | return __devlink_param_driverinit_value_get(&devlink->param_list, |
@@ -7197,7 +7224,7 @@ int devlink_port_param_driverinit_value_get(struct devlink_port *devlink_port, | |||
7197 | { | 7224 | { |
7198 | struct devlink *devlink = devlink_port->devlink; | 7225 | struct devlink *devlink = devlink_port->devlink; |
7199 | 7226 | ||
7200 | if (!devlink->ops->reload) | 7227 | if (!devlink_reload_supported(devlink)) |
7201 | return -EOPNOTSUPP; | 7228 | return -EOPNOTSUPP; |
7202 | 7229 | ||
7203 | return __devlink_param_driverinit_value_get(&devlink_port->param_list, | 7230 | return __devlink_param_driverinit_value_get(&devlink_port->param_list, |