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

Commit ead2ceb0 authored by Neil Horman's avatar Neil Horman Committed by David S. Miller
Browse files

Network Drop Monitor: Adding kfree_skb_clean for non-drops and modifying...


Network Drop Monitor: Adding kfree_skb_clean for non-drops and modifying end-of-line points for skbs

Signed-off-by: default avatarNeil Horman <nhorman@tuxdriver.com>

 include/linux/skbuff.h |    4 +++-
 net/core/datagram.c    |    2 +-
 net/core/skbuff.c      |   22 ++++++++++++++++++++++
 net/ipv4/arp.c         |    2 +-
 net/ipv4/udp.c         |    2 +-
 net/packet/af_packet.c |    2 +-
 6 files changed, 29 insertions(+), 5 deletions(-)
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 4893d39e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -421,6 +421,7 @@ extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb,
#endif

extern void kfree_skb(struct sk_buff *skb);
extern void consume_skb(struct sk_buff *skb);
extern void	       __kfree_skb(struct sk_buff *skb);
extern struct sk_buff *__alloc_skb(unsigned int size,
				   gfp_t priority, int fclone, int node);
@@ -459,7 +460,8 @@ extern int skb_to_sgvec(struct sk_buff *skb,
extern int	       skb_cow_data(struct sk_buff *skb, int tailbits,
				    struct sk_buff **trailer);
extern int	       skb_pad(struct sk_buff *skb, int pad);
#define dev_kfree_skb(a)	kfree_skb(a)
#define dev_kfree_skb(a)	consume_skb(a)
#define dev_consume_skb(a)	kfree_skb_clean(a)
extern void	      skb_over_panic(struct sk_buff *skb, int len,
				     void *here);
extern void	      skb_under_panic(struct sk_buff *skb, int len,
+1 −1
Original line number Diff line number Diff line
@@ -208,7 +208,7 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,

void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
{
	kfree_skb(skb);
	consume_skb(skb);
	sk_mem_reclaim_partial(sk);
}

+22 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@

#include <asm/uaccess.h>
#include <asm/system.h>
#include <trace/skb.h>

#include "kmap_skb.h"

@@ -442,10 +443,31 @@ void kfree_skb(struct sk_buff *skb)
		smp_rmb();
	else if (likely(!atomic_dec_and_test(&skb->users)))
		return;
	trace_kfree_skb(skb, __builtin_return_address(0));
	__kfree_skb(skb);
}
EXPORT_SYMBOL(kfree_skb);

/**
 *	consume_skb - free an skbuff
 *	@skb: buffer to free
 *
 *	Drop a ref to the buffer and free it if the usage count has hit zero
 *	Functions identically to kfree_skb, but kfree_skb assumes that the frame
 *	is being dropped after a failure and notes that
 */
void consume_skb(struct sk_buff *skb)
{
	if (unlikely(!skb))
		return;
	if (likely(atomic_read(&skb->users) == 1))
		smp_rmb();
	else if (likely(!atomic_dec_and_test(&skb->users)))
		return;
	__kfree_skb(skb);
}
EXPORT_SYMBOL(consume_skb);

/**
 *	skb_recycle_check - check if skb can be reused for receive
 *	@skb: buffer
+1 −1
Original line number Diff line number Diff line
@@ -892,7 +892,7 @@ static int arp_process(struct sk_buff *skb)
out:
	if (in_dev)
		in_dev_put(in_dev);
	kfree_skb(skb);
	consume_skb(skb);
	return 0;
}

+1 −1
Original line number Diff line number Diff line
@@ -1184,7 +1184,7 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
			sk = sknext;
		} while (sknext);
	} else
		kfree_skb(skb);
		consume_skb(skb);
	spin_unlock(&hslot->lock);
	return 0;
}
Loading