Commit | Line | Data |
---|---|---|
f6d827b1 MA |
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 | * | |
173e7622 | 16 | * Takes an additional reference on the paged fragment @frag. |
f6d827b1 | 17 | */ |
173e7622 | 18 | static inline void __skb_frag_ref(skb_frag_t *frag) |
f6d827b1 | 19 | { |
173e7622 | 20 | get_page(skb_frag_page(frag)); |
f6d827b1 MA |
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 | { | |
173e7622 | 32 | __skb_frag_ref(&skb_shinfo(skb)->frags[f]); |
f6d827b1 MA |
33 | } |
34 | ||
35 | bool napi_pp_put_page(struct page *page); | |
36 | ||
37 | static inline void | |
38 | skb_page_unref(struct page *page, bool recycle) | |
39 | { | |
40 | #ifdef CONFIG_PAGE_POOL | |
41 | if (recycle && napi_pp_put_page(page)) | |
42 | return; | |
43 | #endif | |
44 | put_page(page); | |
45 | } | |
46 | ||
47 | /** | |
48 | * __skb_frag_unref - release a reference on a paged fragment. | |
49 | * @frag: the paged fragment | |
50 | * @recycle: recycle the page if allocated via page_pool | |
51 | * | |
52 | * Releases a reference on the paged fragment @frag | |
53 | * or recycles the page via the page_pool API. | |
54 | */ | |
55 | static inline void __skb_frag_unref(skb_frag_t *frag, bool recycle) | |
56 | { | |
57 | skb_page_unref(skb_frag_page(frag), recycle); | |
58 | } | |
59 | ||
60 | /** | |
61 | * skb_frag_unref - release a reference on a paged fragment of an skb. | |
62 | * @skb: the buffer | |
63 | * @f: the fragment offset | |
64 | * | |
65 | * Releases a reference on the @f'th paged fragment of @skb. | |
66 | */ | |
67 | static inline void skb_frag_unref(struct sk_buff *skb, int f) | |
68 | { | |
69 | struct skb_shared_info *shinfo = skb_shinfo(skb); | |
70 | ||
71 | if (!skb_zcopy_managed(skb)) | |
72 | __skb_frag_unref(&shinfo->frags[f], skb->pp_recycle); | |
73 | } | |
74 | ||
75 | #endif /* _LINUX_SKBUFF_REF_H */ |