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 <idosch@mellanox.com> Reviewed-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8333c1c4ee
commit
5b88823bfe
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue