-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathixgbe_18_11.patch
162 lines (149 loc) · 5.66 KB
/
ixgbe_18_11.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
From b1b97686d53957c1aeeb0ad9d6f8004bc3f5948c Mon Sep 17 00:00:00 2001
From: Amy Ousterhout <[email protected]>
Date: Mon, 10 Dec 2018 16:02:53 -0500
Subject: [PATCH] new ixgbe patch
---
drivers/net/ixgbe/ixgbe_rxtx.c | 50 +++++++++++++++++++++--
drivers/net/ixgbe/ixgbe_rxtx.h | 6 +--
drivers/net/ixgbe/ixgbe_rxtx_vec_common.h | 4 +-
drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c | 15 ++++++-
4 files changed, 66 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.c b/drivers/net/ixgbe/ixgbe_rxtx.c
index ddc7efa87..22f1e6172 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx.c
@@ -558,10 +558,10 @@ tx_desc_ol_flags_to_cmdtype(uint64_t ol_flags)
/* Default RS bit threshold values */
#ifndef DEFAULT_TX_RS_THRESH
-#define DEFAULT_TX_RS_THRESH 32
+#define DEFAULT_TX_RS_THRESH 64
#endif
#ifndef DEFAULT_TX_FREE_THRESH
-#define DEFAULT_TX_FREE_THRESH 32
+#define DEFAULT_TX_FREE_THRESH 64
#endif
/* Reset transmit descriptors after they have been used */
@@ -2374,6 +2374,41 @@ static const struct ixgbe_txq_ops def_txq_ops = {
.reset = ixgbe_reset_tx_queue,
};
+static uint16_t
+install_txq_ctx(struct ixgbe_tx_queue *txq, uint16_t slot,
+ const uint64_t flags, const union ixgbe_tx_offload tx_offload)
+{
+
+ /* This must be called before any packets are placed in the ring */
+ ASSERT(txq->tx_tail == 0);
+ ASSERT(((struct ixgbe_tx_entry_v *)txq->sw_ring_v)->mbuf == NULL);
+ ASSERT(txq->nb_tx_free >= txq->tx_free_thresh);
+ ASSERT(txq->nb_tx_desc > 0);
+ ASSERT(txq->nb_tx_free >= 1);
+ ASSERT(slot < IXGBE_CTX_NUM);
+
+
+ uint64_t tx_ol_req = flags & IXGBE_TX_OFFLOAD_MASK;
+
+ volatile union ixgbe_adv_tx_desc *txr = txq->tx_ring;
+ volatile struct ixgbe_adv_tx_context_desc *ctx_txd;
+ ctx_txd = (volatile struct ixgbe_adv_tx_context_desc *)txr;
+
+ txq->ctx_curr = slot;
+ ixgbe_set_xmit_ctx(txq, ctx_txd, tx_ol_req,
+ tx_offload, NULL);
+
+ txq->nb_tx_used = (uint16_t)(txq->nb_tx_used + 1);
+ txq->nb_tx_free = (uint16_t)(txq->nb_tx_free - 1);
+
+ PMD_TX_LOG(DEBUG, "port_id=%u queue_id=%u tx_tail=%u nb_tx=%u",
+ (unsigned) txq->port_id, (unsigned) txq->queue_id,
+ (unsigned) 1, (unsigned) 1);
+ IXGBE_PCI_REG_WRITE_RELAXED(txq->tdt_reg_addr, 1);
+ txq->tx_tail = 1;
+ return 1;
+}
+
/* Takes an ethdev and a queue and sets up the tx function to be used based on
* the queue parameters. Used in tx_queue_setup by primary process and then
* in dev_init by secondary process when attaching to an existing ethdev.
@@ -2382,7 +2417,7 @@ void __attribute__((cold))
ixgbe_set_tx_function(struct rte_eth_dev *dev, struct ixgbe_tx_queue *txq)
{
/* Use a simple Tx queue (no offloads, no multi segs) if possible */
- if ((txq->offloads == 0) &&
+ if ((txq->offloads & ~(DEV_TX_OFFLOAD_IPV4_CKSUM | DEV_TX_OFFLOAD_UDP_CKSUM | DEV_TX_OFFLOAD_TCP_CKSUM)) == 0 &&
#ifdef RTE_LIBRTE_SECURITY
!(txq->using_ipsec) &&
#endif
@@ -2635,6 +2670,15 @@ ixgbe_dev_tx_queue_setup(struct rte_eth_dev *dev,
dev->data->tx_queues[queue_idx] = txq;
+ uint64_t olflags = PKT_TX_IP_CKSUM | PKT_TX_IPV4 | PKT_TX_TCP_CKSUM;
+ union ixgbe_tx_offload tx_offloads;
+ memset(&tx_offloads, 0, sizeof(tx_offloads));
+ tx_offloads.l2_len = ETHER_HDR_LEN;
+ tx_offloads.l3_len = sizeof(struct ipv4_hdr);
+ tx_offloads.l4_len = sizeof(struct tcp_hdr);
+
+ if (install_txq_ctx(txq, 0, olflags, tx_offloads) != 1)
+ return -EINVAL;
return 0;
}
diff --git a/drivers/net/ixgbe/ixgbe_rxtx.h b/drivers/net/ixgbe/ixgbe_rxtx.h
index 39378f754..f869fcec6 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx.h
@@ -27,14 +27,14 @@
#define IXGBE_MIN_RING_DESC 32
#define IXGBE_MAX_RING_DESC 4096
-#define RTE_PMD_IXGBE_TX_MAX_BURST 32
-#define RTE_PMD_IXGBE_RX_MAX_BURST 32
+#define RTE_PMD_IXGBE_TX_MAX_BURST 64
+#define RTE_PMD_IXGBE_RX_MAX_BURST 64
#define RTE_IXGBE_TX_MAX_FREE_BUF_SZ 64
#define RTE_IXGBE_DESCS_PER_LOOP 4
#ifdef RTE_IXGBE_INC_VECTOR
-#define RTE_IXGBE_RXQ_REARM_THRESH 32
+#define RTE_IXGBE_RXQ_REARM_THRESH 64
#define RTE_IXGBE_MAX_RX_BURST RTE_IXGBE_RXQ_REARM_THRESH
#endif
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h b/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
index a97c27189..130c6fcad 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_common.h
@@ -94,8 +94,8 @@ ixgbe_tx_free_bufs(struct ixgbe_tx_queue *txq)
* tx_next_dd - (tx_rs_thresh-1)
*/
txep = &txq->sw_ring_v[txq->tx_next_dd - (n - 1)];
- m = rte_pktmbuf_prefree_seg(txep[0].mbuf);
- if (likely(m != NULL)) {
+ if (likely(txep[0].mbuf &&
+ (m = rte_pktmbuf_prefree_seg(txep[0].mbuf)) != NULL)) {
free[0] = m;
nb_free = 1;
for (i = 1; i < n; i++) {
diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
index c9ba48246..05c3130eb 100644
--- a/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
+++ b/drivers/net/ixgbe/ixgbe_rxtx_vec_sse.c
@@ -618,7 +618,20 @@ static inline void
vtx1(volatile union ixgbe_adv_tx_desc *txdp,
struct rte_mbuf *pkt, uint64_t flags)
{
- __m128i descriptor = _mm_set_epi64x((uint64_t)pkt->pkt_len << 46 |
+ /* Set Packet Length */
+ uint64_t top_flags = (uint64_t)pkt->pkt_len << 46;
+
+ /* Set IXGBE_TXD_POPTS_IXSM */
+ top_flags |= (pkt->ol_flags & PKT_TX_IP_CKSUM) >> 14;
+ RTE_BUILD_BUG_ON(
+ PKT_TX_IP_CKSUM >> 14 != (uint64_t)IXGBE_TXD_POPTS_IXSM << 40);
+
+ /* Set IXGBE_TXD_POPTS_TXSM */
+ top_flags |= (pkt->ol_flags & PKT_TX_TCP_CKSUM) >> 11;
+ RTE_BUILD_BUG_ON(
+ PKT_TX_TCP_CKSUM >> 11 != (uint64_t)IXGBE_TXD_POPTS_TXSM << 40);
+
+ __m128i descriptor = _mm_set_epi64x(top_flags |
flags | pkt->data_len,
pkt->buf_iova + pkt->data_off);
_mm_store_si128((__m128i *)&txdp->read, descriptor);
--
2.17.1