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   */
__skb_frag_ref(skb_frag_t * frag)18  static inline void __skb_frag_ref(skb_frag_t *frag)
19  {
20  	get_page(skb_frag_page(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   */
skb_frag_ref(struct sk_buff * skb,int f)30  static inline void skb_frag_ref(struct sk_buff *skb, int f)
31  {
32  	__skb_frag_ref(&skb_shinfo(skb)->frags[f]);
33  }
34  
35  bool napi_pp_put_page(netmem_ref netmem);
36  
skb_page_unref(netmem_ref netmem,bool recycle)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_page(netmem_to_page(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   */
__skb_frag_unref(skb_frag_t * frag,bool recycle)54  static inline void __skb_frag_unref(skb_frag_t *frag, bool recycle)
55  {
56  	skb_page_unref(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   */
skb_frag_unref(struct sk_buff * skb,int f)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(&shinfo->frags[f], skb->pp_recycle);
72  }
73  
74  #endif	/* _LINUX_SKBUFF_REF_H */
75