* Reorder the fields in the mbuf so that we have fields that are used$ together side-by-side in the structure. This means that we have a$ contiguous block of 8-bytes in the mbuf which are used to reset an mbuf$ of descriptor rearm, and a block of 16-bytes of data (excluding flags) which are set on RX from the received packet descriptor. * Use dummy fields as appropraite to ensure alignment or to reserve gaps for later field additions. * Place most items which are not used by fast-path RX separately at the end of the structure so they can later be moved to a separate cache line. [The l2/l3 length fields are not moved at this stage as doing so will cause overflow to the next cache line].
Signed-off-by: Bruce Richardson <bruce.richardson at intel.com> --- lib/librte_mbuf/rte_mbuf.h | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 669e7f5..f136d37 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -115,16 +115,12 @@ extern "C" { * The generic rte_mbuf, containing a packet mbuf. */ struct rte_mbuf { - struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */ void *buf_addr; /**< Virtual address of segment buffer. */ phys_addr_t buf_physaddr; /**< Physical address of segment buffer. */ - uint16_t buf_len; /**< Length of segment buffer. */ - /* valid for any segment */ - struct rte_mbuf *next; /**< Next segment of scattered packet. */ + /* next 8 bytes are initialised on RX descriptor rearm */ + uint16_t buf_len; /**< Length of segment buffer. */ uint16_t data_off; - uint16_t data_len; /**< Amount of data in segment buffer. */ - uint32_t pkt_len; /**< Total pkt len: sum of all segments. */ #ifdef RTE_MBUF_REFCNT /** @@ -142,14 +138,17 @@ struct rte_mbuf { #else uint16_t refcnt_reserved; /**< Do not use this field */ #endif - uint16_t reserved; /**< Unused field. Required for padding */ - uint16_t ol_flags; /**< Offload features. */ - - /* these fields are valid for first segment only */ uint8_t nb_segs; /**< Number of segments. */ uint8_t port; /**< Input port. */ - /* offload features, valid for first segment only */ + uint16_t ol_flags; /**< Offload features. */ + uint16_t reserved0; /**< Unused field. Required for padding */ + uint32_t reserved1; /**< Unused field. Required for padding */ + + /* remaining bytes are set on RX when pulling packet from descriptor */ + uint16_t reserved2; /**< Unused field. Required for padding */ + uint16_t data_len; /**< Amount of data in segment buffer. */ + uint32_t pkt_len; /**< Total pkt len: sum of all segments. */ uint16_t l3_len:9; /**< L3 (IP) Header Length. */ uint16_t l2_len:7; /**< L2 (MAC) Header Length. */ uint16_t vlan_tci; /**< VLAN Tag Control Identifier (CPU order). */ @@ -162,6 +161,10 @@ struct rte_mbuf { uint32_t sched; /**< Hierarchical scheduler */ } hash; /**< hash information */ + /* fields only used in slow path or on TX */ + struct rte_mempool *pool; /**< Pool from which mbuf was allocated. */ + struct rte_mbuf *next; /**< Next segment of scattered packet. */ + union { uint8_t metadata[0]; uint16_t metadata16[0]; -- 1.9.3