[dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from vector driver
Hi Jianbo > -Original Message- > From: Jianbo Liu [mailto:jianbo.liu at linaro.org] > Sent: Thursday, October 13, 2016 11:00 AM > To: Zhang, Qi Z > Cc: Zhang, Helin ; Wu, Jingjing > ; jerin.jacob at caviumnetworks.com; dev at dpdk.org > Subject: Re: [dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from > vector driver > > On 12 October 2016 at 10:55, Zhang, Qi Z wrote: > > Hi Jianbo > > > >> -Original Message- > >> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jianbo Liu > >> Sent: Wednesday, August 24, 2016 5:54 PM > >> To: Zhang, Helin ; Wu, Jingjing > >> ; jerin.jacob at caviumnetworks.com; > dev at dpdk.org > >> Cc: Jianbo Liu > >> Subject: [dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code > >> from vector driver > >> > >> move scalar code which does not use x86 intrinsic functions to new > >> file "i40e_rxtx_vec_common.h", while keeping x86 code in > i40e_rxtx_vec.c. > >> This allows the scalar code to to be shared among vector drivers for > >> different platforms. > >> > >> Signed-off-by: Jianbo Liu > >> --- > ... > > > > Should we rename the function "_40e_rx_queue_release_mbufs_vec" to > > "i40e_rx_queue_release_mbufs_vec_default", so functions be wrapped > can follow a consistent rule? > > I think these two ways are different. > For func/_func, _func implements what func needs to do, they are same. > We needs _func inline, to be called in different ARCHs. > But for func/func_default, func_default is the default behavior, but you can > use or not-use it in func. Got your point, I also saw ixgbe is implemented in the same way. Thanks! Qi
[dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from vector driver
On 12 October 2016 at 10:55, Zhang, Qi Z wrote: > Hi Jianbo > >> -Original Message- >> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jianbo Liu >> Sent: Wednesday, August 24, 2016 5:54 PM >> To: Zhang, Helin ; Wu, Jingjing >> ; jerin.jacob at caviumnetworks.com; dev at >> dpdk.org >> Cc: Jianbo Liu >> Subject: [dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from >> vector >> driver >> >> move scalar code which does not use x86 intrinsic functions to new file >> "i40e_rxtx_vec_common.h", while keeping x86 code in i40e_rxtx_vec.c. >> This allows the scalar code to to be shared among vector drivers for >> different >> platforms. >> >> Signed-off-by: Jianbo Liu >> --- ... > > Should we rename the function "_40e_rx_queue_release_mbufs_vec" to > "i40e_rx_queue_release_mbufs_vec_default", so functions be wrapped can follow > a consistent rule? I think these two ways are different. For func/_func, _func implements what func needs to do, they are same. We needs _func inline, to be called in different ARCHs. But for func/func_default, func_default is the default behavior, but you can use or not-use it in func.
[dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from vector driver
Hi Jianbo > -Original Message- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Jianbo Liu > Sent: Wednesday, August 24, 2016 5:54 PM > To: Zhang, Helin ; Wu, Jingjing > ; jerin.jacob at caviumnetworks.com; dev at dpdk.org > Cc: Jianbo Liu > Subject: [dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from > vector > driver > > move scalar code which does not use x86 intrinsic functions to new file > "i40e_rxtx_vec_common.h", while keeping x86 code in i40e_rxtx_vec.c. > This allows the scalar code to to be shared among vector drivers for different > platforms. > > Signed-off-by: Jianbo Liu > --- > drivers/net/i40e/i40e_rxtx_vec.c| 184 +--- > drivers/net/i40e/i40e_rxtx_vec_common.h | 239 > > 2 files changed, 243 insertions(+), 180 deletions(-) create mode 100644 > drivers/net/i40e/i40e_rxtx_vec_common.h > > diff --git a/drivers/net/i40e/i40e_rxtx_vec.c > b/drivers/net/i40e/i40e_rxtx_vec.c > index 51fb282..f847469 100644 > --- a/drivers/net/i40e/i40e_rxtx_vec.c > +++ b/drivers/net/i40e/i40e_rxtx_vec.c > @@ -39,6 +39,7 @@ > #include "base/i40e_type.h" > #include "i40e_ethdev.h" > #include "i40e_rxtx.h" > +#include "i40e_rxtx_vec_common.h" > > #include > > @@ -421,68 +422,6 @@ i40e_recv_pkts_vec(void *rx_queue, struct rte_mbuf > **rx_pkts, > return _recv_raw_pkts_vec(rx_queue, rx_pkts, nb_pkts, NULL); } > > -static inline uint16_t > -reassemble_packets(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_bufs, > -uint16_t nb_bufs, uint8_t *split_flags) > -{ > - struct rte_mbuf *pkts[RTE_I40E_VPMD_RX_BURST]; /*finished pkts*/ > - struct rte_mbuf *start = rxq->pkt_first_seg; > - struct rte_mbuf *end = rxq->pkt_last_seg; > - unsigned pkt_idx, buf_idx; > - > - for (buf_idx = 0, pkt_idx = 0; buf_idx < nb_bufs; buf_idx++) { > - if (end != NULL) { > - /* processing a split packet */ > - end->next = rx_bufs[buf_idx]; > - rx_bufs[buf_idx]->data_len += rxq->crc_len; > - > - start->nb_segs++; > - start->pkt_len += rx_bufs[buf_idx]->data_len; > - end = end->next; > - > - if (!split_flags[buf_idx]) { > - /* it's the last packet of the set */ > - start->hash = end->hash; > - start->ol_flags = end->ol_flags; > - /* we need to strip crc for the whole packet */ > - start->pkt_len -= rxq->crc_len; > - if (end->data_len > rxq->crc_len) { > - end->data_len -= rxq->crc_len; > - } else { > - /* free up last mbuf */ > - struct rte_mbuf *secondlast = start; > - > - while (secondlast->next != end) > - secondlast = secondlast->next; > - secondlast->data_len -= (rxq->crc_len - > - end->data_len); > - secondlast->next = NULL; > - rte_pktmbuf_free_seg(end); > - end = secondlast; > - } > - pkts[pkt_idx++] = start; > - start = end = NULL; > - } > - } else { > - /* not processing a split packet */ > - if (!split_flags[buf_idx]) { > - /* not a split packet, save and skip */ > - pkts[pkt_idx++] = rx_bufs[buf_idx]; > - continue; > - } > - end = start = rx_bufs[buf_idx]; > - rx_bufs[buf_idx]->data_len += rxq->crc_len; > - rx_bufs[buf_idx]->pkt_len += rxq->crc_len; > - } > - } > - > - /* save the partial packet for next time */ > - rxq->pkt_first_seg = start; > - rxq->pkt_last_seg = end; > - memcpy(rx_bufs, pkts, pkt_idx * (sizeof(*pkts))); > - return pkt_idx; > -} > - > /* vPMD receive routine that reassembles scattered packets > * Notice: > * - nb_pkts < RTE_I40E_DES
[dpdk-dev] [PATCH 1/5] i40e: extract non-x86 specific code from vector driver
move scalar code which does not use x86 intrinsic functions to new file "i40e_rxtx_vec_common.h", while keeping x86 code in i40e_rxtx_vec.c. This allows the scalar code to to be shared among vector drivers for different platforms. Signed-off-by: Jianbo Liu --- drivers/net/i40e/i40e_rxtx_vec.c| 184 +--- drivers/net/i40e/i40e_rxtx_vec_common.h | 239 2 files changed, 243 insertions(+), 180 deletions(-) create mode 100644 drivers/net/i40e/i40e_rxtx_vec_common.h diff --git a/drivers/net/i40e/i40e_rxtx_vec.c b/drivers/net/i40e/i40e_rxtx_vec.c index 51fb282..f847469 100644 --- a/drivers/net/i40e/i40e_rxtx_vec.c +++ b/drivers/net/i40e/i40e_rxtx_vec.c @@ -39,6 +39,7 @@ #include "base/i40e_type.h" #include "i40e_ethdev.h" #include "i40e_rxtx.h" +#include "i40e_rxtx_vec_common.h" #include @@ -421,68 +422,6 @@ i40e_recv_pkts_vec(void *rx_queue, struct rte_mbuf **rx_pkts, return _recv_raw_pkts_vec(rx_queue, rx_pkts, nb_pkts, NULL); } -static inline uint16_t -reassemble_packets(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_bufs, - uint16_t nb_bufs, uint8_t *split_flags) -{ - struct rte_mbuf *pkts[RTE_I40E_VPMD_RX_BURST]; /*finished pkts*/ - struct rte_mbuf *start = rxq->pkt_first_seg; - struct rte_mbuf *end = rxq->pkt_last_seg; - unsigned pkt_idx, buf_idx; - - for (buf_idx = 0, pkt_idx = 0; buf_idx < nb_bufs; buf_idx++) { - if (end != NULL) { - /* processing a split packet */ - end->next = rx_bufs[buf_idx]; - rx_bufs[buf_idx]->data_len += rxq->crc_len; - - start->nb_segs++; - start->pkt_len += rx_bufs[buf_idx]->data_len; - end = end->next; - - if (!split_flags[buf_idx]) { - /* it's the last packet of the set */ - start->hash = end->hash; - start->ol_flags = end->ol_flags; - /* we need to strip crc for the whole packet */ - start->pkt_len -= rxq->crc_len; - if (end->data_len > rxq->crc_len) { - end->data_len -= rxq->crc_len; - } else { - /* free up last mbuf */ - struct rte_mbuf *secondlast = start; - - while (secondlast->next != end) - secondlast = secondlast->next; - secondlast->data_len -= (rxq->crc_len - - end->data_len); - secondlast->next = NULL; - rte_pktmbuf_free_seg(end); - end = secondlast; - } - pkts[pkt_idx++] = start; - start = end = NULL; - } - } else { - /* not processing a split packet */ - if (!split_flags[buf_idx]) { - /* not a split packet, save and skip */ - pkts[pkt_idx++] = rx_bufs[buf_idx]; - continue; - } - end = start = rx_bufs[buf_idx]; - rx_bufs[buf_idx]->data_len += rxq->crc_len; - rx_bufs[buf_idx]->pkt_len += rxq->crc_len; - } - } - - /* save the partial packet for next time */ - rxq->pkt_first_seg = start; - rxq->pkt_last_seg = end; - memcpy(rx_bufs, pkts, pkt_idx * (sizeof(*pkts))); - return pkt_idx; -} - /* vPMD receive routine that reassembles scattered packets * Notice: * - nb_pkts < RTE_I40E_DESCS_PER_LOOP, just return no packet @@ -548,73 +487,6 @@ vtx(volatile struct i40e_tx_desc *txdp, vtx1(txdp, *pkt, flags); } -static inline int __attribute__((always_inline)) -i40e_tx_free_bufs(struct i40e_tx_queue *txq) -{ - struct i40e_tx_entry *txep; - uint32_t n; - uint32_t i; - int nb_free = 0; - struct rte_mbuf *m, *free[RTE_I40E_TX_MAX_FREE_BUF_SZ]; - - /* check DD bits on threshold descriptor */ - if ((txq->tx_ring[txq->tx_next_dd].cmd_type_offset_bsz & - rte_cpu_to_le_64(I40E_TXD_QW1_DTYPE_MASK)) != - rte_cpu_to_le_64(I40E_TX_DESC_DTYPE_DESC_DONE)) - return 0; - - n = txq->tx_rs_thresh; - -/* first buffer to free from S/W ring is at index - * tx_next_dd - (tx_rs_thresh-1) - */ - txep = >sw_ring[txq->tx_next_dd - (n - 1)]; - m =