mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 21:54:06 +08:00
mlxsw: spectrum_buffers: Add extack messages for invalid configurations
Add extack messages to better communicate invalid configuration to the user. Example: # devlink sb pool set pci/0000:01:00.0 pool 0 size 104857600 thtype dynamic Error: mlxsw_spectrum: Exceeded shared buffer size. devlink answers: Invalid argument Signed-off-by: Ido Schimmel <idosch@mellanox.com> Acked-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Petr Machata <petrm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f2ad1a522e
commit
8f6862065d
@ -790,7 +790,8 @@ mlxsw_devlink_sb_pool_set(struct devlink *devlink,
|
||||
if (!mlxsw_driver->sb_pool_set)
|
||||
return -EOPNOTSUPP;
|
||||
return mlxsw_driver->sb_pool_set(mlxsw_core, sb_index,
|
||||
pool_index, size, threshold_type);
|
||||
pool_index, size, threshold_type,
|
||||
extack);
|
||||
}
|
||||
|
||||
static void *__dl_port(struct devlink_port *devlink_port)
|
||||
@ -841,7 +842,7 @@ static int mlxsw_devlink_sb_port_pool_set(struct devlink_port *devlink_port,
|
||||
!mlxsw_core_port_check(mlxsw_core_port))
|
||||
return -EOPNOTSUPP;
|
||||
return mlxsw_driver->sb_port_pool_set(mlxsw_core_port, sb_index,
|
||||
pool_index, threshold);
|
||||
pool_index, threshold, extack);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -878,7 +879,7 @@ mlxsw_devlink_sb_tc_pool_bind_set(struct devlink_port *devlink_port,
|
||||
return -EOPNOTSUPP;
|
||||
return mlxsw_driver->sb_tc_pool_bind_set(mlxsw_core_port, sb_index,
|
||||
tc_index, pool_type,
|
||||
pool_index, threshold);
|
||||
pool_index, threshold, extack);
|
||||
}
|
||||
|
||||
static int mlxsw_devlink_sb_occ_snapshot(struct devlink *devlink,
|
||||
|
@ -254,13 +254,14 @@ struct mlxsw_driver {
|
||||
struct devlink_sb_pool_info *pool_info);
|
||||
int (*sb_pool_set)(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index, u16 pool_index, u32 size,
|
||||
enum devlink_sb_threshold_type threshold_type);
|
||||
enum devlink_sb_threshold_type threshold_type,
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*sb_port_pool_get)(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 pool_index,
|
||||
u32 *p_threshold);
|
||||
int (*sb_port_pool_set)(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 pool_index,
|
||||
u32 threshold);
|
||||
u32 threshold, struct netlink_ext_ack *extack);
|
||||
int (*sb_tc_pool_bind_get)(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 tc_index,
|
||||
enum devlink_sb_pool_type pool_type,
|
||||
@ -268,7 +269,8 @@ struct mlxsw_driver {
|
||||
int (*sb_tc_pool_bind_set)(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 tc_index,
|
||||
enum devlink_sb_pool_type pool_type,
|
||||
u16 pool_index, u32 threshold);
|
||||
u16 pool_index, u32 threshold,
|
||||
struct netlink_ext_ack *extack);
|
||||
int (*sb_occ_snapshot)(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index);
|
||||
int (*sb_occ_max_clear)(struct mlxsw_core *mlxsw_core,
|
||||
|
@ -371,13 +371,14 @@ int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
|
||||
struct devlink_sb_pool_info *pool_info);
|
||||
int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index, u16 pool_index, u32 size,
|
||||
enum devlink_sb_threshold_type threshold_type);
|
||||
enum devlink_sb_threshold_type threshold_type,
|
||||
struct netlink_ext_ack *extack);
|
||||
int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 pool_index,
|
||||
u32 *p_threshold);
|
||||
int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 pool_index,
|
||||
u32 threshold);
|
||||
u32 threshold, struct netlink_ext_ack *extack);
|
||||
int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 tc_index,
|
||||
enum devlink_sb_pool_type pool_type,
|
||||
@ -385,7 +386,8 @@ int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
|
||||
int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 tc_index,
|
||||
enum devlink_sb_pool_type pool_type,
|
||||
u16 pool_index, u32 threshold);
|
||||
u16 pool_index, u32 threshold,
|
||||
struct netlink_ext_ack *extack);
|
||||
int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index);
|
||||
int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <linux/dcbnl.h>
|
||||
#include <linux/if_ether.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/netlink.h>
|
||||
|
||||
#include "spectrum.h"
|
||||
#include "core.h"
|
||||
@ -900,14 +901,17 @@ int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
|
||||
|
||||
int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index, u16 pool_index, u32 size,
|
||||
enum devlink_sb_threshold_type threshold_type)
|
||||
enum devlink_sb_threshold_type threshold_type,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||
u32 pool_size = mlxsw_sp_bytes_cells(mlxsw_sp, size);
|
||||
enum mlxsw_reg_sbpr_mode mode;
|
||||
|
||||
if (size > MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_BUFFER_SIZE))
|
||||
if (size > MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_BUFFER_SIZE)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Exceeded shared buffer size");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mode = (enum mlxsw_reg_sbpr_mode) threshold_type;
|
||||
return mlxsw_sp_sb_pr_write(mlxsw_sp, pool_index, mode,
|
||||
@ -927,7 +931,8 @@ static u32 mlxsw_sp_sb_threshold_out(struct mlxsw_sp *mlxsw_sp, u16 pool_index,
|
||||
}
|
||||
|
||||
static int mlxsw_sp_sb_threshold_in(struct mlxsw_sp *mlxsw_sp, u16 pool_index,
|
||||
u32 threshold, u32 *p_max_buff)
|
||||
u32 threshold, u32 *p_max_buff,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlxsw_sp_sb_pr *pr = mlxsw_sp_sb_pr_get(mlxsw_sp, pool_index);
|
||||
|
||||
@ -936,8 +941,10 @@ static int mlxsw_sp_sb_threshold_in(struct mlxsw_sp *mlxsw_sp, u16 pool_index,
|
||||
|
||||
val = threshold + MLXSW_SP_SB_THRESHOLD_TO_ALPHA_OFFSET;
|
||||
if (val < MLXSW_REG_SBXX_DYN_MAX_BUFF_MIN ||
|
||||
val > MLXSW_REG_SBXX_DYN_MAX_BUFF_MAX)
|
||||
val > MLXSW_REG_SBXX_DYN_MAX_BUFF_MAX) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Invalid dynamic threshold value");
|
||||
return -EINVAL;
|
||||
}
|
||||
*p_max_buff = val;
|
||||
} else {
|
||||
*p_max_buff = mlxsw_sp_bytes_cells(mlxsw_sp, threshold);
|
||||
@ -963,7 +970,7 @@ int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
|
||||
|
||||
int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 pool_index,
|
||||
u32 threshold)
|
||||
u32 threshold, struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlxsw_sp_port *mlxsw_sp_port =
|
||||
mlxsw_core_port_driver_priv(mlxsw_core_port);
|
||||
@ -973,7 +980,7 @@ int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
|
||||
int err;
|
||||
|
||||
err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index,
|
||||
threshold, &max_buff);
|
||||
threshold, &max_buff, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -1004,7 +1011,8 @@ int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
|
||||
int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
|
||||
unsigned int sb_index, u16 tc_index,
|
||||
enum devlink_sb_pool_type pool_type,
|
||||
u16 pool_index, u32 threshold)
|
||||
u16 pool_index, u32 threshold,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlxsw_sp_port *mlxsw_sp_port =
|
||||
mlxsw_core_port_driver_priv(mlxsw_core_port);
|
||||
@ -1015,11 +1023,13 @@ int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
|
||||
u32 max_buff;
|
||||
int err;
|
||||
|
||||
if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir)
|
||||
if (dir != mlxsw_sp->sb_vals->pool_dess[pool_index].dir) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Binding egress TC to ingress pool and vice versa is forbidden");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = mlxsw_sp_sb_threshold_in(mlxsw_sp, pool_index,
|
||||
threshold, &max_buff);
|
||||
threshold, &max_buff, extack);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user