[dpdk-dev,02/13] mbuf: reorder fields by time of use
Commit Message
* 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@intel.com>
---
lib/librte_mbuf/rte_mbuf.h | 25 ++++++++++++++-----------
1 file changed, 14 insertions(+), 11 deletions(-)
Comments
Hi Bruce,
On 09/03/2014 05:49 PM, Bruce Richardson wrote:
> * 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.
Some unwanted $ characters here.
> * Use dummy fields as appropraite to ensure alignment or to reserve gaps
> for later field additions.
s/appropraite/appropriate
> * 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@intel.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
@@ -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];