Skip to content

Commit 5b88823

Browse files
idoschdavem330
authored andcommitted
devlink: Add a tracepoint for trap reports
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 <[email protected]> Reviewed-by: Jiri Pirko <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 8333c1c commit 5b88823

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

include/net/devlink.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,20 @@ struct devlink_health_reporter_ops {
624624
struct netlink_ext_ack *extack);
625625
};
626626

627+
/**
628+
* struct devlink_trap_metadata - Packet trap metadata.
629+
* @trap_name: Trap name.
630+
* @trap_group_name: Trap group name.
631+
* @input_dev: Input netdevice.
632+
* @fa_cookie: Flow action user cookie.
633+
*/
634+
struct devlink_trap_metadata {
635+
const char *trap_name;
636+
const char *trap_group_name;
637+
struct net_device *input_dev;
638+
const struct flow_action_cookie *fa_cookie;
639+
};
640+
627641
/**
628642
* struct devlink_trap_policer - Immutable packet trap policer attributes.
629643
* @id: Policer identifier.

include/trace/events/devlink.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,43 @@ TRACE_EVENT(devlink_health_reporter_state_update,
171171
__entry->new_state)
172172
);
173173

174+
/*
175+
* Tracepoint for devlink packet trap:
176+
*/
177+
TRACE_EVENT(devlink_trap_report,
178+
TP_PROTO(const struct devlink *devlink, struct sk_buff *skb,
179+
const struct devlink_trap_metadata *metadata),
180+
181+
TP_ARGS(devlink, skb, metadata),
182+
183+
TP_STRUCT__entry(
184+
__string(bus_name, devlink->dev->bus->name)
185+
__string(dev_name, dev_name(devlink->dev))
186+
__string(driver_name, devlink->dev->driver->name)
187+
__string(trap_name, metadata->trap_name)
188+
__string(trap_group_name, metadata->trap_group_name)
189+
__dynamic_array(char, input_dev_name, IFNAMSIZ)
190+
),
191+
192+
TP_fast_assign(
193+
struct net_device *input_dev = metadata->input_dev;
194+
195+
__assign_str(bus_name, devlink->dev->bus->name);
196+
__assign_str(dev_name, dev_name(devlink->dev));
197+
__assign_str(driver_name, devlink->dev->driver->name);
198+
__assign_str(trap_name, metadata->trap_name);
199+
__assign_str(trap_group_name, metadata->trap_group_name);
200+
__assign_str(input_dev_name,
201+
(input_dev ? input_dev->name : "NULL"));
202+
),
203+
204+
TP_printk("bus_name=%s dev_name=%s driver_name=%s trap_name=%s "
205+
"trap_group_name=%s input_dev_name=%s", __get_str(bus_name),
206+
__get_str(dev_name), __get_str(driver_name),
207+
__get_str(trap_name), __get_str(trap_group_name),
208+
__get_str(input_dev_name))
209+
);
210+
174211
#endif /* _TRACE_DEVLINK_H */
175212

176213
/* This part must be outside protection */

net/core/devlink.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ EXPORT_SYMBOL(devlink_dpipe_header_ipv6);
8484

8585
EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_hwmsg);
8686
EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_hwerr);
87+
EXPORT_TRACEPOINT_SYMBOL_GPL(devlink_trap_report);
8788

8889
static const struct nla_policy devlink_function_nl_policy[DEVLINK_PORT_FUNCTION_ATTR_MAX + 1] = {
8990
[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,
92789279
spin_unlock(&in_devlink_port->type_lock);
92799280
}
92809281

9282+
static void
9283+
devlink_trap_report_metadata_set(struct devlink_trap_metadata *metadata,
9284+
const struct devlink_trap_item *trap_item,
9285+
struct devlink_port *in_devlink_port,
9286+
const struct flow_action_cookie *fa_cookie)
9287+
{
9288+
metadata->trap_name = trap_item->trap->name;
9289+
metadata->trap_group_name = trap_item->group_item->group->name;
9290+
metadata->fa_cookie = fa_cookie;
9291+
9292+
spin_lock(&in_devlink_port->type_lock);
9293+
if (in_devlink_port->type == DEVLINK_PORT_TYPE_ETH)
9294+
metadata->input_dev = in_devlink_port->type_dev;
9295+
spin_unlock(&in_devlink_port->type_lock);
9296+
}
9297+
92819298
/**
92829299
* devlink_trap_report - Report trapped packet to drop monitor.
92839300
* @devlink: devlink.
@@ -9307,6 +9324,14 @@ void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb,
93079324
devlink_trap_report_metadata_fill(&hw_metadata, trap_item,
93089325
in_devlink_port, fa_cookie);
93099326
net_dm_hw_report(skb, &hw_metadata);
9327+
9328+
if (trace_devlink_trap_report_enabled()) {
9329+
struct devlink_trap_metadata metadata = {};
9330+
9331+
devlink_trap_report_metadata_set(&metadata, trap_item,
9332+
in_devlink_port, fa_cookie);
9333+
trace_devlink_trap_report(devlink, skb, &metadata);
9334+
}
93109335
}
93119336
EXPORT_SYMBOL_GPL(devlink_trap_report);
93129337

0 commit comments

Comments
 (0)