Commit 93e15596 authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller
Browse files

drop_monitor: Filter control packets in drop monitor



Previously, devlink called into drop monitor in order to report hardware
originated drops / exceptions. devlink intentionally filtered control
packets and did not pass them to drop monitor as they were not dropped
by the underlying hardware.

Now drop monitor registers its probe on a generic 'devlink_trap_report'
tracepoint and should therefore perform this filtering itself instead of
having devlink do that.

Add the trap type as metadata and have drop monitor ignore control
packets.

Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Reviewed-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a848c05f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -630,12 +630,14 @@ struct devlink_health_reporter_ops {
 * @trap_group_name: Trap group name.
 * @input_dev: Input netdevice.
 * @fa_cookie: Flow action user cookie.
 * @trap_type: Trap type.
 */
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;
	enum devlink_trap_type trap_type;
};

/**
+1 −7
Original line number Diff line number Diff line
@@ -9269,6 +9269,7 @@ devlink_trap_report_metadata_set(struct devlink_trap_metadata *metadata,
	metadata->trap_name = trap_item->trap->name;
	metadata->trap_group_name = trap_item->group_item->group->name;
	metadata->fa_cookie = fa_cookie;
	metadata->trap_type = trap_item->trap->type;

	spin_lock(&in_devlink_port->type_lock);
	if (in_devlink_port->type == DEVLINK_PORT_TYPE_ETH)
@@ -9294,13 +9295,6 @@ void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb,
	devlink_trap_stats_update(trap_item->stats, skb->len);
	devlink_trap_stats_update(trap_item->group_item->stats, skb->len);

	/* Control packets were not dropped by the device or encountered an
	 * exception during forwarding and therefore should not be reported to
	 * the kernel's drop monitor.
	 */
	if (trap_item->trap->type == DEVLINK_TRAP_TYPE_CONTROL)
		return;

	if (trace_devlink_trap_report_enabled()) {
		struct devlink_trap_metadata metadata = {};

+6 −0
Original line number Diff line number Diff line
@@ -444,6 +444,9 @@ net_dm_hw_trap_summary_probe(void *ignore, const struct devlink *devlink,
	unsigned long flags;
	int i;

	if (metadata->trap_type == DEVLINK_TRAP_TYPE_CONTROL)
		return;

	hw_data = this_cpu_ptr(&dm_hw_cpu_data);
	spin_lock_irqsave(&hw_data->lock, flags);
	hw_entries = hw_data->hw_entries;
@@ -937,6 +940,9 @@ net_dm_hw_trap_packet_probe(void *ignore, const struct devlink *devlink,
	struct sk_buff *nskb;
	unsigned long flags;

	if (metadata->trap_type == DEVLINK_TRAP_TYPE_CONTROL)
		return;

	if (!skb_mac_header_was_set(skb))
		return;