linux/include/net/netmem.h

/* SPDX-License-Identifier: GPL-2.0
 *
 *	Network memory
 *
 *	Author:	Mina Almasry <[email protected]>
 */

#ifndef _NET_NETMEM_H
#define _NET_NETMEM_H

#include <linux/mm.h>
#include <net/net_debug.h>

/* net_iov */

DECLARE_STATIC_KEY_FALSE(page_pool_mem_providers);

/*  We overload the LSB of the struct page pointer to indicate whether it's
 *  a page or net_iov.
 */
#define NET_IOV

struct net_iov {};

/* These fields in struct page are used by the page_pool and net stack:
 *
 *        struct {
 *                unsigned long pp_magic;
 *                struct page_pool *pp;
 *                unsigned long _pp_mapping_pad;
 *                unsigned long dma_addr;
 *                atomic_long_t pp_ref_count;
 *        };
 *
 * We mirror the page_pool fields here so the page_pool can access these fields
 * without worrying whether the underlying fields belong to a page or net_iov.
 *
 * The non-net stack fields of struct page are private to the mm stack and must
 * never be mirrored to net_iov.
 */
#define NET_IOV_ASSERT_OFFSET
NET_IOV_ASSERT_OFFSET;
NET_IOV_ASSERT_OFFSET;
NET_IOV_ASSERT_OFFSET;
NET_IOV_ASSERT_OFFSET;
#undef NET_IOV_ASSERT_OFFSET

/* netmem */

/**
 * typedef netmem_ref - a nonexistent type marking a reference to generic
 * network memory.
 *
 * A netmem_ref currently is always a reference to a struct page. This
 * abstraction is introduced so support for new memory types can be added.
 *
 * Use the supplied helpers to obtain the underlying memory pointer and fields.
 */
netmem_ref;

static inline bool netmem_is_net_iov(const netmem_ref netmem)
{}

/* This conversion fails (returns NULL) if the netmem_ref is not struct page
 * backed.
 */
static inline struct page *netmem_to_page(netmem_ref netmem)
{}

static inline struct net_iov *netmem_to_net_iov(netmem_ref netmem)
{}

static inline netmem_ref net_iov_to_netmem(struct net_iov *niov)
{}

static inline netmem_ref page_to_netmem(struct page *page)
{}

static inline int netmem_ref_count(netmem_ref netmem)
{}

static inline unsigned long netmem_pfn_trace(netmem_ref netmem)
{}

static inline struct net_iov *__netmem_clear_lsb(netmem_ref netmem)
{}

static inline struct page_pool *netmem_get_pp(netmem_ref netmem)
{}

static inline atomic_long_t *netmem_get_pp_ref_count_ref(netmem_ref netmem)
{}

static inline bool netmem_is_pref_nid(netmem_ref netmem, int pref_nid)
{}

static inline netmem_ref netmem_compound_head(netmem_ref netmem)
{}

static inline void *netmem_address(netmem_ref netmem)
{}

static inline unsigned long netmem_get_dma_addr(netmem_ref netmem)
{}

#endif /* _NET_NETMEM_H */