devlink: Pass extack when setting trap's action and group's parameters
authorIdo Schimmel <idosch@mellanox.com>
Mon, 3 Aug 2020 16:11:34 +0000 (19:11 +0300)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Aug 2020 01:06:46 +0000 (18:06 -0700)
A later patch will refuse to set the action of certain traps in mlxsw
and also to change the policer binding of certain groups. Pass extack so
that failure could be communicated clearly to user space.

Reviewed-by: Petr Machata <petrm@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Petr Machata <petrm@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/core.c
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/spectrum.h
drivers/net/ethernet/mellanox/mlxsw/spectrum_trap.c
drivers/net/netdevsim/dev.c
include/net/devlink.h
net/core/devlink.c

index 866381e72960dc3336017191f09e60d2ac219628..08d101138fbe177ffc55d9df91b9f932c36b934c 100644 (file)
@@ -1177,14 +1177,15 @@ static void mlxsw_devlink_trap_fini(struct devlink *devlink,
 
 static int mlxsw_devlink_trap_action_set(struct devlink *devlink,
                                         const struct devlink_trap *trap,
-                                        enum devlink_trap_action action)
+                                        enum devlink_trap_action action,
+                                        struct netlink_ext_ack *extack)
 {
        struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
        struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
 
        if (!mlxsw_driver->trap_action_set)
                return -EOPNOTSUPP;
-       return mlxsw_driver->trap_action_set(mlxsw_core, trap, action);
+       return mlxsw_driver->trap_action_set(mlxsw_core, trap, action, extack);
 }
 
 static int
@@ -1202,14 +1203,15 @@ mlxsw_devlink_trap_group_init(struct devlink *devlink,
 static int
 mlxsw_devlink_trap_group_set(struct devlink *devlink,
                             const struct devlink_trap_group *group,
-                            const struct devlink_trap_policer *policer)
+                            const struct devlink_trap_policer *policer,
+                            struct netlink_ext_ack *extack)
 {
        struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
        struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
 
        if (!mlxsw_driver->trap_group_set)
                return -EOPNOTSUPP;
-       return mlxsw_driver->trap_group_set(mlxsw_core, group, policer);
+       return mlxsw_driver->trap_group_set(mlxsw_core, group, policer, extack);
 }
 
 static int
index c1c1e039323aa47ee14882b49878c4d3d7c39189..219ce89e629ac53dc882cc7c65cfd7ef5d5a529e 100644 (file)
@@ -326,12 +326,14 @@ struct mlxsw_driver {
                          const struct devlink_trap *trap, void *trap_ctx);
        int (*trap_action_set)(struct mlxsw_core *mlxsw_core,
                               const struct devlink_trap *trap,
-                              enum devlink_trap_action action);
+                              enum devlink_trap_action action,
+                              struct netlink_ext_ack *extack);
        int (*trap_group_init)(struct mlxsw_core *mlxsw_core,
                               const struct devlink_trap_group *group);
        int (*trap_group_set)(struct mlxsw_core *mlxsw_core,
                              const struct devlink_trap_group *group,
-                             const struct devlink_trap_policer *policer);
+                             const struct devlink_trap_policer *policer,
+                             struct netlink_ext_ack *extack);
        int (*trap_policer_init)(struct mlxsw_core *mlxsw_core,
                                 const struct devlink_trap_policer *policer);
        void (*trap_policer_fini)(struct mlxsw_core *mlxsw_core,
index 6ab1b6d725af580dd55fa07359c56df5e42d5614..866a1193f12b8f3f9ffa56e19ceea26dbe1f7b80 100644 (file)
@@ -1177,12 +1177,14 @@ void mlxsw_sp_trap_fini(struct mlxsw_core *mlxsw_core,
                        const struct devlink_trap *trap, void *trap_ctx);
 int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core,
                             const struct devlink_trap *trap,
-                            enum devlink_trap_action action);
+                            enum devlink_trap_action action,
+                            struct netlink_ext_ack *extack);
 int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,
                             const struct devlink_trap_group *group);
 int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core,
                            const struct devlink_trap_group *group,
-                           const struct devlink_trap_policer *policer);
+                           const struct devlink_trap_policer *policer,
+                           struct netlink_ext_ack *extack);
 int
 mlxsw_sp_trap_policer_init(struct mlxsw_core *mlxsw_core,
                           const struct devlink_trap_policer *policer);
index 1e38dfe7cf64d3b2a8bdc98c0aa6f7329ac70b08..00b6cb9d2306fb14ee9a494e876a6d85d06e99fe 100644 (file)
@@ -1352,7 +1352,8 @@ void mlxsw_sp_trap_fini(struct mlxsw_core *mlxsw_core,
 
 int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core,
                             const struct devlink_trap *trap,
-                            enum devlink_trap_action action)
+                            enum devlink_trap_action action,
+                            struct netlink_ext_ack *extack)
 {
        struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
        const struct mlxsw_sp_trap_item *trap_item;
@@ -1392,7 +1393,7 @@ int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core,
 static int
 __mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,
                           const struct devlink_trap_group *group,
-                          u32 policer_id)
+                          u32 policer_id, struct netlink_ext_ack *extack)
 {
        struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
        u16 hw_policer_id = MLXSW_REG_HTGT_INVALID_POLICER;
@@ -1422,16 +1423,18 @@ int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,
                             const struct devlink_trap_group *group)
 {
        return __mlxsw_sp_trap_group_init(mlxsw_core, group,
-                                         group->init_policer_id);
+                                         group->init_policer_id, NULL);
 }
 
 int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core,
                            const struct devlink_trap_group *group,
-                           const struct devlink_trap_policer *policer)
+                           const struct devlink_trap_policer *policer,
+                           struct netlink_ext_ack *extack)
 {
        u32 policer_id = policer ? policer->id : 0;
 
-       return __mlxsw_sp_trap_group_init(mlxsw_core, group, policer_id);
+       return __mlxsw_sp_trap_group_init(mlxsw_core, group, policer_id,
+                                         extack);
 }
 
 static int
index ce719c830a77a39a239b2019cb9cd2aa706daeef..32f339fedb2167924e4c94d58cc1f79423d730a0 100644 (file)
@@ -810,7 +810,8 @@ static int nsim_dev_devlink_trap_init(struct devlink *devlink,
 static int
 nsim_dev_devlink_trap_action_set(struct devlink *devlink,
                                 const struct devlink_trap *trap,
-                                enum devlink_trap_action action)
+                                enum devlink_trap_action action,
+                                struct netlink_ext_ack *extack)
 {
        struct nsim_dev *nsim_dev = devlink_priv(devlink);
        struct nsim_trap_item *nsim_trap_item;
@@ -829,7 +830,8 @@ nsim_dev_devlink_trap_action_set(struct devlink *devlink,
 static int
 nsim_dev_devlink_trap_group_set(struct devlink *devlink,
                                const struct devlink_trap_group *group,
-                               const struct devlink_trap_policer *policer)
+                               const struct devlink_trap_policer *policer,
+                               struct netlink_ext_ack *extack)
 {
        struct nsim_dev *nsim_dev = devlink_priv(devlink);
 
index fd3ae07604925f06b010effd0375aabec07ab50e..8f3c8a4432382c8733c8398f5f4e2335d6a62cb8 100644 (file)
@@ -1077,7 +1077,8 @@ struct devlink_ops {
         */
        int (*trap_action_set)(struct devlink *devlink,
                               const struct devlink_trap *trap,
-                              enum devlink_trap_action action);
+                              enum devlink_trap_action action,
+                              struct netlink_ext_ack *extack);
        /**
         * @trap_group_init: Trap group initialization function.
         *
@@ -1094,7 +1095,8 @@ struct devlink_ops {
         */
        int (*trap_group_set)(struct devlink *devlink,
                              const struct devlink_trap_group *group,
-                             const struct devlink_trap_policer *policer);
+                             const struct devlink_trap_policer *policer,
+                             struct netlink_ext_ack *extack);
        /**
         * @trap_policer_init: Trap policer initialization function.
         *
index bde4c29a30bcd063774b8cdbf4649f0af30337f8..e674f0f46dc2be64bc5b2b148004826ae3833dde 100644 (file)
@@ -6423,7 +6423,7 @@ static int __devlink_trap_action_set(struct devlink *devlink,
        }
 
        err = devlink->ops->trap_action_set(devlink, trap_item->trap,
-                                           trap_action);
+                                           trap_action, extack);
        if (err)
                return err;
 
@@ -6713,7 +6713,8 @@ static int devlink_trap_group_set(struct devlink *devlink,
        }
        policer = policer_item ? policer_item->policer : NULL;
 
-       err = devlink->ops->trap_group_set(devlink, group_item->group, policer);
+       err = devlink->ops->trap_group_set(devlink, group_item->group, policer,
+                                          extack);
        if (err)
                return err;
 
@@ -9051,7 +9052,8 @@ static void devlink_trap_disable(struct devlink *devlink,
        if (WARN_ON_ONCE(!trap_item))
                return;
 
-       devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP);
+       devlink->ops->trap_action_set(devlink, trap, DEVLINK_TRAP_ACTION_DROP,
+                                     NULL);
        trap_item->action = DEVLINK_TRAP_ACTION_DROP;
 }