Skip to content

Commit ead2ceb

Browse files
nhormandavem330
authored andcommitted
Network Drop Monitor: Adding kfree_skb_clean for non-drops and modifying end-of-line points for skbs
Signed-off-by: Neil Horman <[email protected]> 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: David S. Miller <[email protected]>
1 parent 4893d39 commit ead2ceb

File tree

6 files changed

+29
-5
lines changed

6 files changed

+29
-5
lines changed

include/linux/skbuff.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ extern void skb_dma_unmap(struct device *dev, struct sk_buff *skb,
421421
#endif
422422

423423
extern void kfree_skb(struct sk_buff *skb);
424+
extern void consume_skb(struct sk_buff *skb);
424425
extern void __kfree_skb(struct sk_buff *skb);
425426
extern struct sk_buff *__alloc_skb(unsigned int size,
426427
gfp_t priority, int fclone, int node);
@@ -459,7 +460,8 @@ extern int skb_to_sgvec(struct sk_buff *skb,
459460
extern int skb_cow_data(struct sk_buff *skb, int tailbits,
460461
struct sk_buff **trailer);
461462
extern int skb_pad(struct sk_buff *skb, int pad);
462-
#define dev_kfree_skb(a) kfree_skb(a)
463+
#define dev_kfree_skb(a) consume_skb(a)
464+
#define dev_consume_skb(a) kfree_skb_clean(a)
463465
extern void skb_over_panic(struct sk_buff *skb, int len,
464466
void *here);
465467
extern void skb_under_panic(struct sk_buff *skb, int len,

net/core/datagram.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ struct sk_buff *skb_recv_datagram(struct sock *sk, unsigned flags,
208208

209209
void skb_free_datagram(struct sock *sk, struct sk_buff *skb)
210210
{
211-
kfree_skb(skb);
211+
consume_skb(skb);
212212
sk_mem_reclaim_partial(sk);
213213
}
214214

net/core/skbuff.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565

6666
#include <asm/uaccess.h>
6767
#include <asm/system.h>
68+
#include <trace/skb.h>
6869

6970
#include "kmap_skb.h"
7071

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

451+
/**
452+
* consume_skb - free an skbuff
453+
* @skb: buffer to free
454+
*
455+
* Drop a ref to the buffer and free it if the usage count has hit zero
456+
* Functions identically to kfree_skb, but kfree_skb assumes that the frame
457+
* is being dropped after a failure and notes that
458+
*/
459+
void consume_skb(struct sk_buff *skb)
460+
{
461+
if (unlikely(!skb))
462+
return;
463+
if (likely(atomic_read(&skb->users) == 1))
464+
smp_rmb();
465+
else if (likely(!atomic_dec_and_test(&skb->users)))
466+
return;
467+
__kfree_skb(skb);
468+
}
469+
EXPORT_SYMBOL(consume_skb);
470+
449471
/**
450472
* skb_recycle_check - check if skb can be reused for receive
451473
* @skb: buffer

net/ipv4/arp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -892,7 +892,7 @@ static int arp_process(struct sk_buff *skb)
892892
out:
893893
if (in_dev)
894894
in_dev_put(in_dev);
895-
kfree_skb(skb);
895+
consume_skb(skb);
896896
return 0;
897897
}
898898

net/ipv4/udp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1184,7 +1184,7 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
11841184
sk = sknext;
11851185
} while (sknext);
11861186
} else
1187-
kfree_skb(skb);
1187+
consume_skb(skb);
11881188
spin_unlock(&hslot->lock);
11891189
return 0;
11901190
}

net/packet/af_packet.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, struct packet
584584
skb->len = skb_len;
585585
}
586586
drop:
587-
kfree_skb(skb);
587+
consume_skb(skb);
588588
return 0;
589589
}
590590

0 commit comments

Comments
 (0)