1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* |
3 | * Skb ref helpers. |
4 | * |
5 | */ |
6 | |
7 | #ifndef _LINUX_SKBUFF_REF_H |
8 | #define _LINUX_SKBUFF_REF_H |
9 | |
10 | #include <linux/skbuff.h> |
11 | |
12 | /** |
13 | * __skb_frag_ref - take an addition reference on a paged fragment. |
14 | * @frag: the paged fragment |
15 | * |
16 | * Takes an additional reference on the paged fragment @frag. |
17 | */ |
18 | static inline void __skb_frag_ref(skb_frag_t *frag) |
19 | { |
20 | get_netmem(netmem: skb_frag_netmem(frag)); |
21 | } |
22 | |
23 | /** |
24 | * skb_frag_ref - take an addition reference on a paged fragment of an skb. |
25 | * @skb: the buffer |
26 | * @f: the fragment offset. |
27 | * |
28 | * Takes an additional reference on the @f'th paged fragment of @skb. |
29 | */ |
30 | static inline void skb_frag_ref(struct sk_buff *skb, int f) |
31 | { |
32 | __skb_frag_ref(frag: &skb_shinfo(skb)->frags[f]); |
33 | } |
34 | |
35 | bool napi_pp_put_page(netmem_ref netmem); |
36 | |
37 | static inline void skb_page_unref(netmem_ref netmem, bool recycle) |
38 | { |
39 | #ifdef CONFIG_PAGE_POOL |
40 | if (recycle && napi_pp_put_page(netmem)) |
41 | return; |
42 | #endif |
43 | put_netmem(netmem); |
44 | } |
45 | |
46 | /** |
47 | * __skb_frag_unref - release a reference on a paged fragment. |
48 | * @frag: the paged fragment |
49 | * @recycle: recycle the page if allocated via page_pool |
50 | * |
51 | * Releases a reference on the paged fragment @frag |
52 | * or recycles the page via the page_pool API. |
53 | */ |
54 | static inline void __skb_frag_unref(skb_frag_t *frag, bool recycle) |
55 | { |
56 | skb_page_unref(netmem: skb_frag_netmem(frag), recycle); |
57 | } |
58 | |
59 | /** |
60 | * skb_frag_unref - release a reference on a paged fragment of an skb. |
61 | * @skb: the buffer |
62 | * @f: the fragment offset |
63 | * |
64 | * Releases a reference on the @f'th paged fragment of @skb. |
65 | */ |
66 | static inline void skb_frag_unref(struct sk_buff *skb, int f) |
67 | { |
68 | struct skb_shared_info *shinfo = skb_shinfo(skb); |
69 | |
70 | if (!skb_zcopy_managed(skb)) |
71 | __skb_frag_unref(frag: &shinfo->frags[f], recycle: skb->pp_recycle); |
72 | } |
73 | |
74 | #endif /* _LINUX_SKBUFF_REF_H */ |
75 | |