aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/devlink.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/core/devlink.c')
-rw-r--r--net/core/devlink.c35
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
2677static bool devlink_reload_supported(struct devlink *devlink)
2678{
2679 return devlink->ops->reload_down && devlink->ops->reload_up;
2680}
2681
2682static 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
2691bool devlink_is_reload_failed(const struct devlink *devlink)
2692{
2693 return devlink->reload_failed;
2694}
2695EXPORT_SYMBOL_GPL(devlink_is_reload_failed);
2696
2675static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info) 2697static 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
2691static int devlink_nl_flash_update_fill(struct sk_buff *msg, 2718static int devlink_nl_flash_update_fill(struct sk_buff *msg,
@@ -7150,7 +7177,7 @@ __devlink_param_driverinit_value_set(struct devlink *devlink,
7150int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, 7177int 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,