]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - net/rxrpc/skbuff.c
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152
[mirror_ubuntu-focal-kernel.git] / net / rxrpc / skbuff.c
CommitLineData
2874c5fd 1// SPDX-License-Identifier: GPL-2.0-or-later
17926a79
DH
2/* ar-skbuff.c: socket buffer destruction handling
3 *
4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
17926a79
DH
6 */
7
9b6d5398
JP
8#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9
17926a79
DH
10#include <linux/module.h>
11#include <linux/net.h>
12#include <linux/skbuff.h>
13#include <net/sock.h>
14#include <net/af_rxrpc.h>
15#include "ar-internal.h"
16
71f3ca40
DH
17#define select_skb_count(op) (op >= rxrpc_skb_tx_cleaned ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs)
18
df844fd4 19/*
71f3ca40 20 * Note the allocation or reception of a socket buffer.
df844fd4 21 */
71f3ca40 22void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
df844fd4
DH
23{
24 const void *here = __builtin_return_address(0);
71f3ca40 25 int n = atomic_inc_return(select_skb_count(op));
63354797 26 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
df844fd4
DH
27}
28
29/*
30 * Note the re-emergence of a socket buffer from a queue or buffer.
31 */
71f3ca40 32void rxrpc_see_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
df844fd4
DH
33{
34 const void *here = __builtin_return_address(0);
35 if (skb) {
71f3ca40 36 int n = atomic_read(select_skb_count(op));
63354797 37 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
df844fd4
DH
38 }
39}
40
41/*
42 * Note the addition of a ref on a socket buffer.
43 */
71f3ca40 44void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
df844fd4
DH
45{
46 const void *here = __builtin_return_address(0);
71f3ca40 47 int n = atomic_inc_return(select_skb_count(op));
63354797 48 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
df844fd4
DH
49 skb_get(skb);
50}
51
52/*
53 * Note the destruction of a socket buffer.
54 */
71f3ca40 55void rxrpc_free_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
df844fd4
DH
56{
57 const void *here = __builtin_return_address(0);
58 if (skb) {
59 int n;
60 CHECK_SLAB_OKAY(&skb->users);
71f3ca40 61 n = atomic_dec_return(select_skb_count(op));
63354797 62 trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
df844fd4
DH
63 kfree_skb(skb);
64 }
65}
66
67/*
68 * Clear a queue of socket buffers.
69 */
70void rxrpc_purge_queue(struct sk_buff_head *list)
71{
72 const void *here = __builtin_return_address(0);
73 struct sk_buff *skb;
74 while ((skb = skb_dequeue((list))) != NULL) {
71f3ca40
DH
75 int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged));
76 trace_rxrpc_skb(skb, rxrpc_skb_rx_purged,
63354797 77 refcount_read(&skb->users), n, here);
df844fd4
DH
78 kfree_skb(skb);
79 }
80}