net: devlink: split reload op into two
authorJiri Pirko <jiri@mellanox.com>
Thu, 12 Sep 2019 08:49:45 +0000 (10:49 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Sep 2019 20:11:14 +0000 (22:11 +0200)
In order to properly implement failure indication during reload,
split the reload op into two ops, one for down phase and one for
up phase.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/main.c
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/netdevsim/dev.c
include/net/devlink.h
net/core/devlink.c

index a39c647c12dcb25f188ccb90f1a326d45735d1c5..ef3f3d06ff1e71cb870ffae4400e801f5d93a26b 100644 (file)
@@ -3935,17 +3935,27 @@ static void mlx4_restart_one_down(struct pci_dev *pdev);
 static int mlx4_restart_one_up(struct pci_dev *pdev, bool reload,
                               struct devlink *devlink);
 
-static int mlx4_devlink_reload(struct devlink *devlink,
-                              struct netlink_ext_ack *extack)
+static int mlx4_devlink_reload_down(struct devlink *devlink,
+                                   struct netlink_ext_ack *extack)
 {
        struct mlx4_priv *priv = devlink_priv(devlink);
        struct mlx4_dev *dev = &priv->dev;
        struct mlx4_dev_persistent *persist = dev->persist;
-       int err;
 
        if (persist->num_vfs)
                mlx4_warn(persist->dev, "Reload performed on PF, will cause reset on operating Virtual Functions\n");
        mlx4_restart_one_down(persist->pdev);
+       return 0;
+}
+
+static int mlx4_devlink_reload_up(struct devlink *devlink,
+                                 struct netlink_ext_ack *extack)
+{
+       struct mlx4_priv *priv = devlink_priv(devlink);
+       struct mlx4_dev *dev = &priv->dev;
+       struct mlx4_dev_persistent *persist = dev->persist;
+       int err;
+
        err = mlx4_restart_one_up(persist->pdev, true, devlink);
        if (err)
                mlx4_err(persist->dev, "mlx4_restart_one_up failed, ret=%d\n",
@@ -3956,7 +3966,8 @@ static int mlx4_devlink_reload(struct devlink *devlink,
 
 static const struct devlink_ops mlx4_devlink_ops = {
        .port_type_set  = mlx4_devlink_port_type_set,
-       .reload         = mlx4_devlink_reload,
+       .reload_down    = mlx4_devlink_reload_down,
+       .reload_up      = mlx4_devlink_reload_up,
 };
 
 static int mlx4_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
index 963a2b4b61b1fc00827d5e2d8e9eabedaccccf29..c71a1d9ea17b7f5049c799b157474787d156843e 100644 (file)
@@ -984,16 +984,26 @@ mlxsw_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
        return 0;
 }
 
-static int mlxsw_devlink_core_bus_device_reload(struct devlink *devlink,
-                                               struct netlink_ext_ack *extack)
+static int
+mlxsw_devlink_core_bus_device_reload_down(struct devlink *devlink,
+                                         struct netlink_ext_ack *extack)
 {
        struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
-       int err;
 
        if (!(mlxsw_core->bus->features & MLXSW_BUS_F_RESET))
                return -EOPNOTSUPP;
 
        mlxsw_core_bus_device_unregister(mlxsw_core, true);
+       return 0;
+}
+
+static int
+mlxsw_devlink_core_bus_device_reload_up(struct devlink *devlink,
+                                       struct netlink_ext_ack *extack)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
+       int err;
+
        err = mlxsw_core_bus_device_register(mlxsw_core->bus_info,
                                             mlxsw_core->bus,
                                             mlxsw_core->bus_priv, true,
@@ -1066,7 +1076,8 @@ mlxsw_devlink_trap_group_init(struct devlink *devlink,
 }
 
 static const struct devlink_ops mlxsw_devlink_ops = {
-       .reload                         = mlxsw_devlink_core_bus_device_reload,
+       .reload_down            = mlxsw_devlink_core_bus_device_reload_down,
+       .reload_up              = mlxsw_devlink_core_bus_device_reload_up,
        .port_type_set                  = mlxsw_devlink_port_type_set,
        .port_split                     = mlxsw_devlink_port_split,
        .port_unsplit                   = mlxsw_devlink_port_unsplit,
index 39cdb6c18ec0e933b66eaa1ac2ea33aebfc74b4c..7fba7b271a57289f37b2b2d889f2e998bfa3a6e6 100644 (file)
@@ -521,8 +521,14 @@ static void nsim_dev_traps_exit(struct devlink *devlink)
        kfree(nsim_dev->trap_data);
 }
 
-static int nsim_dev_reload(struct devlink *devlink,
-                          struct netlink_ext_ack *extack)
+static int nsim_dev_reload_down(struct devlink *devlink,
+                               struct netlink_ext_ack *extack)
+{
+       return 0;
+}
+
+static int nsim_dev_reload_up(struct devlink *devlink,
+                             struct netlink_ext_ack *extack)
 {
        enum nsim_resource_id res_ids[] = {
                NSIM_RESOURCE_IPV4_FIB, NSIM_RESOURCE_IPV4_FIB_RULES,
@@ -638,7 +644,8 @@ nsim_dev_devlink_trap_action_set(struct devlink *devlink,
 }
 
 static const struct devlink_ops nsim_dev_devlink_ops = {
-       .reload = nsim_dev_reload,
+       .reload_down = nsim_dev_reload_down,
+       .reload_up = nsim_dev_reload_up,
        .flash_update = nsim_dev_flash_update,
        .trap_init = nsim_dev_devlink_trap_init,
        .trap_action_set = nsim_dev_devlink_trap_action_set,
index 03e4d9244ff31530019f5270c2a6c80a8d31f19c..ab8d56d12ffdabc3091a980baf90f311e4aa2ba2 100644 (file)
@@ -642,7 +642,10 @@ enum devlink_trap_group_generic_id {
        }
 
 struct devlink_ops {
-       int (*reload)(struct devlink *devlink, struct netlink_ext_ack *extack);
+       int (*reload_down)(struct devlink *devlink,
+                          struct netlink_ext_ack *extack);
+       int (*reload_up)(struct devlink *devlink,
+                        struct netlink_ext_ack *extack);
        int (*port_type_set)(struct devlink_port *devlink_port,
                             enum devlink_port_type port_type);
        int (*port_split)(struct devlink *devlink, unsigned int port_index,
index 4a2fb94c44cfe76a5af72213295bfc9b6449327a..9e522639693d87576ecc5685b28f3d2560b4a0e6 100644 (file)
@@ -2672,12 +2672,17 @@ devlink_resources_validate(struct devlink *devlink,
        return err;
 }
 
+static bool devlink_reload_supported(struct devlink *devlink)
+{
+       return devlink->ops->reload_down && devlink->ops->reload_up;
+}
+
 static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info)
 {
        struct devlink *devlink = info->user_ptr[0];
        int err;
 
-       if (!devlink->ops->reload)
+       if (!devlink_reload_supported(devlink))
                return -EOPNOTSUPP;
 
        err = devlink_resources_validate(devlink, NULL, info);
@@ -2685,7 +2690,10 @@ static int devlink_nl_cmd_reload(struct sk_buff *skb, struct genl_info *info)
                NL_SET_ERR_MSG_MOD(info->extack, "resources size validation failed");
                return err;
        }
-       return devlink->ops->reload(devlink, info->extack);
+       err = devlink->ops->reload_down(devlink, info->extack);
+       if (err)
+               return err;
+       return devlink->ops->reload_up(devlink, info->extack);
 }
 
 static int devlink_nl_flash_update_fill(struct sk_buff *msg,
@@ -7150,7 +7158,7 @@ __devlink_param_driverinit_value_set(struct devlink *devlink,
 int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
                                       union devlink_param_value *init_val)
 {
-       if (!devlink->ops->reload)
+       if (!devlink_reload_supported(devlink))
                return -EOPNOTSUPP;
 
        return __devlink_param_driverinit_value_get(&devlink->param_list,
@@ -7197,7 +7205,7 @@ int devlink_port_param_driverinit_value_get(struct devlink_port *devlink_port,
 {
        struct devlink *devlink = devlink_port->devlink;
 
-       if (!devlink->ops->reload)
+       if (!devlink_reload_supported(devlink))
                return -EOPNOTSUPP;
 
        return __devlink_param_driverinit_value_get(&devlink_port->param_list,