Files

75 lines
1.8 KiB
C
Raw Permalink Normal View History

2024-04-10 12:05:01 -07:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Skb ref helpers.
*
*/
#ifndef _LINUX_SKBUFF_REF_H
#define _LINUX_SKBUFF_REF_H
#include <linux/skbuff.h>
/**
* __skb_frag_ref - take an addition reference on a paged fragment.
* @frag: the paged fragment
*
* Takes an additional reference on the paged fragment @frag.
2024-04-10 12:05:01 -07:00
*/
static __always_inline void __skb_frag_ref(skb_frag_t *frag)
2024-04-10 12:05:01 -07:00
{
2025-05-08 00:48:22 +00:00
get_netmem(skb_frag_netmem(frag));
2024-04-10 12:05:01 -07:00
}
/**
* skb_frag_ref - take an addition reference on a paged fragment of an skb.
* @skb: the buffer
* @f: the fragment offset.
*
* Takes an additional reference on the @f'th paged fragment of @skb.
*/
static __always_inline void skb_frag_ref(struct sk_buff *skb, int f)
2024-04-10 12:05:01 -07:00
{
__skb_frag_ref(&skb_shinfo(skb)->frags[f]);
2024-04-10 12:05:01 -07:00
}
2024-06-28 00:32:42 +00:00
bool napi_pp_put_page(netmem_ref netmem);
2024-04-10 12:05:01 -07:00
static __always_inline void skb_page_unref(netmem_ref netmem, bool recycle)
2024-04-10 12:05:01 -07:00
{
#ifdef CONFIG_PAGE_POOL
2024-09-10 17:14:51 +00:00
if (recycle && napi_pp_put_page(netmem))
2024-04-10 12:05:01 -07:00
return;
#endif
2025-05-08 00:48:22 +00:00
put_netmem(netmem);
2024-04-10 12:05:01 -07:00
}
/**
* __skb_frag_unref - release a reference on a paged fragment.
* @frag: the paged fragment
* @recycle: recycle the page if allocated via page_pool
*
* Releases a reference on the paged fragment @frag
* or recycles the page via the page_pool API.
*/
static __always_inline void __skb_frag_unref(skb_frag_t *frag, bool recycle)
2024-04-10 12:05:01 -07:00
{
2024-09-10 17:14:51 +00:00
skb_page_unref(skb_frag_netmem(frag), recycle);
2024-04-10 12:05:01 -07:00
}
/**
* skb_frag_unref - release a reference on a paged fragment of an skb.
* @skb: the buffer
* @f: the fragment offset
*
* Releases a reference on the @f'th paged fragment of @skb.
*/
static __always_inline void skb_frag_unref(struct sk_buff *skb, int f)
2024-04-10 12:05:01 -07:00
{
struct skb_shared_info *shinfo = skb_shinfo(skb);
if (!skb_zcopy_managed(skb))
__skb_frag_unref(&shinfo->frags[f], skb->pp_recycle);
}
#endif /* _LINUX_SKBUFF_REF_H */