mbuf: set mbuf fields while in pool
authorOlivier Matz <olivier.matz@6wind.com>
Tue, 4 Apr 2017 16:28:02 +0000 (18:28 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 5 Apr 2017 09:30:29 +0000 (11:30 +0200)
commit8f094a9ac5d7424e460bc85708e99aa255432a87
tree5e5e54bcdb7fc9928dcd9341c0d6bb533cb869ff
parent1f88c0a22bb1adc5bab8e03bca82bd25d8b70bf2
mbuf: set mbuf fields while in pool

Set the value of m->refcnt to 1, m->nb_segs to 1 and m->next
to NULL when the mbuf is stored inside the mempool (unused).
This is done in rte_pktmbuf_prefree_seg(), before freeing or
recycling a mbuf.

Before this patch, the value of m->refcnt was expected to be 0
while in pool.

The objectives are:

- to avoid drivers to set m->next to NULL in the early Rx path, since
  this field is in the second 64B of the mbuf and its access could
  trigger a cache miss

- rationalize the behavior of raw_alloc/raw_free: one is now the
  symmetric of the other, and refcnt is never changed in these functions.

To optimize the freeing of the segments, we try try to only update
m->refcnt, m->next, and m->nb_segs when it's required (idea from
Konstantin Ananyev <konstantin.ananyev@intel.com>).

Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
drivers/net/mlx5/mlx5_rxtx.c
lib/librte_mbuf/rte_mbuf.c
lib/librte_mbuf/rte_mbuf.h