hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/rxrpc/skbuff.c
....@@ -1,12 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /* ar-skbuff.c: socket buffer destruction handling
23 *
34 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
45 * Written by David Howells (dhowells@redhat.com)
5
- *
6
- * This program is free software; you can redistribute it and/or
7
- * modify it under the terms of the GNU General Public License
8
- * as published by the Free Software Foundation; either version
9
- * 2 of the License, or (at your option) any later version.
106 */
117
128 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
....@@ -18,7 +14,8 @@
1814 #include <net/af_rxrpc.h>
1915 #include "ar-internal.h"
2016
21
-#define select_skb_count(op) (op >= rxrpc_skb_tx_cleaned ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs)
17
+#define is_tx_skb(skb) (rxrpc_skb(skb)->rx_flags & RXRPC_SKB_TX_BUFFER)
18
+#define select_skb_count(skb) (is_tx_skb(skb) ? &rxrpc_n_tx_skbs : &rxrpc_n_rx_skbs)
2219
2320 /*
2421 * Note the allocation or reception of a socket buffer.
....@@ -26,8 +23,9 @@
2623 void rxrpc_new_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
2724 {
2825 const void *here = __builtin_return_address(0);
29
- int n = atomic_inc_return(select_skb_count(op));
30
- trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
26
+ int n = atomic_inc_return(select_skb_count(skb));
27
+ trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
28
+ rxrpc_skb(skb)->rx_flags, here);
3129 }
3230
3331 /*
....@@ -37,8 +35,9 @@
3735 {
3836 const void *here = __builtin_return_address(0);
3937 if (skb) {
40
- int n = atomic_read(select_skb_count(op));
41
- trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
38
+ int n = atomic_read(select_skb_count(skb));
39
+ trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
40
+ rxrpc_skb(skb)->rx_flags, here);
4241 }
4342 }
4443
....@@ -48,9 +47,20 @@
4847 void rxrpc_get_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
4948 {
5049 const void *here = __builtin_return_address(0);
51
- int n = atomic_inc_return(select_skb_count(op));
52
- trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
50
+ int n = atomic_inc_return(select_skb_count(skb));
51
+ trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
52
+ rxrpc_skb(skb)->rx_flags, here);
5353 skb_get(skb);
54
+}
55
+
56
+/*
57
+ * Note the dropping of a ref on a socket buffer by the core.
58
+ */
59
+void rxrpc_eaten_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
60
+{
61
+ const void *here = __builtin_return_address(0);
62
+ int n = atomic_inc_return(&rxrpc_n_rx_skbs);
63
+ trace_rxrpc_skb(skb, op, 0, n, 0, here);
5464 }
5565
5666 /*
....@@ -61,24 +71,9 @@
6171 const void *here = __builtin_return_address(0);
6272 if (skb) {
6373 int n;
64
- CHECK_SLAB_OKAY(&skb->users);
65
- n = atomic_dec_return(select_skb_count(op));
66
- trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
67
- kfree_skb(skb);
68
- }
69
-}
70
-
71
-/*
72
- * Note the injected loss of a socket buffer.
73
- */
74
-void rxrpc_lose_skb(struct sk_buff *skb, enum rxrpc_skb_trace op)
75
-{
76
- const void *here = __builtin_return_address(0);
77
- if (skb) {
78
- int n;
79
- CHECK_SLAB_OKAY(&skb->users);
80
- n = atomic_dec_return(select_skb_count(op));
81
- trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n, here);
74
+ n = atomic_dec_return(select_skb_count(skb));
75
+ trace_rxrpc_skb(skb, op, refcount_read(&skb->users), n,
76
+ rxrpc_skb(skb)->rx_flags, here);
8277 kfree_skb(skb);
8378 }
8479 }
....@@ -91,9 +86,10 @@
9186 const void *here = __builtin_return_address(0);
9287 struct sk_buff *skb;
9388 while ((skb = skb_dequeue((list))) != NULL) {
94
- int n = atomic_dec_return(select_skb_count(rxrpc_skb_rx_purged));
95
- trace_rxrpc_skb(skb, rxrpc_skb_rx_purged,
96
- refcount_read(&skb->users), n, here);
89
+ int n = atomic_dec_return(select_skb_count(skb));
90
+ trace_rxrpc_skb(skb, rxrpc_skb_purged,
91
+ refcount_read(&skb->users), n,
92
+ rxrpc_skb(skb)->rx_flags, here);
9793 kfree_skb(skb);
9894 }
9995 }