Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /* ar-skbuff.c: socket buffer destruction handling
0003  *
0004  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
0005  * Written by David Howells (dhowells@redhat.com)
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  * Note the allocation or reception of a socket buffer.
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  * Note the re-emergence of a socket buffer from a queue or buffer.
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  * Note the addition of a ref on a socket buffer.
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  * Note the dropping of a ref on a socket buffer by the core.
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  * Note the destruction of a socket buffer.
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  * Clear a queue of socket buffers.
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 }