[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20201001151148.18720-3-ioana.ciornei@nxp.com>
Date: Thu, 1 Oct 2020 18:11:46 +0300
From: Ioana Ciornei <ioana.ciornei@....com>
To: davem@...emloft.net, kuba@...nel.org, netdev@...r.kernel.org
Cc: jiri@...dia.com, idosch@...dia.com,
Ioana Ciornei <ioana.ciornei@....com>
Subject: [PATCH net-next v3 2/4] devlink: add .trap_group_action_set() callback
Add a new devlink callback, .trap_group_action_set(), which can be used
by device drivers which do not support controlling the action (drop,
trap) on each trap but rather on the entire group trap.
If this new callback is populated, it will take precedence over the
.trap_action_set() callback when the user requests a change of all the
traps in a group.
Signed-off-by: Ioana Ciornei <ioana.ciornei@....com>
---
Changes in v2:
- none
Changes in v3:
- reworded the trap_group_action_set() description
include/net/devlink.h | 10 ++++++++++
net/core/devlink.c | 18 ++++++++++++++++++
2 files changed, 28 insertions(+)
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 20db4a070fc8..6b00a624f2dc 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -1226,6 +1226,16 @@ struct devlink_ops {
const struct devlink_trap_group *group,
const struct devlink_trap_policer *policer,
struct netlink_ext_ack *extack);
+ /**
+ * @trap_group_action_set: Trap group action set function.
+ *
+ * If this callback is populated, it will take precedence over looping
+ * over all traps in a group and calling .trap_action_set().
+ */
+ int (*trap_group_action_set)(struct devlink *devlink,
+ const struct devlink_trap_group *group,
+ enum devlink_trap_action action,
+ struct netlink_ext_ack *extack);
/**
* @trap_policer_init: Trap policer initialization function.
*
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 10fea5854bc2..18136ad413e6 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -6720,6 +6720,24 @@ __devlink_trap_group_action_set(struct devlink *devlink,
struct devlink_trap_item *trap_item;
int err;
+ if (devlink->ops->trap_group_action_set) {
+ err = devlink->ops->trap_group_action_set(devlink, group_item->group,
+ trap_action, extack);
+ if (err)
+ return err;
+
+ list_for_each_entry(trap_item, &devlink->trap_list, list) {
+ if (strcmp(trap_item->group_item->group->name, group_name))
+ continue;
+ if (trap_item->action != trap_action &&
+ trap_item->trap->type != DEVLINK_TRAP_TYPE_DROP)
+ continue;
+ trap_item->action = trap_action;
+ }
+
+ return 0;
+ }
+
list_for_each_entry(trap_item, &devlink->trap_list, list) {
if (strcmp(trap_item->group_item->group->name, group_name))
continue;
--
2.28.0
Powered by blists - more mailing lists