From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 9CF6EB3AF for ; Thu, 11 Sep 2014 15:11:31 +0200 (CEST) Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP; 11 Sep 2014 06:16:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.04,505,1406617200"; d="scan'208";a="598051351" Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga002.fm.intel.com with ESMTP; 11 Sep 2014 06:15:49 -0700 Received: from sivswdev02.ir.intel.com (sivswdev02.ir.intel.com [10.237.217.46]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id s8BDFmZD002138; Thu, 11 Sep 2014 14:15:48 +0100 Received: from sivswdev02.ir.intel.com (localhost [127.0.0.1]) by sivswdev02.ir.intel.com with ESMTP id s8BDFmNX023612; Thu, 11 Sep 2014 14:15:48 +0100 Received: (from bricha3@localhost) by sivswdev02.ir.intel.com with id s8BDFmi8023608; Thu, 11 Sep 2014 14:15:48 +0100 From: Bruce Richardson To: dev@dpdk.org Date: Thu, 11 Sep 2014 14:15:36 +0100 Message-Id: <1410441347-22840-3-git-send-email-bruce.richardson@intel.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1410441347-22840-1-git-send-email-bruce.richardson@intel.com> References: <1409759378-10113-1-git-send-email-bruce.richardson@intel.com> <1410441347-22840-1-git-send-email-bruce.richardson@intel.com> Subject: [dpdk-dev] [PATCH v2 02/13] mbuf: reorder fields by time of use X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 11 Sep 2014 13:11:33 -0000 * 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 appropriate 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]. Updated in V2: * Updated the KNI buffer structure to match that of new mbuf * Cleaned up commit message typos. Signed-off-by: Bruce Richardson --- .../linuxapp/eal/include/exec-env/rte_kni_common.h | 12 ++++++----- lib/librte_mbuf/rte_mbuf.h | 25 ++++++++++++---------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h index 07908ac..f2b502c 100644 --- a/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h +++ b/lib/librte_eal/linuxapp/eal/include/exec-env/rte_kni_common.h @@ -108,15 +108,17 @@ struct rte_kni_fifo { * Padding is necessary to assure the offsets of these fields */ struct rte_kni_mbuf { - void *pool; void *buf_addr; - char pad0[16]; - void *next; + char pad0[10]; uint16_t data_off; /**< Start address of data in segment buffer. */ + char pad1[4]; + uint16_t ol_flags; /**< Offload features. */ + char pad2[8]; uint16_t data_len; /**< Amount of data in segment buffer. */ uint32_t pkt_len; /**< Total pkt len: sum of all segment data_len. */ - char pad2[4]; - uint16_t ol_flags; /**< Offload features. */ + char pad3[8]; + void *pool; + void *next; } __attribute__((__aligned__(64))); /* diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 71080e5..413a5a1 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. */ union { uint16_t l2_l3_len; /**< combined l2/l3 lengths as single var */ struct { @@ -167,6 +166,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