0001
0002
0003
0004
0005
0006
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include <linux/module.h>
0011 #include <linux/net.h>
0012 #include <linux/skbuff.h>
0013 #include <net/sock.h>
0014 #include <net/af_rxrpc.h>
0015 #include "ar-internal.h"
0016
0017 #define is_tx_skb(skb) (rxrpc_skb(skb)->rx_flags & RXRPC_SKB_TX_BUFFER)
0018 #define select_skb_count(skb) (is_tx_skb(skb) ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs)
0019
0020
0021
0022
0023 void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
0024 {
0025 const void *here = __builtin_return_address(0);
0026 int n = atomic_inc_return(select_skb_count(skb));
0027 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
0028 rxrpc_skb(skb)->rx_flags, here);
0029 }
0030
0031
0032
0033
0034 void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
0035 {
0036 const void *here = __builtin_return_address(0);
0037 if (skb) {
0038 int n = atomic_read(select_skb_count(skb));
0039 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
0040 rxrpc_skb(skb)->rx_flags, here);
0041 }
0042 }
0043
0044
0045
0046
0047 void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
0048 {
0049 const void *here = __builtin_return_address(0);
0050 int n = atomic_inc_return(select_skb_count(skb));
0051 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
0052 rxrpc_skb(skb)->rx_flags, here);
0053 skb_get(skb);
0054 }
0055
0056
0057
0058
0059 void rxrpc_eaten_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
0060 {
0061 const void *here = __builtin_return_address(0);
0062 int n = atomic_inc_return(&rxrpc_n_rx_skbs);
0063 trace_rxrpc_skb(skb, op, 0, n, 0, here);
0064 }
0065
0066
0067
0068
0069 void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
0070 {
0071 const void *here = __builtin_return_address(0);
0072 if (skb) {
0073 int n;
0074 n = atomic_dec_return(select_skb_count(skb));
0075 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
0076 rxrpc_skb(skb)->rx_flags, here);
0077 kfree_skb(skb);
0078 }
0079 }
0080
0081
0082
0083
0084 void rxrpc_purge_queue(struct sk_buff_head *list)
0085 {
0086 const void *here = __builtin_return_address(0);
0087 struct sk_buff *skb;
0088 while ((skb = skb_dequeue((list))) != NULL) {
0089 int n = atomic_dec_return(select_skb_count(skb));
0090 trace_rxrpc_skb(skb, rxrpc_skb_purged,
0091 refcount_read(&skb->users), n,
0092 rxrpc_skb(skb)->rx_flags, here);
0093 kfree_skb(skb);
0094 }
0095 }