mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-08 00:29:36 -04:00
net/mlx5e: Fix trap event handling
Current code does not return correct return value from event handler. Fix it by returning NOTIFY_* and propagate err over newly introduce ctx structure. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
committed by
Saeed Mahameed
parent
9b2e372372
commit
3f26a315f8
@@ -263,9 +263,10 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink,
|
||||
struct netlink_ext_ack *extack)
|
||||
{
|
||||
struct mlx5_core_dev *dev = devlink_priv(devlink);
|
||||
struct mlx5_devlink_trap_event_ctx trap_event_ctx;
|
||||
enum devlink_trap_action action_orig;
|
||||
struct mlx5_devlink_trap *dl_trap;
|
||||
int err = 0;
|
||||
int err;
|
||||
|
||||
if (is_mdev_switchdev_mode(dev)) {
|
||||
NL_SET_ERR_MSG_MOD(extack, "Devlink traps can't be set in switchdev mode");
|
||||
@@ -275,26 +276,25 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink,
|
||||
dl_trap = mlx5_find_trap_by_id(dev, trap->id);
|
||||
if (!dl_trap) {
|
||||
mlx5_core_err(dev, "Devlink trap: Set action on invalid trap id 0x%x", trap->id);
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto out;
|
||||
}
|
||||
if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (action == dl_trap->trap.action)
|
||||
goto out;
|
||||
return 0;
|
||||
|
||||
action_orig = dl_trap->trap.action;
|
||||
dl_trap->trap.action = action;
|
||||
trap_event_ctx.trap = &dl_trap->trap;
|
||||
trap_event_ctx.err = 0;
|
||||
err = mlx5_blocking_notifier_call_chain(dev, MLX5_DRIVER_EVENT_TYPE_TRAP,
|
||||
&dl_trap->trap);
|
||||
if (err)
|
||||
&trap_event_ctx);
|
||||
if (err == NOTIFY_BAD)
|
||||
dl_trap->trap.action = action_orig;
|
||||
out:
|
||||
return err;
|
||||
|
||||
return trap_event_ctx.err;
|
||||
}
|
||||
|
||||
static const struct devlink_ops mlx5_devlink_ops = {
|
||||
|
||||
@@ -24,6 +24,11 @@ struct mlx5_devlink_trap {
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
struct mlx5_devlink_trap_event_ctx {
|
||||
struct mlx5_trap_ctx *trap;
|
||||
int err;
|
||||
};
|
||||
|
||||
struct mlx5_core_dev;
|
||||
void mlx5_devlink_trap_report(struct mlx5_core_dev *dev, int trap_id, struct sk_buff *skb,
|
||||
struct devlink_port *dl_port);
|
||||
|
||||
@@ -179,17 +179,21 @@ static void mlx5e_disable_async_events(struct mlx5e_priv *priv)
|
||||
static int blocking_event(struct notifier_block *nb, unsigned long event, void *data)
|
||||
{
|
||||
struct mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, blocking_events_nb);
|
||||
struct mlx5_devlink_trap_event_ctx *trap_event_ctx = data;
|
||||
int err;
|
||||
|
||||
switch (event) {
|
||||
case MLX5_DRIVER_EVENT_TYPE_TRAP:
|
||||
err = mlx5e_handle_trap_event(priv, data);
|
||||
err = mlx5e_handle_trap_event(priv, trap_event_ctx->trap);
|
||||
if (err) {
|
||||
trap_event_ctx->err = err;
|
||||
return NOTIFY_BAD;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
netdev_warn(priv->netdev, "Sync event: Unknown event %ld\n", event);
|
||||
err = -EINVAL;
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
return err;
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static void mlx5e_enable_blocking_events(struct mlx5e_priv *priv)
|
||||
|
||||
Reference in New Issue
Block a user