35 #include <rte_compat.h>
37 #include <rte_config.h>
130 #if RTE_CACHE_LINE_SIZE == 64
151 return mb->buf_iova + mb->data_off;
156 rte_mbuf_data_dma_addr(
const struct rte_mbuf *mb)
176 return mb->buf_iova + RTE_PKTMBUF_HEADROOM;
181 rte_mbuf_data_dma_addr_default(
const struct rte_mbuf *mb)
245 #ifdef ALLOW_EXPERIMENTAL_API
268 #ifdef ALLOW_EXPERIMENTAL_API
316 static inline uint32_t
322 return mbp_priv->
flags;
331 #define RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF (1 << 0)
340 #define RTE_MBUF_HAS_PINNED_EXTBUF(mb) \
341 (rte_pktmbuf_priv_flags(mb->pool) & RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF)
343 #ifdef RTE_LIBRTE_MBUF_DEBUG
346 #define __rte_mbuf_sanity_check(m, is_h) rte_mbuf_sanity_check(m, is_h)
351 #define __rte_mbuf_sanity_check(m, is_h) do { } while (0)
355 #ifdef RTE_MBUF_REFCNT_ATOMIC
364 static inline uint16_t
367 return __atomic_load_n(&m->
refcnt, __ATOMIC_RELAXED);
380 __atomic_store_n(&m->
refcnt, new_value, __ATOMIC_RELAXED);
384 static inline uint16_t
385 __rte_mbuf_refcnt_update(
struct rte_mbuf *m, int16_t value)
387 return __atomic_add_fetch(&m->
refcnt, (uint16_t)value,
400 static inline uint16_t
413 return (uint16_t)value;
416 return __rte_mbuf_refcnt_update(m, value);
422 static inline uint16_t
423 __rte_mbuf_refcnt_update(
struct rte_mbuf *m, int16_t value)
432 static inline uint16_t
435 return __rte_mbuf_refcnt_update(m, value);
441 static inline uint16_t
466 static inline uint16_t
469 return __atomic_load_n(&shinfo->refcnt, __ATOMIC_RELAXED);
484 __atomic_store_n(&shinfo->refcnt, new_value, __ATOMIC_RELAXED);
498 static inline uint16_t
505 return (uint16_t)value;
508 return __atomic_add_fetch(&shinfo->refcnt, (uint16_t)value,
513 #define RTE_MBUF_PREFETCH_TO_FREE(m) do { \
555 const char **reason);
557 #define MBUF_RAW_ALLOC_CHECK(m) do { \
558 RTE_ASSERT(rte_mbuf_refcnt_read(m) == 1); \
559 RTE_ASSERT((m)->next == NULL); \
560 RTE_ASSERT((m)->nb_segs == 1); \
561 __rte_mbuf_sanity_check(m, 0); \
589 MBUF_RAW_ALLOC_CHECK(m);
613 RTE_ASSERT(m->
next == NULL);
639 void *m,
unsigned i);
696 unsigned cache_size, uint16_t priv_size, uint16_t data_room_size,
738 unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size,
796 unsigned int ext_num);
809 static inline uint16_t
830 static inline uint16_t
849 m->data_off = (uint16_t)
RTE_MIN((uint16_t)RTE_PKTMBUF_HEADROOM,
861 #define MBUF_INVALID_PORT UINT16_MAX
863 static inline void rte_pktmbuf_reset(
struct rte_mbuf *m)
898 rte_pktmbuf_reset(m);
917 struct rte_mbuf **mbufs,
unsigned count)
933 while (idx != count) {
934 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
935 rte_pktmbuf_reset(mbufs[idx]);
939 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
940 rte_pktmbuf_reset(mbufs[idx]);
944 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
945 rte_pktmbuf_reset(mbufs[idx]);
949 MBUF_RAW_ALLOC_CHECK(mbufs[idx]);
950 rte_pktmbuf_reset(mbufs[idx]);
1000 if (addr <= buf_addr)
1079 RTE_ASSERT(shinfo->
free_cb != NULL);
1082 m->buf_iova = buf_iova;
1099 #define rte_pktmbuf_detach_extbuf(m) rte_pktmbuf_detach(m)
1123 mdst->hash = msrc->hash;
1166 __rte_pktmbuf_copy_hdr(mi, m);
1168 mi->data_off = m->data_off;
1170 mi->buf_iova = m->buf_iova;
1190 __rte_pktmbuf_free_extbuf(
struct rte_mbuf *m)
1193 RTE_ASSERT(m->
shinfo != NULL);
1206 __rte_pktmbuf_free_direct(
struct rte_mbuf *m)
1243 uint32_t mbuf_size, buf_len;
1262 __rte_pktmbuf_free_extbuf(m);
1264 __rte_pktmbuf_free_direct(m);
1267 mbuf_size = (uint32_t)(
sizeof(
struct rte_mbuf) + priv_size);
1271 m->
buf_addr = (
char *)m + mbuf_size;
1273 m->
buf_len = (uint16_t)buf_len;
1292 static inline int __rte_pktmbuf_pinned_extbuf_decref(
struct rte_mbuf *m)
1308 if (
likely(__atomic_add_fetch(&shinfo->refcnt, (uint16_t)-1,
1342 __rte_pktmbuf_pinned_extbuf_decref(m))
1346 if (m->
next != NULL) {
1353 }
else if (__rte_mbuf_refcnt_update(m, -1) == 0) {
1359 __rte_pktmbuf_pinned_extbuf_decref(m))
1363 if (m->
next != NULL) {
1473 uint32_t offset, uint32_t length);
1492 }
while ((m = m->
next) != NULL);
1535 while (m->
next != NULL)
1541 #define rte_pktmbuf_mtophys_offset(m, o) \
1542 rte_pktmbuf_iova_offset(m, o)
1545 #define rte_pktmbuf_mtophys(m) rte_pktmbuf_iova(m)
1555 #define rte_pktmbuf_pkt_len(m) ((m)->pkt_len)
1565 #define rte_pktmbuf_data_len(m) ((m)->data_len)
1593 m->data_off = (uint16_t)(m->data_off - len);
1597 return (
char *)m->
buf_addr + m->data_off;
1629 return (
char*) tail;
1657 m->data_off = (uint16_t)(m->data_off + len);
1659 return (
char *)m->
buf_addr + m->data_off;
1709 const void *__rte_pktmbuf_read(
const struct rte_mbuf *m, uint32_t off,
1710 uint32_t len,
void *buf);
1733 uint32_t off, uint32_t len,
void *buf)
1738 return __rte_pktmbuf_read(m, off, len, buf);
1767 cur_tail->
next = tail;
1807 rte_mbuf_tx_offload(uint64_t il2, uint64_t il3, uint64_t il4, uint64_t tso,
1808 uint64_t ol3, uint64_t ol2, uint64_t unused)
1810 return il2 << RTE_MBUF_L2_LEN_OFS |
1811 il3 << RTE_MBUF_L3_LEN_OFS |
1812 il4 << RTE_MBUF_L4_LEN_OFS |
1813 tso << RTE_MBUF_TSO_SEGSZ_OFS |
1814 ol3 << RTE_MBUF_OUTL3_LEN_OFS |
1815 ol2 << RTE_MBUF_OUTL2_LEN_OFS |
1816 unused << RTE_MBUF_TXOFLD_UNUSED_OFS;
1851 !(ol_flags & PKT_TX_IP_CKSUM)))
1865 int __rte_pktmbuf_linearize(
struct rte_mbuf *mbuf);
1884 return __rte_pktmbuf_linearize(mbuf);
1906 static inline uint32_t
1909 return m->hash.sched.queue_id;
1915 static inline uint8_t
1918 return m->hash.sched.traffic_class;
1924 static inline uint8_t
1927 return m->hash.sched.color;
1944 uint8_t *traffic_class,
1951 *color = sched.
color;
1978 m->hash.sched.color =
color;
struct rte_mbuf_ext_shared_info * shinfo
static rte_iova_t rte_mbuf_data_iova(const struct rte_mbuf *mb)
uint16_t mbuf_data_room_size
#define __rte_always_inline
static struct rte_mbuf * rte_pktmbuf_alloc(struct rte_mempool *mp)
static void rte_mbuf_sched_traffic_class_set(struct rte_mbuf *m, uint8_t traffic_class)
static uint16_t rte_pktmbuf_priv_size(struct rte_mempool *mp)
static int rte_validate_tx_offload(const struct rte_mbuf *m)
__rte_experimental struct rte_mbuf * rte_pktmbuf_copy(const struct rte_mbuf *m, struct rte_mempool *mp, uint32_t offset, uint32_t length)
static void rte_pktmbuf_free(struct rte_mbuf *m)
#define PKT_TX_OUTER_IP_CKSUM
static uint32_t rte_mbuf_sched_queue_get(const struct rte_mbuf *m)
#define RTE_PTR_ALIGN_FLOOR(ptr, align)
void rte_pktmbuf_pool_init(struct rte_mempool *mp, void *opaque_arg)
static __rte_always_inline void rte_pktmbuf_free_seg(struct rte_mbuf *m)
static struct rte_mbuf * rte_mbuf_from_indirect(struct rte_mbuf *mi)
rte_mbuf_extbuf_free_callback_t free_cb
static int rte_pktmbuf_chain(struct rte_mbuf *head, struct rte_mbuf *tail)
__rte_experimental void rte_pktmbuf_free_bulk(struct rte_mbuf **mbufs, unsigned int count)
static uint8_t rte_mbuf_sched_traffic_class_get(const struct rte_mbuf *m)
static __rte_experimental char * rte_mbuf_buf_addr(struct rte_mbuf *mb, struct rte_mempool *mp)
__rte_experimental int rte_mbuf_check(const struct rte_mbuf *m, int is_header, const char **reason)
void rte_pktmbuf_dump(FILE *f, const struct rte_mbuf *m, unsigned dump_len)
static uint16_t rte_pktmbuf_headroom(const struct rte_mbuf *m)
static int rte_pktmbuf_alloc_bulk(struct rte_mempool *pool, struct rte_mbuf **mbufs, unsigned count)
static void rte_pktmbuf_reset_headroom(struct rte_mbuf *m)
static void rte_mbuf_prefetch_part2(struct rte_mbuf *m)
#define PKT_TX_OUTER_IPV4
static uint16_t rte_mbuf_ext_refcnt_update(struct rte_mbuf_ext_shared_info *shinfo, int16_t value)
#define IND_ATTACHED_MBUF
#define rte_pktmbuf_mtod_offset(m, t, o)
static __rte_always_inline struct rte_mbuf * rte_pktmbuf_prefree_seg(struct rte_mbuf *m)
static int rte_pktmbuf_is_contiguous(const struct rte_mbuf *m)
#define RTE_PTR_ADD(ptr, x)
int rte_get_tx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
static void rte_mbuf_sched_set(struct rte_mbuf *m, uint32_t queue_id, uint8_t traffic_class, uint8_t color)
static uint16_t rte_pktmbuf_tailroom(const struct rte_mbuf *m)
static __rte_always_inline void rte_mbuf_raw_free(struct rte_mbuf *m)
static void rte_mbuf_sched_get(const struct rte_mbuf *m, uint32_t *queue_id, uint8_t *traffic_class, uint8_t *color)
static void rte_mbuf_sched_queue_set(struct rte_mbuf *m, uint32_t queue_id)
void rte_mbuf_sanity_check(const struct rte_mbuf *m, int is_header)
static void rte_mbuf_sched_color_set(struct rte_mbuf *m, uint8_t color)
void(* rte_mbuf_extbuf_free_callback_t)(void *addr, void *opaque)
#define __rte_mbuf_sanity_check(m, is_h)
const char * rte_get_tx_ol_flag_name(uint64_t mask)
static uint16_t rte_mbuf_refcnt_read(const struct rte_mbuf *m)
static int rte_pktmbuf_linearize(struct rte_mbuf *mbuf)
static __rte_always_inline int rte_mempool_get(struct rte_mempool *mp, void **obj_p)
static uint32_t rte_pktmbuf_priv_flags(struct rte_mempool *mp)
static char * rte_pktmbuf_adj(struct rte_mbuf *m, uint16_t len)
static __rte_experimental void * rte_mbuf_to_priv(struct rte_mbuf *m)
#define RTE_MBUF_DIRECT(mb)
#define RTE_MBUF_CLONED(mb)
static void rte_pktmbuf_attach(struct rte_mbuf *mi, struct rte_mbuf *m)
static __rte_always_inline int rte_mempool_get_bulk(struct rte_mempool *mp, void **obj_table, unsigned int n)
static void rte_mbuf_dynfield_copy(struct rte_mbuf *mdst, const struct rte_mbuf *msrc)
static void rte_pktmbuf_detach(struct rte_mbuf *m)
static uint16_t rte_mbuf_ext_refcnt_read(const struct rte_mbuf_ext_shared_info *shinfo)
#define rte_pktmbuf_data_len(m)
static uint16_t rte_mbuf_refcnt_update(struct rte_mbuf *m, int16_t value)
#define MBUF_INVALID_PORT
static uint16_t rte_pktmbuf_data_room_size(struct rte_mempool *mp)
const char * rte_get_rx_ol_flag_name(uint64_t mask)
static struct rte_mbuf_ext_shared_info * rte_pktmbuf_ext_shinfo_init_helper(void *buf_addr, uint16_t *buf_len, rte_mbuf_extbuf_free_callback_t free_cb, void *fcb_opaque)
void rte_pktmbuf_init(struct rte_mempool *mp, void *opaque_arg, void *m, unsigned i)
#define RTE_MBUF_HAS_EXTBUF(mb)
struct rte_mempool * pool
static void rte_mbuf_ext_refcnt_set(struct rte_mbuf_ext_shared_info *shinfo, uint16_t new_value)
static char * rte_pktmbuf_append(struct rte_mbuf *m, uint16_t len)
static void rte_mbuf_refcnt_set(struct rte_mbuf *m, uint16_t new_value)
struct rte_mempool * rte_pktmbuf_pool_create_by_ops(const char *name, unsigned int n, unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size, int socket_id, const char *ops_name)
static rte_iova_t rte_mbuf_data_iova_default(const struct rte_mbuf *mb)
static int rte_pktmbuf_trim(struct rte_mbuf *m, uint16_t len)
static char * rte_mbuf_to_baddr(struct rte_mbuf *md)
static const void * rte_pktmbuf_read(const struct rte_mbuf *m, uint32_t off, uint32_t len, void *buf)
static char * rte_pktmbuf_prepend(struct rte_mbuf *m, uint16_t len)
static struct rte_mbuf * rte_mbuf_raw_alloc(struct rte_mempool *mp)
static void rte_pktmbuf_refcnt_update(struct rte_mbuf *m, int16_t v)
#define RTE_PTR_SUB(ptr, x)
static struct rte_mbuf * rte_pktmbuf_lastseg(struct rte_mbuf *m)
static __rte_experimental char * rte_mbuf_data_addr_default(__rte_unused struct rte_mbuf *mb)
__rte_experimental struct rte_mempool * rte_pktmbuf_pool_create_extbuf(const char *name, unsigned int n, unsigned int cache_size, uint16_t priv_size, uint16_t data_room_size, int socket_id, const struct rte_pktmbuf_extmem *ext_mem, unsigned int ext_num)
static uint8_t rte_mbuf_sched_color_get(const struct rte_mbuf *m)
#define RTE_PKTMBUF_POOL_F_PINNED_EXT_BUF
static rte_iova_t rte_mempool_virt2iova(const void *elt)
static __rte_always_inline void rte_mempool_put(struct rte_mempool *mp, void *obj)
#define RTE_PTR_DIFF(ptr1, ptr2)
static void rte_mbuf_prefetch_part1(struct rte_mbuf *m)
#define PKT_TX_OFFLOAD_MASK
static void * rte_mempool_get_priv(struct rte_mempool *mp)
char name[RTE_MEMZONE_NAMESIZE]
#define RTE_MBUF_HAS_PINNED_EXTBUF(mb)
struct rte_mbuf * rte_pktmbuf_clone(struct rte_mbuf *md, struct rte_mempool *mp)
int rte_get_rx_ol_flag_list(uint64_t mask, char *buf, size_t buflen)
static void rte_prefetch0(const volatile void *p)
struct rte_mempool * rte_pktmbuf_pool_create(const char *name, unsigned n, unsigned cache_size, uint16_t priv_size, uint16_t data_room_size, int socket_id)
#define EXT_ATTACHED_MBUF
static void rte_pktmbuf_attach_extbuf(struct rte_mbuf *m, void *buf_addr, rte_iova_t buf_iova, uint16_t buf_len, struct rte_mbuf_ext_shared_info *shinfo)