fm10k: handle error flags in vector Rx
Using SSE instructions to parse error flags in HW Rx descriptor, then set corresponding bits of mbuf. Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com> Acked-by: Cunming Liang <cunming.liang@intel.com>
This commit is contained in:
parent
d06e6bb248
commit
d51be739c3
@ -162,6 +162,10 @@ This section should contain new features added in this release. Sample format:
|
||||
|
||||
* Free multiple mbufs at a time to reduce freeing mbuf cycles.
|
||||
|
||||
* **Handled error flags in fm10k vector Rx.**
|
||||
|
||||
Parse err flags in Rx desc and set error bits in mbuf with vector instructions.
|
||||
|
||||
* **Increased number of next hops for LPM IPv4 to 2^24.**
|
||||
|
||||
The next_hop field is extended from 8 bits to 24 bits for IPv4.
|
||||
|
@ -61,11 +61,17 @@ fm10k_reset_tx_queue(struct fm10k_tx_queue *txq);
|
||||
#define L3TYPE_SHIFT (4)
|
||||
/* L4 type shift */
|
||||
#define L4TYPE_SHIFT (7)
|
||||
/* HBO flag shift */
|
||||
#define HBOFLAG_SHIFT (10)
|
||||
/* RXE flag shift */
|
||||
#define RXEFLAG_SHIFT (13)
|
||||
/* IPE/L4E flag shift */
|
||||
#define L3L4EFLAG_SHIFT (14)
|
||||
|
||||
static inline void
|
||||
fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
|
||||
{
|
||||
__m128i ptype0, ptype1, vtag0, vtag1;
|
||||
__m128i ptype0, ptype1, vtag0, vtag1, eflag0, eflag1, cksumflag;
|
||||
union {
|
||||
uint16_t e[4];
|
||||
uint64_t dword;
|
||||
@ -81,12 +87,29 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
|
||||
0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x000F, 0x000F, 0x000F, 0x000F);
|
||||
|
||||
/* mask for HBO and RXE flag flags */
|
||||
const __m128i rxe_msk = _mm_set_epi16(
|
||||
0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0001, 0x0001, 0x0001, 0x0001);
|
||||
|
||||
const __m128i l3l4cksum_flag = _mm_set_epi8(0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
PKT_RX_IP_CKSUM_BAD | PKT_RX_L4_CKSUM_BAD,
|
||||
PKT_RX_IP_CKSUM_BAD, PKT_RX_L4_CKSUM_BAD, 0);
|
||||
|
||||
const __m128i rxe_flag = _mm_set_epi8(0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, 0, 0,
|
||||
0, 0, PKT_RX_RECIP_ERR, 0);
|
||||
|
||||
/* map rss type to rss hash flag */
|
||||
const __m128i rss_flags = _mm_set_epi8(0, 0, 0, 0,
|
||||
0, 0, 0, PKT_RX_RSS_HASH,
|
||||
PKT_RX_RSS_HASH, 0, PKT_RX_RSS_HASH, 0,
|
||||
PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, PKT_RX_RSS_HASH, 0);
|
||||
|
||||
/* Calculate RSS_hash and Vlan fields */
|
||||
ptype0 = _mm_unpacklo_epi16(descs[0], descs[1]);
|
||||
ptype1 = _mm_unpacklo_epi16(descs[2], descs[3]);
|
||||
vtag0 = _mm_unpackhi_epi16(descs[0], descs[1]);
|
||||
@ -97,10 +120,27 @@ fm10k_desc_to_olflags_v(__m128i descs[4], struct rte_mbuf **rx_pkts)
|
||||
ptype0 = _mm_shuffle_epi8(rss_flags, ptype0);
|
||||
|
||||
vtag1 = _mm_unpacklo_epi32(vtag0, vtag1);
|
||||
eflag0 = vtag1;
|
||||
cksumflag = vtag1;
|
||||
vtag1 = _mm_srli_epi16(vtag1, VP_SHIFT);
|
||||
vtag1 = _mm_and_si128(vtag1, pkttype_msk);
|
||||
|
||||
vtag1 = _mm_or_si128(ptype0, vtag1);
|
||||
|
||||
/* Process err flags, simply set RECIP_ERR bit if HBO/IXE is set */
|
||||
eflag1 = _mm_srli_epi16(eflag0, RXEFLAG_SHIFT);
|
||||
eflag0 = _mm_srli_epi16(eflag0, HBOFLAG_SHIFT);
|
||||
eflag0 = _mm_or_si128(eflag0, eflag1);
|
||||
eflag0 = _mm_and_si128(eflag0, rxe_msk);
|
||||
eflag0 = _mm_shuffle_epi8(rxe_flag, eflag0);
|
||||
|
||||
vtag1 = _mm_or_si128(eflag0, vtag1);
|
||||
|
||||
/* Process L4/L3 checksum error flags */
|
||||
cksumflag = _mm_srli_epi16(cksumflag, L3L4EFLAG_SHIFT);
|
||||
cksumflag = _mm_shuffle_epi8(l3l4cksum_flag, cksumflag);
|
||||
vtag1 = _mm_or_si128(cksumflag, vtag1);
|
||||
|
||||
vol.dword = _mm_cvtsi128_si64(vtag1);
|
||||
|
||||
rx_pkts[0]->ol_flags = vol.e[0];
|
||||
|
Loading…
Reference in New Issue
Block a user