| /linux/include/net/ |
| H A D | netmem.h | 168 static inline bool netmem_is_net_iov(const netmem_ref netmem) in netmem_is_net_iov() argument 170 return (__force unsigned long)netmem & NET_IOV; in netmem_is_net_iov() 184 static inline struct page *__netmem_to_page(netmem_ref netmem) in __netmem_to_page() argument 186 return (__force struct page *)netmem; in __netmem_to_page() 189 static inline struct page *netmem_to_page(netmem_ref netmem) in netmem_to_page() argument 191 if (WARN_ON_ONCE(netmem_is_net_iov(netmem))) in netmem_to_page() 194 return __netmem_to_page(netmem); in netmem_to_page() 197 static inline struct net_iov *netmem_to_net_iov(netmem_ref netmem) in netmem_to_net_iov() argument 199 if (netmem_is_net_iov(netmem)) in netmem_to_net_iov() 200 return (struct net_iov *)((__force unsigned long)netmem & in netmem_to_net_iov() [all …]
|
| H A D | xdp.h | 205 void xdp_return_frag(netmem_ref netmem, const struct xdp_buff *xdp); 226 static inline bool __xdp_buff_add_frag(struct xdp_buff *xdp, netmem_ref netmem, in __xdp_buff_add_frag() argument 247 if (try_coalesce && netmem == skb_frag_netmem(prev) && in __xdp_buff_add_frag() 251 xdp_return_frag(netmem, xdp); in __xdp_buff_add_frag() 256 __skb_fill_netmem_desc_noacc(sinfo, nr_frags++, netmem, in __xdp_buff_add_frag() 280 static inline bool xdp_buff_add_frag(struct xdp_buff *xdp, netmem_ref netmem, in xdp_buff_add_frag() argument 283 if (!__xdp_buff_add_frag(xdp, netmem, offset, size, truesize, true)) in xdp_buff_add_frag() 286 if (unlikely(netmem_is_pfmemalloc(netmem))) in xdp_buff_add_frag() 288 if (unlikely(netmem_is_net_iov(netmem))) in xdp_buff_add_frag() 448 void __xdp_return(netmem_ref netmem, enum xdp_mem_type mem_type,
|
| /linux/net/core/ |
| H A D | page_pool.c | 376 static void page_pool_return_netmem(struct page_pool *pool, netmem_ref netmem); 381 netmem_ref netmem; in page_pool_refill_alloc_cache() local 402 netmem = (__force netmem_ref)__ptr_ring_consume(r); in page_pool_refill_alloc_cache() 403 if (unlikely(!netmem)) in page_pool_refill_alloc_cache() 406 if (likely(netmem_is_pref_nid(netmem, pref_nid))) { in page_pool_refill_alloc_cache() 407 pool->alloc.cache[pool->alloc.count++] = netmem; in page_pool_refill_alloc_cache() 414 page_pool_return_netmem(pool, netmem); in page_pool_refill_alloc_cache() 416 netmem = 0; in page_pool_refill_alloc_cache() 423 netmem = pool->alloc.cache[--pool->alloc.count]; in page_pool_refill_alloc_cache() 427 return netmem; in page_pool_refill_alloc_cache() [all …]
|
| H A D | netmem_priv.h | 6 static inline unsigned long netmem_get_pp_magic(netmem_ref netmem) in netmem_get_pp_magic() argument 8 return netmem_to_nmdesc(netmem)->pp_magic & ~PP_DMA_INDEX_MASK; in netmem_get_pp_magic() 11 static inline void netmem_or_pp_magic(netmem_ref netmem, unsigned long pp_magic) in netmem_or_pp_magic() argument 13 netmem_to_nmdesc(netmem)->pp_magic |= pp_magic; in netmem_or_pp_magic() 16 static inline void netmem_clear_pp_magic(netmem_ref netmem) in netmem_clear_pp_magic() argument 18 WARN_ON_ONCE(netmem_to_nmdesc(netmem)->pp_magic & PP_DMA_INDEX_MASK); in netmem_clear_pp_magic() 20 netmem_to_nmdesc(netmem)->pp_magic = 0; in netmem_clear_pp_magic() 23 static inline bool netmem_is_pp(netmem_ref netmem) in netmem_is_pp() argument 25 return (netmem_get_pp_magic(netmem) & PP_MAGIC_MASK) == PP_SIGNATURE; in netmem_is_pp() 28 static inline void netmem_set_pp(netmem_ref netmem, struct page_pool *pool) in netmem_set_pp() argument [all …]
|
| H A D | page_pool_priv.h | 19 page_pool_set_dma_addr_netmem(netmem_ref netmem, dma_addr_t addr) in page_pool_set_dma_addr_netmem() argument 22 netmem_set_dma_addr(netmem, addr >> PAGE_SHIFT); in page_pool_set_dma_addr_netmem() 27 return addr != (dma_addr_t)netmem_get_dma_addr(netmem) in page_pool_set_dma_addr_netmem() 31 netmem_set_dma_addr(netmem, addr); in page_pool_set_dma_addr_netmem() 41 void page_pool_set_pp_info(struct page_pool *pool, netmem_ref netmem); 42 void page_pool_clear_pp_info(netmem_ref netmem); 47 netmem_ref netmem) in page_pool_set_pp_info() argument 50 static inline void page_pool_clear_pp_info(netmem_ref netmem) in page_pool_clear_pp_info() argument
|
| H A D | devmem.c | 456 netmem_ref netmem; in mp_dmabuf_devmem_alloc_netmems() local 462 netmem = net_iov_to_netmem(niov); in mp_dmabuf_devmem_alloc_netmems() 464 page_pool_set_pp_info(pool, netmem); in mp_dmabuf_devmem_alloc_netmems() 467 trace_page_pool_state_hold(pool, netmem, pool->pages_state_hold_cnt); in mp_dmabuf_devmem_alloc_netmems() 468 return netmem; in mp_dmabuf_devmem_alloc_netmems() 478 bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem) in mp_dmabuf_devmem_release_page() argument 480 long refcount = atomic_long_read(netmem_get_pp_ref_count_ref(netmem)); in mp_dmabuf_devmem_release_page() 482 if (WARN_ON_ONCE(!netmem_is_net_iov(netmem))) in mp_dmabuf_devmem_release_page() 488 page_pool_clear_pp_info(netmem); in mp_dmabuf_devmem_release_page() 490 net_devmem_free_dmabuf(netmem_to_net_iov(netmem)); in mp_dmabuf_devmem_release_page()
|
| H A D | mp_dmabuf_devmem.h | 20 bool mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem); 38 mp_dmabuf_devmem_release_page(struct page_pool *pool, netmem_ref netmem) in mp_dmabuf_devmem_release_page() argument
|
| H A D | xdp.c | 433 void __xdp_return(netmem_ref netmem, enum xdp_mem_type mem_type, in __xdp_return() argument 438 netmem = netmem_compound_head(netmem); in __xdp_return() 444 page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, in __xdp_return() 448 page_frag_free(__netmem_address(netmem)); in __xdp_return() 451 put_page(__netmem_to_page(netmem)); in __xdp_return() 543 void xdp_return_frag(netmem_ref netmem, const struct xdp_buff *xdp) in xdp_return_frag() argument 545 __xdp_return(netmem, xdp->rxq->mem.type, true, NULL); in xdp_return_frag()
|
| /linux/Documentation/translations/zh_CN/networking/ |
| H A D | netmem.rst | 5 :Original: Documentation/networking/netmem.rst 15 本文档概述了网络驱动支持netmem(一种抽象内存类型)的要求,该内存类型 16 支持设备内存 TCP 等功能。通过支持netmem,驱动可以灵活适配不同底层内 21 * 灵活性:netmem 可由不同内存类型(如 struct page、DMA-buf)支持, 23 * 前瞻性:支持netmem的驱动可无缝适配未来依赖此功能的新特性。 24 * 简化开发:驱动通过统一API与netmem交互,无需关注底层内存的实现差异。 33 3. 驱动必须使用page_pool netmem API处理有效载荷内存。当前netmem API 34 与page API一一对应。转换时需要将page API替换为netmem API,并用驱动 41 目前并非所有页 pageAPI 都有对应的 netmem 等效接口。如果你的驱动程序 42 依赖某个尚未实现的 netmem API,请直接实现并提交至 netdev@邮件列表, [all …]
|
| /linux/include/trace/events/ |
| H A D | page_pool.h | 45 netmem_ref netmem, u32 release), 47 TP_ARGS(pool, netmem, release), 51 __field(unsigned long, netmem) 58 __entry->netmem = (__force unsigned long)netmem; 60 __entry->pfn = netmem_pfn_trace(netmem); 64 __entry->pool, (void *)__entry->netmem, 65 __entry->netmem & NET_IOV, __entry->pfn, __entry->release) 71 netmem_ref netmem, u32 hold), 73 TP_ARGS(pool, netmem, hold), 77 __field(unsigned long, netmem) [all …]
|
| /linux/include/net/page_pool/ |
| H A D | helpers.h | 123 netmem_ref netmem; in page_pool_alloc_netmem() local 131 netmem = page_pool_alloc_frag_netmem(pool, offset, *size, gfp); in page_pool_alloc_netmem() 132 if (unlikely(!netmem)) in page_pool_alloc_netmem() 144 return netmem; in page_pool_alloc_netmem() 237 static inline void page_pool_fragment_netmem(netmem_ref netmem, long nr) in page_pool_fragment_netmem() argument 239 atomic_long_set(netmem_get_pp_ref_count_ref(netmem), nr); in page_pool_fragment_netmem() 265 static inline long page_pool_unref_netmem(netmem_ref netmem, long nr) in page_pool_unref_netmem() argument 267 atomic_long_t *pp_ref_count = netmem_get_pp_ref_count_ref(netmem); in page_pool_unref_netmem() 315 static inline void page_pool_ref_netmem(netmem_ref netmem) in page_pool_ref_netmem() argument 317 atomic_long_inc(netmem_get_pp_ref_count_ref(netmem)); in page_pool_ref_netmem() [all …]
|
| H A D | memory_provider.h | 14 bool (*release_netmem)(struct page_pool *pool, netmem_ref netmem); 46 netmem_ref netmem) in net_mp_netmem_place_in_cache() argument 48 pool->alloc.cache[pool->alloc.count++] = netmem; in net_mp_netmem_place_in_cache()
|
| H A D | types.h | 94 void (*init_callback)(netmem_ref netmem, void *arg); 292 void page_pool_put_unrefed_netmem(struct page_pool *pool, netmem_ref netmem,
|
| /linux/Documentation/networking/ |
| H A D | netmem.rst | 7 This document outlines the requirements for network drivers to support netmem, 9 supporting netmem, drivers can work with various underlying memory types 17 * Future-proof: Drivers with netmem support are ready for upcoming 29 3. The driver must use the page_pool netmem APIs for payload memory. The netmem 30 APIs currently 1-to-1 correspond with page APIs. Conversion to netmem should 31 be achievable by switching the page APIs to netmem APIs and tracking memory 38 Not all page APIs have netmem equivalents at the moment. If your driver 39 relies on a missing netmem API, feel free to add and propose to netdev@, or 41 the netmem API. 45 - PP_FLAG_DMA_MAP: netmem is not dma-mappable by the driver. The driver [all …]
|
| /linux/include/net/libeth/ |
| H A D | rx.h | 45 netmem_ref netmem; member 109 buf->netmem = page_pool_dev_alloc_netmem(fq->pp, &buf->offset, in libeth_rx_alloc() 111 if (unlikely(!buf->netmem)) in libeth_rx_alloc() 114 return page_pool_get_dma_addr_netmem(buf->netmem) + buf->offset + in libeth_rx_alloc() 118 void libeth_rx_recycle_slow(netmem_ref netmem); 134 netmem_ref netmem = fqe->netmem; in libeth_rx_sync_for_cpu() local 141 libeth_rx_recycle_slow(netmem); in libeth_rx_sync_for_cpu() 145 page_pool_dma_sync_netmem_for_cpu(netmem_get_pp(netmem), netmem, in libeth_rx_sync_for_cpu()
|
| H A D | xdp.h | 721 netmem_ref netmem; in libeth_xdp_tx_fill_buf() local 732 netmem = skb_frag_netmem(frag); in libeth_xdp_tx_fill_buf() 734 .addr = page_pool_get_dma_addr_netmem(netmem) + in libeth_xdp_tx_fill_buf() 740 dma_sync_single_for_device(__netmem_get_pp(netmem)->p.dev, desc.addr, in libeth_xdp_tx_fill_buf() 1225 netmem_ref netmem = virt_to_netmem(data); in libeth_xdp_return_va() local 1227 page_pool_put_full_netmem(__netmem_get_pp(netmem), netmem, napi); in libeth_xdp_return_va() 1234 netmem_ref netmem = skb_frag_netmem(&sinfo->frags[i]); in libeth_xdp_return_frags() local 1236 page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, napi); in libeth_xdp_return_frags() 1282 const struct page *page = __netmem_to_page(fqe->netmem); in libeth_xdp_prepare_buff()
|
| /linux/drivers/net/ethernet/google/gve/ |
| H A D | gve_buffer_mgmt_dqo.c | 214 netmem_ref netmem = buf_state->page_info.netmem; in gve_free_to_page_pool() local 216 if (!netmem) in gve_free_to_page_pool() 219 page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, allow_direct); in gve_free_to_page_pool() 220 buf_state->page_info.netmem = 0; in gve_free_to_page_pool() 226 netmem_ref netmem; in gve_alloc_from_page_pool() local 229 netmem = page_pool_alloc_netmem(rx->dqo.page_pool, in gve_alloc_from_page_pool() 234 if (!netmem) in gve_alloc_from_page_pool() 237 buf_state->page_info.netmem = netmem; in gve_alloc_from_page_pool() 238 buf_state->page_info.page_address = netmem_address(netmem); in gve_alloc_from_page_pool() 239 buf_state->addr = page_pool_get_dma_addr_netmem(netmem); in gve_alloc_from_page_pool() [all …]
|
| /linux/include/linux/ |
| H A D | skbuff_ref.h | 35 bool napi_pp_put_page(netmem_ref netmem); 37 static __always_inline void skb_page_unref(netmem_ref netmem, bool recycle) in skb_page_unref() argument 40 if (recycle && napi_pp_put_page(netmem)) in skb_page_unref() 43 put_netmem(netmem); in skb_page_unref()
|
| H A D | skbuff.h | 41 #include <net/netmem.h> 362 netmem_ref netmem; member 423 * @f_off: offset from start of f->netmem 2551 netmem_ref netmem, int off, in skb_frag_fill_netmem_desc() argument 2554 frag->netmem = netmem; in skb_frag_fill_netmem_desc() 2567 int i, netmem_ref netmem, in __skb_fill_netmem_desc_noacc() argument 2572 skb_frag_fill_netmem_desc(frag, netmem, off, size); in __skb_fill_netmem_desc_noacc() 2599 * @netmem: the netmem t 2609 __skb_fill_netmem_desc(struct sk_buff * skb,int i,netmem_ref netmem,int off,int size) __skb_fill_netmem_desc() argument 2638 skb_fill_netmem_desc(struct sk_buff * skb,int i,netmem_ref netmem,int off,int size) skb_fill_netmem_desc() argument 3954 skb_can_coalesce_netmem(struct sk_buff * skb,int i,netmem_ref netmem,int off) skb_can_coalesce_netmem() argument [all...] |
| /linux/drivers/net/ethernet/intel/libeth/ |
| H A D | xdp.c | 265 netmem_ref netmem = fqe->netmem; in libeth_xdp_buff_add_frag() local 267 if (!xdp_buff_add_frag(&xdp->base, netmem, in libeth_xdp_buff_add_frag() 268 fqe->offset + netmem_get_pp(netmem)->p.offset, in libeth_xdp_buff_add_frag() 275 libeth_rx_recycle_slow(netmem); in libeth_xdp_buff_add_frag() 315 static void libeth_xdp_put_netmem_bulk(netmem_ref netmem, in libeth_xdp_put_netmem_bulk() argument 321 bq->q[bq->count++] = netmem; in libeth_xdp_put_netmem_bulk()
|
| H A D | rx.c | 222 void __cold libeth_rx_recycle_slow(netmem_ref netmem) in libeth_rx_recycle_slow() argument 224 page_pool_put_full_netmem(netmem_get_pp(netmem), netmem, false); in libeth_rx_recycle_slow()
|
| /linux/drivers/net/ethernet/mellanox/mlx5/core/ |
| H A D | en_rx.c | 280 netmem_ref netmem = page_pool_dev_alloc_netmems(pp); in mlx5e_page_alloc_fragmented() local 282 if (unlikely(!netmem)) in mlx5e_page_alloc_fragmented() 285 page_pool_fragment_netmem(netmem, MLX5E_PAGECNT_BIAS_MAX); in mlx5e_page_alloc_fragmented() 288 .netmem = netmem, in mlx5e_page_alloc_fragmented() 299 netmem_ref netmem = frag_page->netmem; in mlx5e_page_release_fragmented() local 301 if (page_pool_unref_netmem(netmem, drain_count) == 0) in mlx5e_page_release_fragmented() 302 page_pool_put_unrefed_netmem(pp, netmem, -1, true); in mlx5e_page_release_fragmented() 362 addr = page_pool_get_dma_addr_netmem(frag->frag_page->netmem); in mlx5e_alloc_rx_wqe() 503 netmem_ref netmem = frag_page->netmem; in mlx5e_add_skb_shared_info_frag() local 506 dma_addr_t addr = page_pool_get_dma_addr_netmem(netmem); in mlx5e_add_skb_shared_info_frag() [all …]
|
| /linux/io_uring/ |
| H A D | zcrx.c | 596 netmem_ref netmem = net_iov_to_netmem(niov); in io_zcrx_return_niov() local 603 page_pool_put_unrefed_netmem(niov->desc.pp, netmem, -1, false); in io_zcrx_return_niov() 965 netmem_ref netmem; in io_zcrx_ring_refill() local 972 netmem = net_iov_to_netmem(niov); in io_zcrx_ring_refill() 973 if (!page_pool_unref_and_test(netmem)) in io_zcrx_ring_refill() 982 net_mp_netmem_place_in_cache(pp, netmem); in io_zcrx_ring_refill() 995 netmem_ref netmem = net_iov_to_netmem(niov); in io_zcrx_refill_slow() local 999 net_mp_netmem_place_in_cache(pp, netmem); in io_zcrx_refill_slow() 1023 static bool io_pp_zc_release_netmem(struct page_pool *pp, netmem_ref netmem) in io_pp_zc_release_netmem() argument 1027 if (WARN_ON_ONCE(!netmem_is_net_iov(netmem))) in io_pp_zc_release_netmem() [all …]
|
| /linux/drivers/net/ethernet/broadcom/bnge/ |
| H A D | bnge_txrx.c | 86 netmem_ref netmem; in bnge_reuse_rx_agg_bufs() local 106 netmem = cons_rx_buf->netmem; in bnge_reuse_rx_agg_bufs() 107 cons_rx_buf->netmem = 0; in bnge_reuse_rx_agg_bufs() 108 prod_rx_buf->netmem = netmem; in bnge_reuse_rx_agg_bufs() 184 netmem_ref netmem; in __bnge_rx_agg_netmems() local 195 skb_add_rx_frag_netmem(skb, i, cons_rx_buf->netmem, in __bnge_rx_agg_netmems() 204 netmem = cons_rx_buf->netmem; in __bnge_rx_agg_netmems() 205 cons_rx_buf->netmem = 0; in __bnge_rx_agg_netmems() 213 cons_rx_buf->netmem = netmem; in __bnge_rx_agg_netmems() 223 page_pool_dma_sync_netmem_for_cpu(rxr->page_pool, netmem, 0, in __bnge_rx_agg_netmems()
|
| H A D | bnge_netdev.c | 366 netmem_ref netmem = rx_agg_buf->netmem; in bnge_free_one_agg_ring_bufs() local 368 if (!netmem) in bnge_free_one_agg_ring_bufs() 371 rx_agg_buf->netmem = 0; in bnge_free_one_agg_ring_bufs() 374 page_pool_recycle_direct_netmem(rxr->page_pool, netmem); in bnge_free_one_agg_ring_bufs() 1049 netmem_ref netmem; in __bnge_alloc_rx_netmem() local 1052 netmem = page_pool_alloc_frag_netmem(rxr->page_pool, offset, in __bnge_alloc_rx_netmem() 1055 netmem = page_pool_alloc_netmems(rxr->page_pool, gfp); in __bnge_alloc_rx_netmem() 1058 if (!netmem) in __bnge_alloc_rx_netmem() 1061 *mapping = page_pool_get_dma_addr_netmem(netmem) + *offset; in __bnge_alloc_rx_netmem() 1062 return netmem; in __bnge_alloc_rx_netmem() [all …]
|