Commit 3f26a315 authored by Jiri Pirko's avatar Jiri Pirko Committed by Saeed Mahameed

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: default avatarJiri Pirko <jiri@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 9b2e3723
...@@ -263,9 +263,10 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink, ...@@ -263,9 +263,10 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink,
struct netlink_ext_ack *extack) struct netlink_ext_ack *extack)
{ {
struct mlx5_core_dev *dev = devlink_priv(devlink); struct mlx5_core_dev *dev = devlink_priv(devlink);
struct mlx5_devlink_trap_event_ctx trap_event_ctx;
enum devlink_trap_action action_orig; enum devlink_trap_action action_orig;
struct mlx5_devlink_trap *dl_trap; struct mlx5_devlink_trap *dl_trap;
int err = 0; int err;
if (is_mdev_switchdev_mode(dev)) { if (is_mdev_switchdev_mode(dev)) {
NL_SET_ERR_MSG_MOD(extack, "Devlink traps can't be set in switchdev mode"); 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, ...@@ -275,26 +276,25 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink,
dl_trap = mlx5_find_trap_by_id(dev, trap->id); dl_trap = mlx5_find_trap_by_id(dev, trap->id);
if (!dl_trap) { if (!dl_trap) {
mlx5_core_err(dev, "Devlink trap: Set action on invalid trap id 0x%x", trap->id); mlx5_core_err(dev, "Devlink trap: Set action on invalid trap id 0x%x", trap->id);
err = -EINVAL; return -EINVAL;
goto out;
} }
if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP) { if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP)
err = -EOPNOTSUPP; return -EOPNOTSUPP;
goto out;
}
if (action == dl_trap->trap.action) if (action == dl_trap->trap.action)
goto out; return 0;
action_orig = dl_trap->trap.action; action_orig = dl_trap->trap.action;
dl_trap->trap.action = 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, err = mlx5_blocking_notifier_call_chain(dev, MLX5_DRIVER_EVENT_TYPE_TRAP,
&dl_trap->trap); &trap_event_ctx);
if (err) if (err == NOTIFY_BAD)
dl_trap->trap.action = action_orig; dl_trap->trap.action = action_orig;
out:
return err; return trap_event_ctx.err;
} }
static const struct devlink_ops mlx5_devlink_ops = { static const struct devlink_ops mlx5_devlink_ops = {
......
...@@ -24,6 +24,11 @@ struct mlx5_devlink_trap { ...@@ -24,6 +24,11 @@ struct mlx5_devlink_trap {
struct list_head list; struct list_head list;
}; };
struct mlx5_devlink_trap_event_ctx {
struct mlx5_trap_ctx *trap;
int err;
};
struct mlx5_core_dev; struct mlx5_core_dev;
void mlx5_devlink_trap_report(struct mlx5_core_dev *dev, int trap_id, struct sk_buff *skb, void mlx5_devlink_trap_report(struct mlx5_core_dev *dev, int trap_id, struct sk_buff *skb,
struct devlink_port *dl_port); struct devlink_port *dl_port);
......
...@@ -179,17 +179,21 @@ static void mlx5e_disable_async_events(struct mlx5e_priv *priv) ...@@ -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) 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 mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, blocking_events_nb);
struct mlx5_devlink_trap_event_ctx *trap_event_ctx = data;
int err; int err;
switch (event) { switch (event) {
case MLX5_DRIVER_EVENT_TYPE_TRAP: 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; break;
default: default:
netdev_warn(priv->netdev, "Sync event: Unknown event %ld\n", event); return NOTIFY_DONE;
err = -EINVAL;
} }
return err; return NOTIFY_OK;
} }
static void mlx5e_enable_blocking_events(struct mlx5e_priv *priv) static void mlx5e_enable_blocking_events(struct mlx5e_priv *priv)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment