From: Ido Schimmel <ido...@mellanox.com>

Add a tracepoint for trap reports so that drop monitor could register
its probe on it. Use trace_devlink_trap_report_enabled() to avoid
wasting cycles setting the trap metadata if the tracepoint is not
enabled.

Signed-off-by: Ido Schimmel <ido...@mellanox.com>
Reviewed-by: Jiri Pirko <j...@mellanox.com>
---
 include/net/devlink.h          | 14 +++++++++++++
 include/trace/events/devlink.h | 37 ++++++++++++++++++++++++++++++++++
 net/core/devlink.c             | 25 +++++++++++++++++++++++
 3 files changed, 76 insertions(+)

diff --git a/include/net/devlink.h b/include/net/devlink.h
index 7339bf9ba6b4..1014294ba6a0 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -624,6 +624,20 @@ struct devlink_health_reporter_ops {
                    struct netlink_ext_ack *extack);
 };
 
+/**
+ * struct devlink_trap_metadata - Packet trap metadata.
+ * @trap_name: Trap name.
+ * @trap_group_name: Trap group name.
+ * @input_dev: Input netdevice.
+ * @fa_cookie: Flow action user cookie.
+ */
+struct devlink_trap_metadata {
+       const char *trap_name;
+       const char *trap_group_name;
+       struct net_device *input_dev;
+       const struct flow_action_cookie *fa_cookie;
+};
+
 /**
  * struct devlink_trap_policer - Immutable packet trap policer attributes.
  * @id: Policer identifier.
diff --git a/include/trace/events/devlink.h b/include/trace/events/devlink.h
index 6f60a78d9a7e..44d8e2981065 100644
--- a/include/trace/events/devlink.h
+++ b/include/trace/events/devlink.h
@@ -171,6 +171,43 @@ TRACE_EVENT(devlink_health_reporter_state_update,
                  __entry->new_state)
 );
 
+/*
+ * Tracepoint for devlink packet trap:
+ */
+TRACE_EVENT(devlink_trap_report,
+       TP_PROTO(const struct devlink *devlink, struct sk_buff *skb,
+                const struct devlink_trap_metadata *metadata),
+
+       TP_ARGS(devlink, skb, metadata),
+
+       TP_STRUCT__entry(
+               __string(bus_name, devlink->dev->bus->name)
+               __string(dev_name, dev_name(devlink->dev))
+               __string(driver_name, devlink->dev->driver->name)
+               __string(trap_name, metadata->trap_name)
+               __string(trap_group_name, metadata->trap_group_name)
+               __dynamic_array(char, input_dev_name, IFNAMSIZ)
+       ),
+
+       TP_fast_assign(
+               struct net_device *input_dev = metadata->input_dev;
+
+               __assign_str(bus_name, devlink->dev->bus->name);
+               __assign_str(dev_name, dev_name(devlink->dev));
+               __assign_str(driver_name, devlink->dev->driver->name);
+               __assign_str(trap_name, metadata->trap_name);
+               __assign_str(trap_group_name, metadata->trap_group_name);
+               __assign_str(input_dev_name,
+                            (input_dev ? input_dev->name : "NULL"));
+       ),
+
+       TP_printk("bus_name=%s dev_name=%s driver_name=%s trap_name=%s "
+                 "trap_group_name=%s input_dev_name=%s", __get_str(bus_name),
+                 __get_str(dev_name), __get_str(driver_name),
+                 __get_str(trap_name), __get_str(trap_group_name),
+                 __get_str(input_dev_name))
+);
+
 #endif /* _TRACE_DEVLINK_H */
 
 /* This part must be outside protection */
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 7a38f9e25922..c0f300507c37 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -84,6 +84,7 @@ EXPORT_SYMBOL(devlink_dpipe_header_ipv6);
 
 EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_hwmsg);
 EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_hwerr);
+EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_trap_report);
 
 static const struct nla_policy 
devlink_function_nl_policy[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1] = {
        [DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR] = { .type = NLA_BINARY },
@@ -9278,6 +9279,22 @@ devlink_trap_report_metadata_fill(struct 
net_dm_hw_metadata *hw_metadata,
        spin_unlock(&in_devlink_port->type_lock);
 }
 
+static void
+devlink_trap_report_metadata_set(struct devlink_trap_metadata *metadata,
+                                const struct devlink_trap_item *trap_item,
+                                struct devlink_port *in_devlink_port,
+                                const struct flow_action_cookie *fa_cookie)
+{
+       metadata->trap_name = trap_item->trap->name;
+       metadata->trap_group_name = trap_item->group_item->group->name;
+       metadata->fa_cookie = fa_cookie;
+
+       spin_lock(&in_devlink_port->type_lock);
+       if (in_devlink_port->type == DEVLINK_PORT_TYPE_ETH)
+               metadata->input_dev = in_devlink_port->type_dev;
+       spin_unlock(&in_devlink_port->type_lock);
+}
+
 /**
  * devlink_trap_report - Report trapped packet to drop monitor.
  * @devlink: devlink.
@@ -9307,6 +9324,14 @@ void devlink_trap_report(struct devlink *devlink, struct 
sk_buff *skb,
        devlink_trap_report_metadata_fill(&hw_metadata, trap_item,
                                          in_devlink_port, fa_cookie);
        net_dm_hw_report(skb, &hw_metadata);
+
+       if (trace_devlink_trap_report_enabled()) {
+               struct devlink_trap_metadata metadata = {};
+
+               devlink_trap_report_metadata_set(&metadata, trap_item,
+                                                in_devlink_port, fa_cookie);
+               trace_devlink_trap_report(devlink, skb, &metadata);
+       }
 }
 EXPORT_SYMBOL_GPL(devlink_trap_report);
 
-- 
2.26.2

Reply via email to