ixgbe: fix crash caused by bulk allocation failure
authorBalazs Nemeth <balazs.nemeth@intel.com>
Fri, 26 Sep 2014 09:57:20 +0000 (09:57 +0000)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 29 Sep 2014 06:19:40 +0000 (08:19 +0200)
commiteb6cabe10040de9397e2cf9b4d3d252eb0908fc2
treef4cadb9664bc63330e4ccb16935ef655ee147101
parent23fcffe8ffaccf8a2901050e7daa4979597141ed
ixgbe: fix crash caused by bulk allocation failure

Since the introduction of vector PMD, a bug in ixgbe_rxq_rearm could
cause a crash. As long as the memory pool allocated to the RX queue
has mbufs available, there is no problem. After allocation of _all_
mbufs from the memory pool, previously returned mbufs by
rte_eth_rx_burst could be accessed by subsequent calls to the PMD and
could be returned by subsequent calls to rte_eth_rx_burst. From the
perspective of the application, the means that fields within the mbuf
could change and that previously allocated mbufs could appear multiple
times.

After failure of mbuf allocation, the dd bits should indicate that the
packets are not ready. For this, this patch adds code to reset the dd
bits in the first RTE_IXGBE_DESCS_PER_LOOP packets of the next
RTE_IXGBE_RXQ_REARM_THRESH packets only if the next
RTE_IXGBE_RXQ_REARM_THRESH packets that will be accessed contain
previously allocated packets.

Setting the bits is not enough. The bits are checked _after_ setting
the mbuf fields, thus a mechanism is needed to prevent the previously
used mbuf pointers from being accessed during the speculative load of
the mbuf fields. For this reason, not only the dd bits are reset, but
also the mbufs associated to those descriptors are set to point to a
"fake" mbuf.

Signed-off-by: Balazs Nemeth <balazs.nemeth@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
lib/librte_pmd_ixgbe/ixgbe_rxtx_vec.c