Skip to content

Commit 241dc15

Browse files
ayalevinkuba-moo
authored andcommitted
net/mlx5: Notify on trap action by blocking event
In order to allow mlx5 core driver to trigger synchronous operations to its consumers, add a blocking events handler. Add wrappers to blocking_notifier_[call_chain/chain_register/chain_unregister]. Add trap callback for action set and notify about this change. Following patches in the set add a listener for this event. Signed-off-by: Aya Levin <[email protected]> Reviewed-by: Tariq Toukan <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 3eac5d9 commit 241dc15

File tree

4 files changed

+83
-0
lines changed

4 files changed

+83
-0
lines changed

drivers/net/ethernet/mellanox/mlx5/core/devlink.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,41 @@ static void mlx5_devlink_trap_fini(struct devlink *devlink, const struct devlink
218218
kfree(dl_trap);
219219
}
220220

221+
static int mlx5_devlink_trap_action_set(struct devlink *devlink,
222+
const struct devlink_trap *trap,
223+
enum devlink_trap_action action,
224+
struct netlink_ext_ack *extack)
225+
{
226+
struct mlx5_core_dev *dev = devlink_priv(devlink);
227+
enum devlink_trap_action action_orig;
228+
struct mlx5_devlink_trap *dl_trap;
229+
int err = 0;
230+
231+
dl_trap = mlx5_find_trap_by_id(dev, trap->id);
232+
if (!dl_trap) {
233+
mlx5_core_err(dev, "Devlink trap: Set action on invalid trap id 0x%x", trap->id);
234+
err = -EINVAL;
235+
goto out;
236+
}
237+
238+
if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP) {
239+
err = -EOPNOTSUPP;
240+
goto out;
241+
}
242+
243+
if (action == dl_trap->trap.action)
244+
goto out;
245+
246+
action_orig = dl_trap->trap.action;
247+
dl_trap->trap.action = action;
248+
err = mlx5_blocking_notifier_call_chain(dev, MLX5_DRIVER_EVENT_TYPE_TRAP,
249+
&dl_trap->trap);
250+
if (err)
251+
dl_trap->trap.action = action_orig;
252+
out:
253+
return err;
254+
}
255+
221256
static const struct devlink_ops mlx5_devlink_ops = {
222257
#ifdef CONFIG_MLX5_ESWITCH
223258
.eswitch_mode_set = mlx5_devlink_eswitch_mode_set,
@@ -238,6 +273,7 @@ static const struct devlink_ops mlx5_devlink_ops = {
238273
.reload_up = mlx5_devlink_reload_up,
239274
.trap_init = mlx5_devlink_trap_init,
240275
.trap_fini = mlx5_devlink_trap_fini,
276+
.trap_action_set = mlx5_devlink_trap_action_set,
241277
};
242278

243279
void mlx5_devlink_trap_report(struct mlx5_core_dev *dev, int trap_id, struct sk_buff *skb,

drivers/net/ethernet/mellanox/mlx5/core/events.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ struct mlx5_events {
6161
struct mlx5_pme_stats pme_stats;
6262
/*pcie_core*/
6363
struct work_struct pcie_core_work;
64+
/* driver notifier chain for sw events */
65+
struct blocking_notifier_head sw_nh;
6466
};
6567

6668
static const char *eqe_type_str(u8 type)
@@ -351,6 +353,7 @@ int mlx5_events_init(struct mlx5_core_dev *dev)
351353
return -ENOMEM;
352354
}
353355
INIT_WORK(&events->pcie_core_work, mlx5_pcie_event);
356+
BLOCKING_INIT_NOTIFIER_HEAD(&events->sw_nh);
354357

355358
return 0;
356359
}
@@ -406,3 +409,28 @@ int mlx5_notifier_call_chain(struct mlx5_events *events, unsigned int event, voi
406409
{
407410
return atomic_notifier_call_chain(&events->fw_nh, event, data);
408411
}
412+
413+
/* This API is used only for processing and forwarding driver-specific
414+
* events to mlx5 consumers.
415+
*/
416+
int mlx5_blocking_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb)
417+
{
418+
struct mlx5_events *events = dev->priv.events;
419+
420+
return blocking_notifier_chain_register(&events->sw_nh, nb);
421+
}
422+
423+
int mlx5_blocking_notifier_unregister(struct mlx5_core_dev *dev, struct notifier_block *nb)
424+
{
425+
struct mlx5_events *events = dev->priv.events;
426+
427+
return blocking_notifier_chain_unregister(&events->sw_nh, nb);
428+
}
429+
430+
int mlx5_blocking_notifier_call_chain(struct mlx5_core_dev *dev, unsigned int event,
431+
void *data)
432+
{
433+
struct mlx5_events *events = dev->priv.events;
434+
435+
return blocking_notifier_call_chain(&events->sw_nh, event, data);
436+
}

include/linux/mlx5/device.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ enum mlx5_event {
359359
MLX5_EVENT_TYPE_MAX = 0x100,
360360
};
361361

362+
enum mlx5_driver_event {
363+
MLX5_DRIVER_EVENT_TYPE_TRAP = 0,
364+
};
365+
362366
enum {
363367
MLX5_TRACER_SUBTYPE_OWNERSHIP_CHANGE = 0x0,
364368
MLX5_TRACER_SUBTYPE_TRACES_AVAILABLE = 0x1,

include/linux/mlx5/driver.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,11 +1073,26 @@ enum {
10731073
MAX_MR_CACHE_ENTRIES
10741074
};
10751075

1076+
/* Async-atomic event notifier used by mlx5 core to forward FW
1077+
* evetns recived from event queue to mlx5 consumers.
1078+
* Optimise event queue dipatching.
1079+
*/
10761080
int mlx5_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb);
10771081
int mlx5_notifier_unregister(struct mlx5_core_dev *dev, struct notifier_block *nb);
1082+
1083+
/* Async-atomic event notifier used for forwarding
1084+
* evetns from the event queue into the to mlx5 events dispatcher,
1085+
* eswitch, clock and others.
1086+
*/
10781087
int mlx5_eq_notifier_register(struct mlx5_core_dev *dev, struct mlx5_nb *nb);
10791088
int mlx5_eq_notifier_unregister(struct mlx5_core_dev *dev, struct mlx5_nb *nb);
10801089

1090+
/* Blocking event notifier used to forward SW events, used for slow path */
1091+
int mlx5_blocking_notifier_register(struct mlx5_core_dev *dev, struct notifier_block *nb);
1092+
int mlx5_blocking_notifier_unregister(struct mlx5_core_dev *dev, struct notifier_block *nb);
1093+
int mlx5_blocking_notifier_call_chain(struct mlx5_core_dev *dev, unsigned int event,
1094+
void *data);
1095+
10811096
int mlx5_core_query_vendor_id(struct mlx5_core_dev *mdev, u32 *vendor_id);
10821097

10831098
int mlx5_cmd_create_vport_lag(struct mlx5_core_dev *dev);

0 commit comments

Comments
 (0)