From: Yong Wang <yongwang@vmware.com>
To: Stephen Hemminger <stephen@networkplumber.org>
Cc: "dev@dpdk.org" <dev@dpdk.org>, Stephen Hemminger <shemming@brocade.com>
Subject: Re: [dpdk-dev] [PATCH v3 07/10] vmxnet3: support jumbo frames
Date: Mon, 9 Mar 2015 23:28:39 +0000 [thread overview]
Message-ID: <D1237604.39F07%yongwang@vmware.com> (raw)
In-Reply-To: <1425600635-20628-8-git-send-email-stephen@networkplumber.org>
On 3/5/15, 4:10 PM, "Stephen Hemminger" <stephen@networkplumber.org> wrote:
>From: Stephen Hemminger <shemming@brocade.com>
>
>Add support for linking multi-segment buffers together to
>handle Jumbo packets.
>
>Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
>---
> lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c | 3 +-
> lib/librte_pmd_vmxnet3/vmxnet3_ring.h | 2 +
> lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c | 76
>++++++++++++++++++++-------------
> 3 files changed, 50 insertions(+), 31 deletions(-)
>
>diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
>b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
>index 35bb561..4f1bc4f 100644
>--- a/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
>+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ethdev.c
>@@ -401,6 +401,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
> {
> struct rte_eth_conf port_conf = dev->data->dev_conf;
> struct vmxnet3_hw *hw = dev->data->dev_private;
>+ uint32_t mtu = dev->data->mtu;
> Vmxnet3_DriverShared *shared = hw->shared;
> Vmxnet3_DSDevRead *devRead = &shared->devRead;
> uint32_t *mac_ptr;
>@@ -418,7 +419,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
> devRead->misc.driverInfo.vmxnet3RevSpt = 1;
> devRead->misc.driverInfo.uptVerSpt = 1;
>
>- devRead->misc.mtu = rte_le_to_cpu_32(dev->data->mtu);
>+ devRead->misc.mtu = rte_le_to_cpu_32(mtu);
I didn’t see where mtu is used to calculate how many rx descriptors will
be needed for each packet. Furthermore, as pointed out by the following
code comments, the device requires the first rx buffer of a packet be of
type VMXNET3_RXD_BTYPE_HEAD with the remaining buffers of type
VMXNET3_RXD_BTYPE_NODY. This needs to be taken care of when populating rx
rings in vmxnet3_post_rx_bufs(). Currently we don’t do this because no
scatter-rx is supported and only one descriptor is needed for a packet
(thus all types should be HEAD). Otherwise, the device will complain with
error returned. For the 2nd rx ring, type needs to be BODY for all
descriptors still.
Related to this, could you share what tests have been done to cover these
new features?
static int
vmxnet3_post_rx_bufs(vmxnet3_rx_queue_t *rxq, uint8_t ring_id)
{
int err = 0;
uint32_t i = 0, val = 0;
struct vmxnet3_cmd_ring *ring = &rxq->cmd_ring[ring_id];
if (ring_id == 0) {
/* Usually: One HEAD type buf per packet
* val = (ring->next2fill % rxq->hw->bufs_per_pkt) ?
* VMXNET3_RXD_BTYPE_BODY : VMXNET3_RXD_BTYPE_HEAD;
*/
/* We use single packet buffer so all heads here */
val = VMXNET3_RXD_BTYPE_HEAD;
} else {
/* All BODY type buffers for 2nd ring */
val = VMXNET3_RXD_BTYPE_BODY;
}
> devRead->misc.queueDescPA = hw->queueDescPA;
> devRead->misc.queueDescLen = hw->queue_desc_len;
> devRead->misc.numTxQueues = hw->num_tx_queues;
>diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_ring.h
>b/lib/librte_pmd_vmxnet3/vmxnet3_ring.h
>index 612487e..55ceadf 100644
>--- a/lib/librte_pmd_vmxnet3/vmxnet3_ring.h
>+++ b/lib/librte_pmd_vmxnet3/vmxnet3_ring.h
>@@ -171,6 +171,8 @@ typedef struct vmxnet3_rx_queue {
> uint32_t qid1;
> uint32_t qid2;
> Vmxnet3_RxQueueDesc *shared;
>+ struct rte_mbuf *start_seg;
>+ struct rte_mbuf *last_seg;
> struct vmxnet3_rxq_stats stats;
> bool stopped;
> uint16_t queue_id; /**< Device RX queue index.
>*/
>diff --git a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
>b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
>index ba48a12..5cf187a 100644
>--- a/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
>+++ b/lib/librte_pmd_vmxnet3/vmxnet3_rxtx.c
>@@ -571,7 +571,6 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf
>**rx_pkts, uint16_t nb_pkts)
> vmxnet3_rx_queue_t *rxq;
> Vmxnet3_RxCompDesc *rcd;
> vmxnet3_buf_info_t *rbi;
>- Vmxnet3_RxDesc *rxd;
> struct rte_mbuf *rxm = NULL;
> struct vmxnet3_hw *hw;
>
>@@ -596,42 +595,18 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf
>**rx_pkts, uint16_t nb_pkts)
>
> idx = rcd->rxdIdx;
> ring_idx = (uint8_t)((rcd->rqID == rxq->qid1) ? 0 : 1);
>- rxd = (Vmxnet3_RxDesc *)rxq->cmd_ring[ring_idx].base + idx;
> rbi = rxq->cmd_ring[ring_idx].buf_info + idx;
>
>- if (unlikely(rcd->sop != 1 || rcd->eop != 1)) {
>- rte_pktmbuf_free_seg(rbi->m);
>- PMD_RX_LOG(DEBUG, "Packet spread across multiple buffers\n)");
>- goto rcd_done;
>- }
>
> PMD_RX_LOG(DEBUG, "rxd idx: %d ring idx: %d.", idx, ring_idx);
>
> #ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER
>+ Vmxnet3_RxDesc *rxd
>+ = (Vmxnet3_RxDesc *)rxq->cmd_ring[ring_idx].base + idx;
> VMXNET3_ASSERT(rcd->len <= rxd->len);
> VMXNET3_ASSERT(rbi->m);
> #endif
>- if (unlikely(rcd->len == 0)) {
>- PMD_RX_LOG(DEBUG, "Rx buf was skipped. rxring[%d][%d]\n)",
>- ring_idx, idx);
>-#ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER
>- VMXNET3_ASSERT(rcd->sop && rcd->eop);
>-#endif
>- rte_pktmbuf_free_seg(rbi->m);
>- goto rcd_done;
>- }
>
>- /* Assuming a packet is coming in a single packet buffer */
>- if (unlikely(rxd->btype != VMXNET3_RXD_BTYPE_HEAD)) {
>- PMD_RX_LOG(DEBUG,
>- "Alert : Misbehaving device, incorrect "
>- " buffer type used. iPacket dropped.");
>- rte_pktmbuf_free_seg(rbi->m);
>- goto rcd_done;
>- }
>-#ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER
>- VMXNET3_ASSERT(rxd->btype == VMXNET3_RXD_BTYPE_HEAD);
>-#endif
> /* Get the packet buffer pointer from buf_info */
> rxm = rbi->m;
>
>@@ -643,7 +618,7 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf
>**rx_pkts, uint16_t nb_pkts)
> rxq->cmd_ring[ring_idx].next2comp = idx;
>
> /* For RCD with EOP set, check if there is frame error */
>- if (unlikely(rcd->err)) {
>+ if (unlikely(rcd->eop && rcd->err)) {
> rxq->stats.drop_total++;
> rxq->stats.drop_err++;
>
>@@ -669,9 +644,49 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf
>**rx_pkts, uint16_t nb_pkts)
> rxm->ol_flags = 0;
> rxm->vlan_tci = 0;
>
>- vmxnet3_rx_offload(rcd, rxm);
>+ /*
>+ * If this is the first buffer of the received packet,
>+ * set the pointer to the first mbuf of the packet
>+ * Otherwise, update the total length and the number of segments
>+ * of the current scattered packet, and update the pointer to
>+ * the last mbuf of the current packet.
>+ */
>+ if (rcd->sop) {
>+#ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER
>+ VMXNET3_ASSERT(!rxq->start_seg);
>+ VMXNET3_ASSERT(rxd->btype == VMXNET3_RXD_BTYPE_HEAD);
>+#endif
>+
>+ if (unlikely(rcd->len == 0)) {
>+ PMD_RX_LOG(DEBUG,
>+ "Rx buf was skipped. rxring[%d][%d])",
>+ ring_idx, idx);
>+ rte_pktmbuf_free_seg(rbi->m);
>+ goto rcd_done;
>+ }
>+
>+ rxq->start_seg = rxm;
>+ vmxnet3_rx_offload(rcd, rxm);
>+ } else {
>+ struct rte_mbuf *start = rxq->start_seg;
>+
>+#ifdef RTE_LIBRTE_VMXNET3_DEBUG_DRIVER
>+ VMXNET3_ASSERT(rxd->btype == VMXNET3_RXD_BTYPE_BODY);
>+ VMXNET3_ASSERT(start != NULL);
>+#endif
>+
>+ start->pkt_len += rxm->data_len;
>+ start->nb_segs++;
>+
>+ rxq->last_seg->next = rxm;
>+ }
>+ rxq->last_seg = rxm;
>+
>+ if (rcd->eop) {
>+ rx_pkts[nb_rx++] = rxq->start_seg;
>+ rxq->start_seg = NULL;
>+ }
>
>- rx_pkts[nb_rx++] = rxm;
> rcd_done:
> rxq->cmd_ring[ring_idx].next2comp = idx;
> VMXNET3_INC_RING_IDX_ONLY(rxq->cmd_ring[ring_idx].next2comp,
>rxq->cmd_ring[ring_idx].size);
>@@ -975,6 +990,7 @@ vmxnet3_dev_rxtx_init(struct rte_eth_dev *dev)
> }
> }
> rxq->stopped = FALSE;
>+ rxq->start_seg = NULL;
> }
>
> for (i = 0; i < dev->data->nb_tx_queues; i++) {
>--
>2.1.4
>
next prev parent reply other threads:[~2015-03-09 23:28 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-06 0:10 [dpdk-dev] [PATCH v3 00/10] vmxnet3: multisegment and bugfixes Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 01/10] vmxnet3: fix link state handling Stephen Hemminger
2015-03-06 17:21 ` Sanford, Robert
[not found] ` <0efb310c0ee54f9192eae95f6ee909e0@BRMWP-EXMB11.corp.brocade.com>
2015-03-08 17:45 ` Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 02/10] vmxnet3: enable VLAN filtering Stephen Hemminger
2015-03-06 21:54 ` Yong Wang
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 03/10] vmxnet3: remove mtu check Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 04/10] vmxnet3: cleanup txq stats Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 05/10] vmxnet3: add support for multi-segment transmit Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 06/10] vmxnet3: support RSS and refactor offload Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 07/10] vmxnet3: support jumbo frames Stephen Hemminger
2015-03-09 23:28 ` Yong Wang [this message]
2015-03-09 23:32 ` Yong Wang
2015-03-10 18:35 ` Stephen Hemminger
2015-03-11 1:03 ` Yong Wang
[not found] ` <4ebc1312d5cb42d583fb8a204c353feb@BRMWP-EXMB11.corp.brocade.com>
2015-03-11 6:54 ` Stephen Hemminger
[not found] ` <9bc742bd1778468a815da8070b584ee7@BRMWP-EXMB11.corp.brocade.com>
2015-03-10 4:18 ` Stephen Hemminger
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 08/10] vmxnet3: get rid of DEBUG ifdefs Stephen Hemminger
2015-03-06 21:59 ` Yong Wang
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 09/10] vmxnet3: add check for jumbo segment Stephen Hemminger
2015-03-06 23:48 ` Yong Wang
2015-03-06 0:10 ` [dpdk-dev] [PATCH v3 10/10] vmxnet3: remove excess inlining Stephen Hemminger
2015-03-06 23:54 ` Yong Wang
2015-03-07 2:00 ` Stephen Hemminger
2015-03-10 13:42 ` [dpdk-dev] [PATCH v3 00/10] vmxnet3: multisegment and bugfixes Thomas Monjalon
2015-06-22 12:22 ` Thomas Monjalon
2015-07-08 23:21 ` Thomas Monjalon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=D1237604.39F07%yongwang@vmware.com \
--to=yongwang@vmware.com \
--cc=dev@dpdk.org \
--cc=shemming@brocade.com \
--cc=stephen@networkplumber.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).