mbuf: optimize memory loads during freeing
authorAlexander Kozyrev <akozyrev@mellanox.com>
Fri, 20 Mar 2020 15:55:15 +0000 (15:55 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 31 Mar 2020 00:57:42 +0000 (02:57 +0200)
commit759a6a221e8c31c3b7193cbd104753eaad01b89d
tree1c0605f9d7865be271441ec201841fda147359b1
parentfc67ae91ebae7c48fc27a1d24e0843c50c192459
mbuf: optimize memory loads during freeing

Introduction of pinned external buffers doubled memory loads in the
rte_pktmbuf_prefree_seg() function. Analysis of the generated assembly
code shows unnecessary load of the pool field of the rte_mbuf structure.
Here is the snippet of the assembly for "if (!RTE_MBUF_DIRECT(m))":
Before the change the code was:
movq  0x18(%rbx), %rax // load the ol_flags field
test %r13, %rax        // check if ol_flags equals to 0x60...0
jz 0x9a8718 <Block 2>  // jump out to "if (m->next != NULL)"
After the change the code became:
movq  0x18(%rbx), %rax // load ol_flags
test %r14, %rax        // check if ol_flags equals to 0x60...0
jnz 0x9bea38 <Block 2> // jump in to "if (!RTE_MBUF_HAS_EXTBUF(m)"
movq  0x48(%rbx), %rax // load the pool field
jmp 0x9bea78 <Block 7> // jump out to "if (m->next != NULL)"
Look like this absolutely unneeded memory load of the pool field is an
optimization for the external buffer case in GCC (4.8.5), since Clang
generates the same assembly for both before and after the change versions.
Plus, GCC favors the external buffer case over the simple case.
This assembly code layout causes the performance degradation because the
rte_pktmbuf_prefree_seg() function is a part of a very hot path.
Workaround this compilation issue by moving the check for pinned buffer
apart from the check for external buffer and restore the initial code
flow that favors the direct mbuf case over the external one.

Fixes: 6ef1107ad4c6 ("mbuf: detach mbuf with pinned external buffer")
Cc: stable@dpdk.org
Signed-off-by: Alexander Kozyrev <akozyrev@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_mbuf/rte_mbuf.h