From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <olivier.matz@6wind.com>
Received: from proxy.6wind.com (host.76.145.23.62.rev.coltfrance.com
 [62.23.145.76]) by dpdk.org (Postfix) with ESMTP id 9B4D21BBE
 for <dev@dpdk.org>; Wed,  8 Mar 2017 10:42:22 +0100 (CET)
Received: from glumotte.dev.6wind.com (unknown [10.16.0.195])
 by proxy.6wind.com (Postfix) with ESMTP id 8583C24D1A;
 Wed,  8 Mar 2017 10:42:17 +0100 (CET)
From: Olivier Matz <olivier.matz@6wind.com>
To: dev@dpdk.org
Cc: bruce.richardson@intel.com, konstantin.ananyev@intel.com,
 mb@smartsharesystems.com, andrey.chilikin@intel.com, jblunck@infradead.org,
 nelio.laranjeiro@6wind.com, arybchenko@solarflare.com
Date: Wed,  8 Mar 2017 10:41:52 +0100
Message-Id: <1488966121-22853-1-git-send-email-olivier.matz@6wind.com>
X-Mailer: git-send-email 2.8.1
In-Reply-To: <1485271173-13408-1-git-send-email-olivier.matz@6wind.com>
References: <1485271173-13408-1-git-send-email-olivier.matz@6wind.com>
Subject: [dpdk-dev] [PATCH 0/9] mbuf: structure reorganization
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
X-List-Received-Date: Wed, 08 Mar 2017 09:42:22 -0000

Based on discussions done in [1] and in this thread, this patchset reorganizes
the mbuf.

The main changes are:
- reorder structure to increase vector performance on some non-ia
  platforms.
- add a 64bits timestamp field in the 1st cache line. This timestamp
  is not normalized, i.e. no unit or time reference is enforced. A
  library may be added to do this job in the future.
- m->next, m->nb_segs, and m->refcnt are always initialized for mbufs
  in the pool, avoiding the need of setting m->next (located in the
  2nd cache line) in the Rx path for mono-segment packets.
- change port and nb_segs to 16 bits
- move seqn in the 2nd cache line

Things discussed but not done in the patchset:
- move refcnt and nb_segs to the 2nd cache line: many drivers sets
  them in the Rx path, so it could introduce a performance regression, or
  it would require to change all the drivers, which is not an easy task.
- remove the m->port field: too much impact on many examples and libraries,
  and some people highlighted they are using it.
- moving m->next in the 1st cache line: there is not enough room, and having
  it set to NULL for unused mbuf should remove the need for it.
- merge seqn and timestamp together in a union: we could imagine use cases
  were both are activated. There is no flag indicating the presence of seqn,
  so it looks preferable to keep them separated for now.

I made some basic performance tests (ixgbe) and see no regression.
Other tests from NIC vendors are welcome.

Once this patchset is pushed, the Rx path of drivers could be optimized a bit,
by removing writes to m->next, m->nb_segs and m->refcnt. The patch 4/8 gives an
idea of what could be done.

[1] http://dpdk.org/ml/archives/dev/2016-October/049338.html

rfc->v1:
- fix reset of mbuf fields in case of indirect mbuf in rte_pktmbuf_prefree_seg()
- do not enforce a unit or time reference for m->timestamp
- reorganize fields to make vlan and outer vlan consecutive
- enhance documentation of m->refcnt and m->port to explain why they are 16bits

Jerin Jacob (1):
  mbuf: make rearm data address naturally aligned

Olivier Matz (8):
  mbuf: make segment prefree function public
  mbuf: make raw free function public
  mbuf: set mbuf fields while in pool
  drivers/net: don't touch mbuf next or nb segs on Rx
  mbuf: use 2 bytes for port and nb segments
  mbuf: move sequence number in second cache line
  mbuf: add a timestamp field
  mbuf: reorder VLAN tci and buffer len fields

 app/test-pmd/csumonly.c                            |   4 +-
 drivers/net/ena/ena_ethdev.c                       |   2 +-
 drivers/net/enic/enic_rxtx.c                       |   2 +-
 drivers/net/fm10k/fm10k_rxtx.c                     |   6 +-
 drivers/net/fm10k/fm10k_rxtx_vec.c                 |   9 +-
 drivers/net/i40e/i40e_rxtx_vec_common.h            |   6 +-
 drivers/net/i40e/i40e_rxtx_vec_sse.c               |  11 +-
 drivers/net/ixgbe/ixgbe_rxtx.c                     |  10 +-
 drivers/net/ixgbe/ixgbe_rxtx_vec_common.h          |   6 +-
 drivers/net/ixgbe/ixgbe_rxtx_vec_neon.c            |   9 --
 drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c             |   9 --
 drivers/net/mlx5/mlx5_rxtx.c                       |  11 +-
 drivers/net/mpipe/mpipe_tilegx.c                   |   3 +-
 drivers/net/null/rte_eth_null.c                    |   2 -
 drivers/net/virtio/virtio_rxtx.c                   |   4 -
 drivers/net/virtio/virtio_rxtx_simple.h            |   6 +-
 .../linuxapp/eal/include/exec-env/rte_kni_common.h |   5 +-
 lib/librte_mbuf/rte_mbuf.c                         |   4 +
 lib/librte_mbuf/rte_mbuf.h                         | 123 ++++++++++++++++-----
 19 files changed, 130 insertions(+), 102 deletions(-)

-- 
2.8.1