Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 255992b5 authored by Mike Pattrick's avatar Mike Pattrick Committed by Greg Kroah-Hartman
Browse files

openvswitch: Fix double reporting of drops in dropwatch



[ Upstream commit 1100248a5c5ccd57059eb8d02ec077e839a23826 ]

Frames sent to userspace can be reported as dropped in
ovs_dp_process_packet, however, if they are dropped in the netlink code
then netlink_attachskb will report the same frame as dropped.

This patch checks for error codes which indicate that the frame has
already been freed.

Signed-off-by: default avatarMike Pattrick <mkp@redhat.com>
Link: https://bugzilla.redhat.com/show_bug.cgi?id=2109946


Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 1c12d47a
Loading
Loading
Loading
Loading
+10 −3
Original line number Original line Diff line number Diff line
@@ -249,10 +249,17 @@ void ovs_dp_process_packet(struct sk_buff *skb, struct sw_flow_key *key)
		upcall.portid = ovs_vport_find_upcall_portid(p, skb);
		upcall.portid = ovs_vport_find_upcall_portid(p, skb);
		upcall.mru = OVS_CB(skb)->mru;
		upcall.mru = OVS_CB(skb)->mru;
		error = ovs_dp_upcall(dp, skb, key, &upcall, 0);
		error = ovs_dp_upcall(dp, skb, key, &upcall, 0);
		if (unlikely(error))
		switch (error) {
			kfree_skb(skb);
		case 0:
		else
		case -EAGAIN:
		case -ERESTARTSYS:
		case -EINTR:
			consume_skb(skb);
			consume_skb(skb);
			break;
		default:
			kfree_skb(skb);
			break;
		}
		stats_counter = &stats->n_missed;
		stats_counter = &stats->n_missed;
		goto out;
		goto out;
	}
	}