aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/devlink.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2019-09-13 16:11:14 -0400
committerDavid S. Miller <davem@davemloft.net>2019-09-13 16:11:14 -0400
commit1ba569fc2250b7717fcf3b943efe043c98c6a919 (patch)
tree28ebb70925a228cefd4eab0435e7e66f96e0719f /net/core/devlink.c
parentc6af0c227a22bb6bb8ff72f043e0fb6d99fd6515 (diff)
parent2670ac2625f98557fd7e083f8aa22c297e49039e (diff)
Merge branch 'devlink-move-reload-fail-indication-to-devlink-core-and-expose-to-user'
Jiri Pirko says: ==================== net: devlink: move reload fail indication to devlink core and expose to user First two patches are dependencies of the last one. That moves devlink reload failure indication to the devlink code, so the drivers do not have to track it themselves. Currently it is only mlxsw, but I will send a follow-up patchset that introduces this in netdevsim too. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
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,