DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev]  [PATCH 0/7] vmxnet3: upgrade to version 3
@ 2017-02-25 21:59 Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 1/7] vmxnet3: prepare for version 3 changes Shrikrishna Khare
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

vmxnet3 emulation has recently added several new features which includes
support for new commands the driver can issue to emulation, change in
descriptor fields etc. This patch series extends the vmxnet3 driver to
leverage these new features.

Compatibility is maintained using existing vmxnet3 versioning mechanism as
follows:
 - new features added to vmxnet3 emulation are associated with new vmxnet3
   version viz. vmxnet3 version 3.
 - emulation advertises all the versions it supports to the driver.
 - during initialization, vmxnet3 driver picks the highest version number
 supported by both the emulation and the driver and configures emulation
 to run at that version.

In particular, following changes are introduced:

Patch 1:
  Trivial cleanup in preparation of version 3 changes.

Patch 2:
  This patch introduces generalized command interface which allows
  for easily adding new commands that vmxnet3 driver can issue to the
  emulation. Further patches in this series make use of this facility.

Patch 3:
  Transmit data ring buffer is used to copy packet headers or small
  packets. It is a fixed size buffer. This patch extends the driver to
  allow variable sized transmit data ring buffer.

Patch 4:
  This patch introduces receive data ring buffer - a set of small sized
  buffers that are always mapped by the emulation. This avoids memory
  mapping/unmapping overhead for small packets.

Patch 5:
  This patch adds reserved commands.

Patch 6:
  In vmxnet3 version 3, the emulation added support for the vmxnet3 driver
  to communicate information about the memory regions the driver will use
  for rx/tx buffers. This patch exposes related commands to the driver. The
  driver is also extended to make use of this feaeture.

Patch 7:
  With all vmxnet3 version 3 changes incorporated in the vmxnet3 driver,
  with this patch, the driver can configure emulation to run at vmxnet3
  version 3.

Shrikrishna Khare (7):
  vmxnet3: prepare for version 3 changes
  vmxnet3: introduce generalized command interface to configure the
    device
  vmxnet3: allow variable length transmit data ring buffer
  vmxnet3: add receive data ring support
  vmxnet3: add reserved version 3 command
  vmxnet3: introduce command to register memory region
  vmxnet3: update to version 3

 drivers/net/vmxnet3/base/vmxnet3_defs.h |  85 ++++++++++++++++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c    | 154 +++++++++++++++++++++++++++++++-
 drivers/net/vmxnet3/vmxnet3_ethdev.h    |  14 +++
 drivers/net/vmxnet3/vmxnet3_ring.h      |  21 +++++
 drivers/net/vmxnet3/vmxnet3_rxtx.c      |  45 ++++++++--
 5 files changed, 304 insertions(+), 15 deletions(-)

-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev]  [PATCH 1/7] vmxnet3: prepare for version 3 changes
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 2/7] vmxnet3: introduce generalized command interface to configure the device Shrikrishna Khare
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

Cleanup some code in preparation of vmxnet3 version 3 changes.

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/vmxnet3_ethdev.c | 17 +++++++++++++----
 drivers/net/vmxnet3/vmxnet3_ethdev.h |  9 +++++++++
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index b7b5377..09f2085 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -265,13 +265,22 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
 	/* Check h/w version compatibility with driver. */
 	ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_VRRS);
 	PMD_INIT_LOG(DEBUG, "Hardware version : %d", ver);
-	if (ver & 0x1)
-		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS, 1);
-	else {
-		PMD_INIT_LOG(ERR, "Incompatible h/w version, should be 0x1");
+
+	if (ver & (1 << VMXNET3_REV_2)) {
+		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
+				       1 << VMXNET3_REV_2);
+		hw->version = VMXNET3_REV_2 + 1;
+	} else if (ver & (1 << VMXNET3_REV_1)) {
+		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
+				       1 << VMXNET3_REV_1);
+		hw->version = VMXNET3_REV_1 + 1;
+	} else {
+		PMD_INIT_LOG(ERR, "Incompatible hardware version: %d", ver);
 		return -EIO;
 	}
 
+	PMD_INIT_LOG(DEBUG, "Using device version %d\n", hw->version);
+
 	/* Check UPT version compatibility with driver. */
 	ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_UVRS);
 	PMD_INIT_LOG(DEBUG, "UPT hardware version : %d", ver);
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 348c840..516c407 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -101,6 +101,8 @@ struct vmxnet3_hw {
 	uint8_t num_rx_queues;
 	uint8_t bufs_per_pkt;
 
+	uint8_t	version;
+
 	Vmxnet3_TxQueueDesc   *tqd_start;	/* start address of all tx queue desc */
 	Vmxnet3_RxQueueDesc   *rqd_start;	/* start address of all rx queue desc */
 
@@ -117,6 +119,13 @@ struct vmxnet3_hw {
 #define VMXNET3_VFT_TABLE_SIZE     (VMXNET3_VFT_SIZE * sizeof(uint32_t))
 };
 
+#define VMXNET3_REV_3		2		/* Vmxnet3 Rev. 3 */
+#define VMXNET3_REV_2		1		/* Vmxnet3 Rev. 2 */
+#define VMXNET3_REV_1		0		/* Vmxnet3 Rev. 1 */
+
+#define VMXNET3_VERSION_GE_3(hw) (hw->version >= VMXNET3_REV_3 + 1)
+#define VMXNET3_VERSION_GE_2(hw) (hw->version >= VMXNET3_REV_2 + 1)
+
 #define VMXNET3_GET_ADDR_LO(reg)   ((uint32_t)(reg))
 #define VMXNET3_GET_ADDR_HI(reg)   ((uint32_t)(((uint64_t)(reg)) >> 32))
 
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 2/7] vmxnet3: introduce generalized command interface to configure the device
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 1/7] vmxnet3: prepare for version 3 changes Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 3/7] vmxnet3: allow variable length transmit data ring buffer Shrikrishna Khare
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

Shared memory is used to exchange information between the vmxnet3 driver
and the emulation. In order to request emulation to perform a task, the
driver first populates specific fields in this shared memory and then
issues corresponding command by writing to the command register(CMD). The
layout of the shared memory was defined by vmxnet3 version 1 and cannot
be extended for every new command without breaking backward compatibility.

To address this problem, in vmxnet3 version 3, the emulation repurposed
a reserved field in the shared memory to represent command information
instead. For new commands, the driver first populates the command
information field in the shared memory and then issues the command. The
emulation interprets the data written to the command information depending
on the type of the command. This patch exposes this capability to the driver.

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 32 +++++++++++++++++++++++++++++++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 68ae8b6..7484b84 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -109,6 +109,7 @@ typedef enum {
    VMXNET3_CMD_STOP_EMULATION,
    VMXNET3_CMD_LOAD_PLUGIN,
    VMXNET3_CMD_ACTIVATE_VF,
+   VMXNET3_CMD_RESERVED3,
 
    VMXNET3_CMD_FIRST_GET = 0xF00D0000,
    VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
@@ -695,12 +696,41 @@ Vmxnet3_RxQueueDesc;
 
 typedef
 #include "vmware_pack_begin.h"
+struct Vmxnet3_SetPolling {
+   uint8 enablePolling;
+}
+#include "vmware_pack_end.h"
+Vmxnet3_SetPolling;
+
+/*
+ * If the command data <= 16 bytes, use the shared memory direcly.
+ * Otherwise, use the variable length configuration descriptor.
+ */
+typedef
+#include "vmware_pack_begin.h"
+union Vmxnet3_CmdInfo {
+   Vmxnet3_VariableLenConfDesc varConf;
+   Vmxnet3_SetPolling          setPolling;
+   __le64                      data[2];
+}
+#include "vmware_pack_end.h"
+Vmxnet3_CmdInfo;
+
+typedef
+#include "vmware_pack_begin.h"
 struct Vmxnet3_DriverShared {
    __le32               magic;
    __le32               pad; /* make devRead start at 64-bit boundaries */
    Vmxnet3_DSDevRead    devRead;
    __le32               ecr;
-   __le32               reserved[5];
+   __le32               reserved;
+
+   union {
+      __le32            reserved1[4];
+      Vmxnet3_CmdInfo   cmdInfo; /* only valid in the context of executing the
+				  * relevant command
+				  */
+   } cu;
 }
 #include "vmware_pack_end.h"
 Vmxnet3_DriverShared;
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 3/7] vmxnet3: allow variable length transmit data ring buffer
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 1/7] vmxnet3: prepare for version 3 changes Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 2/7] vmxnet3: introduce generalized command interface to configure the device Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 4/7] vmxnet3: add receive data ring support Shrikrishna Khare
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

vmxnet3 driver supports transmit data ring viz. a set of fixed size
buffers used by the driver to copy packet headers. Small packets that
fit these buffers are copied into these buffers entirely.

Currently this buffer size of fixed at 128 bytes. This patch extends
transmit data ring implementation to allow variable length transmit
data ring buffers. The length of the buffer is read from the emulation
during initialization.

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 14 ++++++++++++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c    | 22 ++++++++++++++++++++++
 drivers/net/vmxnet3/vmxnet3_ethdev.h    |  2 ++
 drivers/net/vmxnet3/vmxnet3_ring.h      |  1 +
 drivers/net/vmxnet3/vmxnet3_rxtx.c      | 14 +++++++++-----
 5 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 7484b84..e201808 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -121,7 +121,8 @@ typedef enum {
    VMXNET3_CMD_GET_DID_HI,
    VMXNET3_CMD_GET_DEV_EXTRA_INFO,
    VMXNET3_CMD_GET_CONF_INTR,
-   VMXNET3_CMD_GET_ADAPTIVE_RING_INFO
+   VMXNET3_CMD_GET_ADAPTIVE_RING_INFO,
+   VMXNET3_CMD_GET_TXDATA_DESC_SIZE
 } Vmxnet3_Cmd;
 
 /* Adaptive Ring Info Flags */
@@ -403,12 +404,19 @@ typedef union Vmxnet3_GenericDesc {
 #define VMXNET3_RING_SIZE_ALIGN 32
 #define VMXNET3_RING_SIZE_MASK  (VMXNET3_RING_SIZE_ALIGN - 1)
 
+/* Tx Data Ring buffer size must be a multiple of 64 */
+#define VMXNET3_TXDATA_DESC_SIZE_ALIGN 64
+#define VMXNET3_TXDATA_DESC_SIZE_MASK  (VMXNET3_TXDATA_DESC_SIZE_ALIGN - 1)
+
 /* Max ring size */
 #define VMXNET3_TX_RING_MAX_SIZE   4096
 #define VMXNET3_TC_RING_MAX_SIZE   4096
 #define VMXNET3_RX_RING_MAX_SIZE   4096
 #define VMXNET3_RC_RING_MAX_SIZE   8192
 
+#define VMXNET3_TXDATA_DESC_MIN_SIZE 128
+#define VMXNET3_TXDATA_DESC_MAX_SIZE 2048
+
 /* a list of reasons for queue stop */
 
 #define VMXNET3_ERR_NOEOP        0x80000000  /* cannot find the EOP desc of a pkt */
@@ -508,7 +516,9 @@ struct Vmxnet3_TxQueueConf {
    __le32    compRingSize; /* # of comp desc */
    __le32    ddLen;        /* size of driver data */
    uint8     intrIdx;
-   uint8     _pad[7];
+   uint8     _pad[1];
+   __le16    txDataRingDescSize;
+   uint8     _pad2[4];
 }
 #include "vmware_pack_end.h"
 Vmxnet3_TxQueueConf;
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 09f2085..05b0864 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -225,6 +225,24 @@ vmxnet3_disable_intr(struct vmxnet3_hw *hw)
 }
 
 /*
+ * Gets tx data ring descriptor size.
+ */
+static uint16_t
+eth_vmxnet3_txdata_get(struct vmxnet3_hw *hw)
+{
+	uint16 txdata_desc_size;
+
+	VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
+			       VMXNET3_CMD_GET_TXDATA_DESC_SIZE);
+	txdata_desc_size = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_CMD);
+
+	return (txdata_desc_size < VMXNET3_TXDATA_DESC_MIN_SIZE ||
+		txdata_desc_size > VMXNET3_TXDATA_DESC_MAX_SIZE ||
+		txdata_desc_size & VMXNET3_TXDATA_DESC_SIZE_MASK) ?
+		sizeof(struct Vmxnet3_TxDataDesc) : txdata_desc_size;
+}
+
+/*
  * It returns 0 on success.
  */
 static int
@@ -320,6 +338,9 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
 	/* allow untagged pkts */
 	VMXNET3_SET_VFTABLE_ENTRY(hw->shadow_vfta, 0);
 
+	hw->txdata_desc_size = VMXNET3_VERSION_GE_3(hw) ?
+		eth_vmxnet3_txdata_get(hw) : sizeof(struct Vmxnet3_TxDataDesc);
+
 	return 0;
 }
 
@@ -511,6 +532,7 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
 		tqd->conf.txRingSize   = txq->cmd_ring.size;
 		tqd->conf.compRingSize = txq->comp_ring.size;
 		tqd->conf.dataRingSize = txq->data_ring.size;
+		tqd->conf.txDataRingDescSize = txq->txdata_desc_size;
 		tqd->conf.intrIdx      = txq->comp_ring.intr_idx;
 		tqd->status.stopped    = TRUE;
 		tqd->status.error      = 0;
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 516c407..f8e670d 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -103,6 +103,8 @@ struct vmxnet3_hw {
 
 	uint8_t	version;
 
+	uint16_t txdata_desc_size; /* tx data ring buffer size */
+
 	Vmxnet3_TxQueueDesc   *tqd_start;	/* start address of all tx queue desc */
 	Vmxnet3_RxQueueDesc   *rqd_start;	/* start address of all rx queue desc */
 
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h b/drivers/net/vmxnet3/vmxnet3_ring.h
index b50d2b0..b27290f 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -141,6 +141,7 @@ typedef struct vmxnet3_tx_queue {
 	bool                         stopped;
 	uint16_t                     queue_id;      /**< Device TX queue index. */
 	uint8_t                      port_id;       /**< Device port identifier. */
+	uint16_t		     txdata_desc_size;
 } vmxnet3_tx_queue_t;
 
 struct vmxnet3_rxq_stats {
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index b246884..920ea0e 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -244,7 +244,7 @@ vmxnet3_dev_tx_queue_reset(void *txq)
 
 	size = sizeof(struct Vmxnet3_TxDesc) * ring->size;
 	size += sizeof(struct Vmxnet3_TxCompDesc) * comp_ring->size;
-	size += sizeof(struct Vmxnet3_TxDataDesc) * data_ring->size;
+	size += tq->txdata_desc_size * data_ring->size;
 
 	memset(ring->base, 0, size);
 }
@@ -471,10 +471,13 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 		}
 
 		if (txm->nb_segs == 1 &&
-		    rte_pktmbuf_pkt_len(txm) <= VMXNET3_HDR_COPY_SIZE) {
+		    rte_pktmbuf_pkt_len(txm) <= txq->txdata_desc_size) {
 			struct Vmxnet3_TxDataDesc *tdd;
 
-			tdd = txq->data_ring.base + txq->cmd_ring.next2fill;
+			tdd = (struct Vmxnet3_TxDataDesc *)
+				((uint8 *)txq->data_ring.base +
+				 txq->cmd_ring.next2fill *
+				 txq->txdata_desc_size);
 			copy_size = rte_pktmbuf_pkt_len(txm);
 			rte_memcpy(tdd->data, rte_pktmbuf_mtod(txm, char *), copy_size);
 		}
@@ -494,7 +497,7 @@ vmxnet3_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
 			if (copy_size)
 				gdesc->txd.addr = rte_cpu_to_le_64(txq->data_ring.basePA +
 								   txq->cmd_ring.next2fill *
-								   sizeof(struct Vmxnet3_TxDataDesc));
+								   txq->txdata_desc_size);
 			else
 				gdesc->txd.addr = rte_mbuf_data_dma_addr(m_seg);
 
@@ -932,6 +935,7 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
 	txq->hw = hw;
 	txq->qid = queue_idx;
 	txq->stopped = TRUE;
+	txq->txdata_desc_size = hw->txdata_desc_size;
 
 	ring = &txq->cmd_ring;
 	comp_ring = &txq->comp_ring;
@@ -961,7 +965,7 @@ vmxnet3_dev_tx_queue_setup(struct rte_eth_dev *dev,
 
 	size = sizeof(struct Vmxnet3_TxDesc) * ring->size;
 	size += sizeof(struct Vmxnet3_TxCompDesc) * comp_ring->size;
-	size += sizeof(struct Vmxnet3_TxDataDesc) * data_ring->size;
+	size += txq->txdata_desc_size * data_ring->size;
 
 	mz = ring_dma_zone_reserve(dev, "txdesc", queue_idx, size, socket_id);
 	if (mz == NULL) {
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev]  [PATCH 4/7] vmxnet3: add receive data ring support
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
                   ` (2 preceding siblings ...)
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 3/7] vmxnet3: allow variable length transmit data ring buffer Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 5/7] vmxnet3: add reserved version 3 command Shrikrishna Khare
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

vmxnet3 driver preallocates buffers for receiving packets and posts the
buffers to the emulation. In order to deliver a received packet to the
guest, the emulation must map buffer(s) and copy the packet into it.

To avoid this memory mapping overhead, this patch introduces the receive
data ring - a set of small sized buffers that are always mapped by
the emulation. If a packet fits into the receive data ring buffer, the
emulation delivers the packet via the receive data ring (which must be
copied by the guest driver), or else the usual receive path is used.

Receive Data Ring buffer length is configurable via ethtool -G ethX rx-mini

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 12 ++++++++++--
 drivers/net/vmxnet3/vmxnet3_ethdev.c    |  9 +++++++++
 drivers/net/vmxnet3/vmxnet3_ethdev.h    |  1 +
 drivers/net/vmxnet3/vmxnet3_ring.h      | 20 ++++++++++++++++++++
 drivers/net/vmxnet3/vmxnet3_rxtx.c      | 31 ++++++++++++++++++++++++++++++-
 5 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index e201808..746d709 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -408,6 +408,10 @@ typedef union Vmxnet3_GenericDesc {
 #define VMXNET3_TXDATA_DESC_SIZE_ALIGN 64
 #define VMXNET3_TXDATA_DESC_SIZE_MASK  (VMXNET3_TXDATA_DESC_SIZE_ALIGN - 1)
 
+/* Rx Data Ring buffer size must be a multiple of 64 */
+#define VMXNET3_RXDATA_DESC_SIZE_ALIGN 64
+#define VMXNET3_RXDATA_DESC_SIZE_MASK  (VMXNET3_RXDATA_DESC_SIZE_ALIGN - 1)
+
 /* Max ring size */
 #define VMXNET3_TX_RING_MAX_SIZE   4096
 #define VMXNET3_TC_RING_MAX_SIZE   4096
@@ -417,6 +421,8 @@ typedef union Vmxnet3_GenericDesc {
 #define VMXNET3_TXDATA_DESC_MIN_SIZE 128
 #define VMXNET3_TXDATA_DESC_MAX_SIZE 2048
 
+#define VMXNET3_RXDATA_DESC_MAX_SIZE 2048
+
 /* a list of reasons for queue stop */
 
 #define VMXNET3_ERR_NOEOP        0x80000000  /* cannot find the EOP desc of a pkt */
@@ -529,12 +535,14 @@ struct Vmxnet3_RxQueueConf {
    __le64    rxRingBasePA[2];
    __le64    compRingBasePA;
    __le64    ddPA;            /* driver data */
-   __le64    reserved;
+   __le64    rxDataRingBasePA;
    __le32    rxRingSize[2];   /* # of rx desc */
    __le32    compRingSize;    /* # of rx comp desc */
    __le32    ddLen;           /* size of driver data */
    uint8     intrIdx;
-   uint8     _pad[7];
+   uint8     _pad1[1];
+   __le16    rxDataRingDescSize;  /* size of rx data ring buffer */
+   uint8     _pad2[4];
 }
 #include "vmware_pack_end.h"
 Vmxnet3_RxQueueConf;
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 05b0864..8591ce1 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -341,6 +341,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
 	hw->txdata_desc_size = VMXNET3_VERSION_GE_3(hw) ?
 		eth_vmxnet3_txdata_get(hw) : sizeof(struct Vmxnet3_TxDataDesc);
 
+	hw->rxdata_desc_size = VMXNET3_VERSION_GE_3(hw) ?
+		VMXNET3_DEF_RXDATA_DESC_SIZE : 0;
+	RTE_ASSERT((hw->rx_data_desc_size & ~VMXNET3_RXDATA_DESC_SIZE_MASK) ==
+		   hw->rx_data_desc_size);
+
 	return 0;
 }
 
@@ -551,6 +556,10 @@ vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
 		rqd->conf.rxRingSize[1]   = rxq->cmd_ring[1].size;
 		rqd->conf.compRingSize    = rxq->comp_ring.size;
 		rqd->conf.intrIdx         = rxq->comp_ring.intr_idx;
+		if (VMXNET3_VERSION_GE_3(hw)) {
+			rqd->conf.rxDataRingBasePA = rxq->data_ring.basePA;
+			rqd->conf.rxDataRingDescSize = rxq->data_desc_size;
+		}
 		rqd->status.stopped       = TRUE;
 		rqd->status.error         = 0;
 		memset(&rqd->stats, 0, sizeof(rqd->stats));
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index f8e670d..1c1afc6 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -104,6 +104,7 @@ struct vmxnet3_hw {
 	uint8_t	version;
 
 	uint16_t txdata_desc_size; /* tx data ring buffer size */
+	uint16_t rxdata_desc_size; /* rx data ring buffer size */
 
 	Vmxnet3_TxQueueDesc   *tqd_start;	/* start address of all tx queue desc */
 	Vmxnet3_RxQueueDesc   *rqd_start;	/* start address of all rx queue desc */
diff --git a/drivers/net/vmxnet3/vmxnet3_ring.h b/drivers/net/vmxnet3/vmxnet3_ring.h
index b27290f..8bc8239 100644
--- a/drivers/net/vmxnet3/vmxnet3_ring.h
+++ b/drivers/net/vmxnet3/vmxnet3_ring.h
@@ -42,6 +42,9 @@
 #define VMXNET3_DEF_TX_RING_SIZE 512
 #define VMXNET3_DEF_RX_RING_SIZE 128
 
+/* Default rx data ring desc size */
+#define VMXNET3_DEF_RXDATA_DESC_SIZE 128
+
 #define VMXNET3_SUCCESS 0
 #define VMXNET3_FAIL   -1
 
@@ -66,6 +69,14 @@ typedef struct vmxnet3_cmd_ring {
 	uint64_t               basePA;
 } vmxnet3_cmd_ring_t;
 
+#define VMXNET3_GET_RING_IDX(hw, rqID)		        \
+	((rqID >= hw->num_rx_queues &&		        \
+	 rqID < 2 * hw->num_rx_queues) ? 1 : 0)		\
+
+#define VMXNET3_RX_DATA_RING(hw, rqID)			\
+	(rqID >= 2 * hw->num_rx_queues &&		\
+	rqID < 3 * hw->num_rx_queues)			\
+
 static inline void
 vmxnet3_cmd_ring_adv_next2fill(struct vmxnet3_cmd_ring *ring)
 {
@@ -151,13 +162,22 @@ struct vmxnet3_rxq_stats {
 	uint64_t                     rx_buf_alloc_failure;
 };
 
+struct vmxnet3_rx_data_ring {
+	uint8_t  *base;
+	uint64_t basePA;
+	uint32_t size;
+};
+
 typedef struct vmxnet3_rx_queue {
 	struct rte_mempool          *mp;
 	struct vmxnet3_hw           *hw;
 	struct vmxnet3_cmd_ring     cmd_ring[VMXNET3_RX_CMDRING_SIZE];
 	struct vmxnet3_comp_ring    comp_ring;
+	struct vmxnet3_rx_data_ring data_ring;
+	uint16_t                    data_desc_size;
 	uint32_t                    qid1;
 	uint32_t                    qid2;
+	uint32_t                    data_ring_qid;    /* rqID in RCD for buffer from data ring */
 	Vmxnet3_RxQueueDesc         *shared;
 	struct rte_mbuf             *start_seg;
 	struct rte_mbuf             *last_seg;
diff --git a/drivers/net/vmxnet3/vmxnet3_rxtx.c b/drivers/net/vmxnet3/vmxnet3_rxtx.c
index 920ea0e..d8a109e 100644
--- a/drivers/net/vmxnet3/vmxnet3_rxtx.c
+++ b/drivers/net/vmxnet3/vmxnet3_rxtx.c
@@ -254,8 +254,10 @@ vmxnet3_dev_rx_queue_reset(void *rxq)
 {
 	int i;
 	vmxnet3_rx_queue_t *rq = rxq;
+	struct vmxnet3_hw *hw = rq->hw;
 	struct vmxnet3_cmd_ring *ring0, *ring1;
 	struct vmxnet3_comp_ring *comp_ring;
+	struct vmxnet3_rx_data_ring *data_ring = &rq->data_ring;
 	int size;
 
 	if (rq != NULL) {
@@ -280,6 +282,9 @@ vmxnet3_dev_rx_queue_reset(void *rxq)
 
 	size = sizeof(struct Vmxnet3_RxDesc) * (ring0->size + ring1->size);
 	size += sizeof(struct Vmxnet3_RxCompDesc) * comp_ring->size;
+	if (VMXNET3_VERSION_GE_3(hw) && rq->data_desc_size) {
+		size += rq->data_desc_size * data_ring->size;
+	}
 
 	memset(ring0->base, 0, size);
 }
@@ -755,7 +760,7 @@ 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);
+		ring_idx = VMXNET3_GET_RING_IDX(hw, rcd->rqID);
 		rxd = (Vmxnet3_RxDesc *)rxq->cmd_ring[ring_idx].base + idx;
 		RTE_SET_USED(rxd); /* used only for assert when enabled */
 		rbi = rxq->cmd_ring[ring_idx].buf_info + idx;
@@ -821,6 +826,15 @@ vmxnet3_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
 				goto rcd_done;
 			}
 
+			if (VMXNET3_RX_DATA_RING(hw, rcd->rqID)) {
+				uint8_t *rdd = rxq->data_ring.base +
+					idx * rxq->data_desc_size;
+
+				RTE_ASSERT(VMXNET3_VERSION_GE_3(hw));
+				rte_memcpy(rte_pktmbuf_mtod(rxm, char *),
+					   rdd, rcd->len);
+			}
+
 			rxq->start_seg = rxm;
 			vmxnet3_rx_offload(rcd, rxm);
 		} else {
@@ -1015,6 +1029,7 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	struct vmxnet3_hw *hw = dev->data->dev_private;
 	struct vmxnet3_cmd_ring *ring0, *ring1, *ring;
 	struct vmxnet3_comp_ring *comp_ring;
+	struct vmxnet3_rx_data_ring *data_ring;
 	int size;
 	uint8_t i;
 	char mem_name[32];
@@ -1035,11 +1050,14 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	rxq->hw = hw;
 	rxq->qid1 = queue_idx;
 	rxq->qid2 = queue_idx + hw->num_rx_queues;
+	rxq->data_ring_qid = queue_idx + 2 * hw->num_rx_queues;
+	rxq->data_desc_size = hw->rxdata_desc_size;
 	rxq->stopped = TRUE;
 
 	ring0 = &rxq->cmd_ring[0];
 	ring1 = &rxq->cmd_ring[1];
 	comp_ring = &rxq->comp_ring;
+	data_ring = &rxq->data_ring;
 
 	/* Rx vmxnet rings length should be between 256-4096 */
 	if (nb_desc < VMXNET3_DEF_RX_RING_SIZE) {
@@ -1055,6 +1073,7 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	}
 
 	comp_ring->size = ring0->size + ring1->size;
+	data_ring->size = ring0->size;
 
 	/* Rx vmxnet rings structure initialization */
 	ring0->next2fill = 0;
@@ -1068,6 +1087,9 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
 
 	size = sizeof(struct Vmxnet3_RxDesc) * (ring0->size + ring1->size);
 	size += sizeof(struct Vmxnet3_RxCompDesc) * comp_ring->size;
+	if (VMXNET3_VERSION_GE_3(hw) && rxq->data_desc_size) {
+		size += rxq->data_desc_size * data_ring->size;
+	}
 
 	mz = ring_dma_zone_reserve(dev, "rxdesc", queue_idx, size, socket_id);
 	if (mz == NULL) {
@@ -1089,6 +1111,13 @@ vmxnet3_dev_rx_queue_setup(struct rte_eth_dev *dev,
 	comp_ring->basePA = ring1->basePA + sizeof(struct Vmxnet3_RxDesc) *
 		ring1->size;
 
+	/* data_ring initialization */
+	if (VMXNET3_VERSION_GE_3(hw) && rxq->data_desc_size) {
+		data_ring->base = (uint8_t *)(comp_ring->base + comp_ring->size);
+		data_ring->basePA = comp_ring->basePA +
+			sizeof(struct Vmxnet3_RxCompDesc) * comp_ring->size;
+	}
+
 	/* cmd_ring0-cmd_ring1 buf_info allocation */
 	for (i = 0; i < VMXNET3_RX_CMDRING_SIZE; i++) {
 
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev]  [PATCH 5/7] vmxnet3: add reserved version 3 command
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
                   ` (3 preceding siblings ...)
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 4/7] vmxnet3: add receive data ring support Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region Shrikrishna Khare
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

This command is reserved.

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index 746d709..c708498 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -110,6 +110,7 @@ typedef enum {
    VMXNET3_CMD_LOAD_PLUGIN,
    VMXNET3_CMD_ACTIVATE_VF,
    VMXNET3_CMD_RESERVED3,
+   VMXNET3_CMD_RESERVED4,
 
    VMXNET3_CMD_FIRST_GET = 0xF00D0000,
    VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
@@ -122,7 +123,8 @@ typedef enum {
    VMXNET3_CMD_GET_DEV_EXTRA_INFO,
    VMXNET3_CMD_GET_CONF_INTR,
    VMXNET3_CMD_GET_ADAPTIVE_RING_INFO,
-   VMXNET3_CMD_GET_TXDATA_DESC_SIZE
+   VMXNET3_CMD_GET_TXDATA_DESC_SIZE,
+   VMXNET3_CMD_RESERVED5,
 } Vmxnet3_Cmd;
 
 /* Adaptive Ring Info Flags */
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
                   ` (4 preceding siblings ...)
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 5/7] vmxnet3: add reserved version 3 command Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-03-03 10:46   ` Ferruh Yigit
  2017-03-03 10:51   ` Ferruh Yigit
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 7/7] vmxnet3: update to version 3 Shrikrishna Khare
  2017-03-03 10:57 ` [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade " Ferruh Yigit
  7 siblings, 2 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare, Guolin Yang

In vmxnet3 version 3, the emulation added support for the vmxnet3 driver
to communicate information about the memory regions the driver will use
for rx/tx buffers. The driver can also indicate which rx/tx queue the
memory region is applicable for. If this information is communicated
to the emulation, the emulation will always keep these memory regions
mapped, thereby avoiding the mapping/unmapping overhead for every packet.

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Signed-off-by: Guolin Yang <gyang@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/base/vmxnet3_defs.h |  25 ++++++++
 drivers/net/vmxnet3/vmxnet3_ethdev.c    | 102 ++++++++++++++++++++++++++++++++
 drivers/net/vmxnet3/vmxnet3_ethdev.h    |   2 +
 3 files changed, 129 insertions(+)

diff --git a/drivers/net/vmxnet3/base/vmxnet3_defs.h b/drivers/net/vmxnet3/base/vmxnet3_defs.h
index c708498..bfa9622 100644
--- a/drivers/net/vmxnet3/base/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/base/vmxnet3_defs.h
@@ -111,6 +111,7 @@ typedef enum {
    VMXNET3_CMD_ACTIVATE_VF,
    VMXNET3_CMD_RESERVED3,
    VMXNET3_CMD_RESERVED4,
+   VMXNET3_CMD_REGISTER_MEMREGS,
 
    VMXNET3_CMD_FIRST_GET = 0xF00D0000,
    VMXNET3_CMD_GET_QUEUE_STATUS = VMXNET3_CMD_FIRST_GET,
@@ -722,6 +723,30 @@ struct Vmxnet3_SetPolling {
 #include "vmware_pack_end.h"
 Vmxnet3_SetPolling;
 
+typedef
+#include "vmware_pack_begin.h"
+struct Vmxnet3_MemoryRegion {
+	__le64            startPA;
+	__le32            length;
+	__le16            txQueueBits; /* bit n corresponding to tx queue n */
+	__le16            rxQueueBits; /* bit n corresponding to rx queue n */
+}
+#include "vmware_pack_end.h"
+Vmxnet3_MemoryRegion;
+
+#define MAX_MEMORY_REGION_PER_QUEUE 16
+#define MAX_MEMORY_REGION_PER_DEVICE 256
+
+typedef
+#include "vmware_pack_begin.h"
+struct Vmxnet3_MemRegs {
+	__le16           numRegs;
+	__le16           pad[3];
+	Vmxnet3_MemoryRegion memRegs[1];
+}
+#include "vmware_pack_end.h"
+Vmxnet3_MemRegs;
+
 /*
  * If the command data <= 16 bytes, use the shared memory direcly.
  * Otherwise, use the variable length configuration descriptor.
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index 8591ce1..a4fc14d 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -489,6 +489,92 @@ vmxnet3_write_mac(struct vmxnet3_hw *hw, const uint8_t *addr)
 }
 
 static int
+vmxnet3_dev_setup_memreg(struct rte_eth_dev *dev)
+{
+	struct vmxnet3_hw *hw = dev->data->dev_private;
+	Vmxnet3_DriverShared *shared = hw->shared;
+	Vmxnet3_CmdInfo *cmdInfo;
+	struct rte_mempool *mp[VMXNET3_MAX_RX_QUEUES];
+	uint8_t index[VMXNET3_MAX_RX_QUEUES + VMXNET3_MAX_TX_QUEUES];
+	uint32_t num, i, j, size;
+
+	if (hw->memRegsPA == 0) {
+		const struct rte_memzone *mz;
+
+		size = sizeof(Vmxnet3_MemRegs) +
+			(VMXNET3_MAX_RX_QUEUES + VMXNET3_MAX_TX_QUEUES) *
+			sizeof(Vmxnet3_MemoryRegion);
+
+		mz = gpa_zone_reserve(dev, size, "memRegs", rte_socket_id(), 8,
+				      1);
+		if (mz == NULL) {
+			PMD_INIT_LOG(ERR, "ERROR: Creating memRegs zone");
+			return -ENOMEM;
+		}
+		memset(mz->addr, 0, mz->len);
+		hw->memRegs = mz->addr;
+		hw->memRegsPA = mz->phys_addr;
+	}
+
+	num = hw->num_rx_queues;
+
+	for (i = 0; i < num; i++) {
+		vmxnet3_rx_queue_t *rxq = dev->data->rx_queues[i];
+
+		mp[i] = rxq->mp;
+		index[i] = 1 << i;
+	}
+
+	/*
+	 * The same mempool could be used by multiple queues. In such a case,
+	 * remove duplicate mempool entries. Only one entry is kept with
+	 * bitmask indicating queues that are using this mempool.
+	 */
+	for (i = 1; i < num; i++) {
+		for (j = 0; j < i; j++) {
+			if (mp[i] == mp[j]) {
+				mp[i] = NULL;
+				index[j] |= 1 << i;
+				break;
+			}
+		}
+	}
+
+	j = 0;
+	for (i = 0; i < num; i++) {
+		if (mp[i] == NULL) {
+			continue;
+		}
+
+		Vmxnet3_MemoryRegion *mr = &hw->memRegs->memRegs[j];
+
+		mr->startPA =
+			(uintptr_t)STAILQ_FIRST(&mp[i]->mem_list)->phys_addr;
+		mr->length = STAILQ_FIRST(&mp[i]->mem_list)->len <= INT32_MAX ?
+			STAILQ_FIRST(&mp[i]->mem_list)->len : INT32_MAX;
+		mr->txQueueBits = index[i];
+		mr->rxQueueBits = index[i];
+
+		PMD_INIT_LOG(INFO,
+			     "index: %u startPA: %lu  length: %u, rxBits: %x",
+			     j, mr->startPA, mr->length, mr->rxQueueBits);
+		j++;
+	}
+	hw->memRegs->numRegs = j;
+	PMD_INIT_LOG("numRegs: %u", j);
+
+	size = sizeof(Vmxnet3_MemRegs) +
+		(j - 1) * sizeof(Vmxnet3_MemoryRegion);
+
+	cmdInfo = &shared->cu.cmdInfo;
+	cmdInfo->varConf.confVer = 1;
+	cmdInfo->varConf.confLen = size;
+	cmdInfo->varConf.confPA = hw->memRegsPA;
+
+	return 0;
+}
+
+static int
 vmxnet3_setup_driver_shared(struct rte_eth_dev *dev)
 {
 	struct rte_eth_conf port_conf = dev->data->dev_conf;
@@ -628,6 +714,20 @@ vmxnet3_dev_start(struct rte_eth_dev *dev)
 		return -EINVAL;
 	}
 
+	/* Setup memory region for rx buffers */
+	ret = vmxnet3_dev_setup_memreg(dev);
+	if (ret == 0) {
+		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD,
+				       VMXNET3_CMD_REGISTER_MEMREGS);
+		ret = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_CMD);
+		if (ret != 0) {
+			PMD_INIT_LOG(DEBUG, "Failed in setup memory region cmd\n");
+		}
+		ret = 0;
+	} else {
+		PMD_INIT_LOG(DEBUG, "Failed to setup memory region\n");
+	}
+
 	/* Disable interrupts */
 	vmxnet3_disable_intr(hw);
 
@@ -641,6 +741,8 @@ vmxnet3_dev_start(struct rte_eth_dev *dev)
 		return ret;
 	}
 
+	hw->adapter_stopped = FALSE;
+
 	/* Setting proper Rx Mode and issue Rx Mode Update command */
 	vmxnet3_dev_set_rxmode(hw, VMXNET3_RXM_UCAST | VMXNET3_RXM_BCAST, 1);
 
diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.h b/drivers/net/vmxnet3/vmxnet3_ethdev.h
index 1c1afc6..789ab76 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.h
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.h
@@ -119,6 +119,8 @@ struct vmxnet3_hw {
 	uint64_t              rss_confPA;
 	vmxnet3_mf_table_t    *mf_table;
 	uint32_t              shadow_vfta[VMXNET3_VFT_SIZE];
+	Vmxnet3_MemRegs	      *memRegs;
+	uint64_t	      memRegsPA;
 #define VMXNET3_VFT_TABLE_SIZE     (VMXNET3_VFT_SIZE * sizeof(uint32_t))
 };
 
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [dpdk-dev]  [PATCH 7/7] vmxnet3: update to version 3
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
                   ` (5 preceding siblings ...)
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region Shrikrishna Khare
@ 2017-02-25 21:59 ` Shrikrishna Khare
  2017-03-03 10:57 ` [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade " Ferruh Yigit
  7 siblings, 0 replies; 13+ messages in thread
From: Shrikrishna Khare @ 2017-02-25 21:59 UTC (permalink / raw)
  To: yongwang; +Cc: dev, Shrikrishna Khare

With all vmxnet3 version 3 changes incorporated in the vmxnet3 driver,
the driver can configure emulation to run at vmxnet3 version 3, provided
the emulation advertises support for version 3.

Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
Acked-by: Yong Wang <yongwang@vmware.com>
Acked-by: Jin Heo <heoj@vmware.com>
---
 drivers/net/vmxnet3/vmxnet3_ethdev.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_ethdev.c b/drivers/net/vmxnet3/vmxnet3_ethdev.c
index a4fc14d..21a78f6 100644
--- a/drivers/net/vmxnet3/vmxnet3_ethdev.c
+++ b/drivers/net/vmxnet3/vmxnet3_ethdev.c
@@ -284,7 +284,11 @@ eth_vmxnet3_dev_init(struct rte_eth_dev *eth_dev)
 	ver = VMXNET3_READ_BAR1_REG(hw, VMXNET3_REG_VRRS);
 	PMD_INIT_LOG(DEBUG, "Hardware version : %d", ver);
 
-	if (ver & (1 << VMXNET3_REV_2)) {
+	if (ver & (1 << VMXNET3_REV_3)) {
+		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
+				       1 << VMXNET3_REV_3);
+		hw->version = VMXNET3_REV_3 + 1;
+	} else if (ver & (1 << VMXNET3_REV_2)) {
 		VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_VRRS,
 				       1 << VMXNET3_REV_2);
 		hw->version = VMXNET3_REV_2 + 1;
-- 
2.6.2

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region Shrikrishna Khare
@ 2017-03-03 10:46   ` Ferruh Yigit
  2017-03-03 10:51   ` Ferruh Yigit
  1 sibling, 0 replies; 13+ messages in thread
From: Ferruh Yigit @ 2017-03-03 10:46 UTC (permalink / raw)
  To: Shrikrishna Khare, yongwang; +Cc: dev, Guolin Yang

On 2/25/2017 9:59 PM, Shrikrishna Khare wrote:
> In vmxnet3 version 3, the emulation added support for the vmxnet3 driver
> to communicate information about the memory regions the driver will use
> for rx/tx buffers. The driver can also indicate which rx/tx queue the
> memory region is applicable for. If this information is communicated
> to the emulation, the emulation will always keep these memory regions
> mapped, thereby avoiding the mapping/unmapping overhead for every packet.
> 
> Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
> Signed-off-by: Guolin Yang <gyang@vmware.com>
> Acked-by: Yong Wang <yongwang@vmware.com>
> Acked-by: Jin Heo <heoj@vmware.com>

<...>

> +		PMD_INIT_LOG(INFO,
> +			     "index: %u startPA: %lu  length: %u, rxBits: %x",
> +			     j, mr->startPA, mr->length, mr->rxQueueBits);
> +		j++;
> +	}
> +	hw->memRegs->numRegs = j;
> +	PMD_INIT_LOG("numRegs: %u", j);

Macro argument is not correct, causing following build error:

.../drivers/net/vmxnet3/vmxnet3_ethdev.c:568:2: error: pasting formed
'RTE_LOG_"numRegs: %u"', an invalid preprocessing token
        PMD_INIT_LOG("numRegs: %u", j);
        ^

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region Shrikrishna Khare
  2017-03-03 10:46   ` Ferruh Yigit
@ 2017-03-03 10:51   ` Ferruh Yigit
  1 sibling, 0 replies; 13+ messages in thread
From: Ferruh Yigit @ 2017-03-03 10:51 UTC (permalink / raw)
  To: Shrikrishna Khare, yongwang; +Cc: dev, Guolin Yang

On 2/25/2017 9:59 PM, Shrikrishna Khare wrote:
> In vmxnet3 version 3, the emulation added support for the vmxnet3 driver
> to communicate information about the memory regions the driver will use
> for rx/tx buffers. The driver can also indicate which rx/tx queue the
> memory region is applicable for. If this information is communicated
> to the emulation, the emulation will always keep these memory regions
> mapped, thereby avoiding the mapping/unmapping overhead for every packet.
> 
> Signed-off-by: Shrikrishna Khare <skhare@vmware.com>
> Signed-off-by: Guolin Yang <gyang@vmware.com>
> Acked-by: Yong Wang <yongwang@vmware.com>
> Acked-by: Jin Heo <heoj@vmware.com>

<...>

> +		PMD_INIT_LOG(INFO,
> +			     "index: %u startPA: %lu  length: %u, rxBits: %x",
> +			     j, mr->startPA, mr->length, mr->rxQueueBits);

Also this gives following build error for 32bit (i686) build:

.../drivers/net/vmxnet3/vmxnet3_ethdev.c: In function
‘vmxnet3_dev_setup_memreg’:
.../drivers/net/vmxnet3/vmxnet3_ethdev.c:564:52: error: format ‘%lu’
expects argument of type ‘long unsigned int’, but argument 6 has type
‘uint64 {aka long long unsigned int}’ [-Werror=format=]
         j, mr->startPA, mr->length, mr->rxQueueBits);
                                                    ^

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3
  2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
                   ` (6 preceding siblings ...)
  2017-02-25 21:59 ` [dpdk-dev] [PATCH 7/7] vmxnet3: update to version 3 Shrikrishna Khare
@ 2017-03-03 10:57 ` Ferruh Yigit
  2017-03-06 17:25   ` Shrikrishna Khare
  7 siblings, 1 reply; 13+ messages in thread
From: Ferruh Yigit @ 2017-03-03 10:57 UTC (permalink / raw)
  To: Shrikrishna Khare, yongwang; +Cc: dev

On 2/25/2017 9:59 PM, Shrikrishna Khare wrote:
> vmxnet3 emulation has recently added several new features which includes
> support for new commands the driver can issue to emulation, change in
> descriptor fields etc. This patch series extends the vmxnet3 driver to
> leverage these new features.
> 
> Compatibility is maintained using existing vmxnet3 versioning mechanism as
> follows:
>  - new features added to vmxnet3 emulation are associated with new vmxnet3
>    version viz. vmxnet3 version 3.
>  - emulation advertises all the versions it supports to the driver.
>  - during initialization, vmxnet3 driver picks the highest version number
>  supported by both the emulation and the driver and configures emulation
>  to run at that version.
> 
> In particular, following changes are introduced:
> 
> Patch 1:
>   Trivial cleanup in preparation of version 3 changes.
> 
> Patch 2:
>   This patch introduces generalized command interface which allows
>   for easily adding new commands that vmxnet3 driver can issue to the
>   emulation. Further patches in this series make use of this facility.
> 
> Patch 3:
>   Transmit data ring buffer is used to copy packet headers or small
>   packets. It is a fixed size buffer. This patch extends the driver to
>   allow variable sized transmit data ring buffer.
> 
> Patch 4:
>   This patch introduces receive data ring buffer - a set of small sized
>   buffers that are always mapped by the emulation. This avoids memory
>   mapping/unmapping overhead for small packets.
> 
> Patch 5:
>   This patch adds reserved commands.
> 
> Patch 6:
>   In vmxnet3 version 3, the emulation added support for the vmxnet3 driver
>   to communicate information about the memory regions the driver will use
>   for rx/tx buffers. This patch exposes related commands to the driver. The
>   driver is also extended to make use of this feaeture.
> 
> Patch 7:
>   With all vmxnet3 version 3 changes incorporated in the vmxnet3 driver,
>   with this patch, the driver can configure emulation to run at vmxnet3
>   version 3.
> 
> Shrikrishna Khare (7):
>   vmxnet3: prepare for version 3 changes
>   vmxnet3: introduce generalized command interface to configure the
>     device
>   vmxnet3: allow variable length transmit data ring buffer
>   vmxnet3: add receive data ring support
>   vmxnet3: add reserved version 3 command
>   vmxnet3: introduce command to register memory region
>   vmxnet3: update to version 3

Hi Shrikrishna,

Can you please update release notes with this change with one or two
sentences in next version of the patchset?

Also there are helper scripts in dpdk:
- dpdk/devtools/check-git-log.sh to check patch titles
- dpdk/devtools/checkpatches.sh (a wrapper to Linux checkpatch.pl)

Both are generating some warnings, can you please check them?

For checkpatches script, it is free to ignore CAMELCASE &
LONG_LINE_STRING warnings.

Thanks,
ferruh




> 
>  drivers/net/vmxnet3/base/vmxnet3_defs.h |  85 ++++++++++++++++--
>  drivers/net/vmxnet3/vmxnet3_ethdev.c    | 154 +++++++++++++++++++++++++++++++-
>  drivers/net/vmxnet3/vmxnet3_ethdev.h    |  14 +++
>  drivers/net/vmxnet3/vmxnet3_ring.h      |  21 +++++
>  drivers/net/vmxnet3/vmxnet3_rxtx.c      |  45 ++++++++--
>  5 files changed, 304 insertions(+), 15 deletions(-)
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3
  2017-03-03 10:57 ` [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade " Ferruh Yigit
@ 2017-03-06 17:25   ` Shrikrishna Khare
  2017-03-07 12:17     ` Ferruh Yigit
  0 siblings, 1 reply; 13+ messages in thread
From: Shrikrishna Khare @ 2017-03-06 17:25 UTC (permalink / raw)
  To: Ferruh Yigit; +Cc: Shrikrishna Khare, yongwang, dev



On Fri, 3 Mar 2017, Ferruh Yigit wrote:

> > Shrikrishna Khare (7):
> >   vmxnet3: prepare for version 3 changes
> >   vmxnet3: introduce generalized command interface to configure the
> >     device
> >   vmxnet3: allow variable length transmit data ring buffer
> >   vmxnet3: add receive data ring support
> >   vmxnet3: add reserved version 3 command
> >   vmxnet3: introduce command to register memory region
> >   vmxnet3: update to version 3
> 
> Hi Shrikrishna,
> 
> Can you please update release notes with this change with one or two
> sentences in next version of the patchset?
> 
> Also there are helper scripts in dpdk:
> - dpdk/devtools/check-git-log.sh to check patch titles
> - dpdk/devtools/checkpatches.sh (a wrapper to Linux checkpatch.pl)
> 
> Both are generating some warnings, can you please check them?
> 
> For checkpatches script, it is free to ignore CAMELCASE &
> LONG_LINE_STRING warnings.

Hi Ferruh,

 Thank you for the review comments. I have addressed them all and sent v2 
patches for review.
 
 In addition to CAMELCASE, there are few LEADING_SPACE warnings that I 
have not addressed. This is an existing problem with all the vmxnet3 
headers and only fixing it for the lines added by this patch series will 
be odd. Hope that is OK. Perhaps a separate patch can fix these style 
issues in vmxnet3 header files all at once.

Thanks,
Shri

> 
> Thanks,
> ferruh
> 
> 
> 
> 
> > 
> >  drivers/net/vmxnet3/base/vmxnet3_defs.h |  85 ++++++++++++++++--
> >  drivers/net/vmxnet3/vmxnet3_ethdev.c    | 154 +++++++++++++++++++++++++++++++-
> >  drivers/net/vmxnet3/vmxnet3_ethdev.h    |  14 +++
> >  drivers/net/vmxnet3/vmxnet3_ring.h      |  21 +++++
> >  drivers/net/vmxnet3/vmxnet3_rxtx.c      |  45 ++++++++--
> >  5 files changed, 304 insertions(+), 15 deletions(-)
> > 
> 
> 

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3
  2017-03-06 17:25   ` Shrikrishna Khare
@ 2017-03-07 12:17     ` Ferruh Yigit
  0 siblings, 0 replies; 13+ messages in thread
From: Ferruh Yigit @ 2017-03-07 12:17 UTC (permalink / raw)
  To: Shrikrishna Khare; +Cc: Shrikrishna Khare, yongwang, dev

On 3/6/2017 5:25 PM, Shrikrishna Khare wrote:
> 
> 
> On Fri, 3 Mar 2017, Ferruh Yigit wrote:
> 
>>> Shrikrishna Khare (7):
>>>   vmxnet3: prepare for version 3 changes
>>>   vmxnet3: introduce generalized command interface to configure the
>>>     device
>>>   vmxnet3: allow variable length transmit data ring buffer
>>>   vmxnet3: add receive data ring support
>>>   vmxnet3: add reserved version 3 command
>>>   vmxnet3: introduce command to register memory region
>>>   vmxnet3: update to version 3
>>
>> Hi Shrikrishna,
>>
>> Can you please update release notes with this change with one or two
>> sentences in next version of the patchset?
>>
>> Also there are helper scripts in dpdk:
>> - dpdk/devtools/check-git-log.sh to check patch titles
>> - dpdk/devtools/checkpatches.sh (a wrapper to Linux checkpatch.pl)
>>
>> Both are generating some warnings, can you please check them?
>>
>> For checkpatches script, it is free to ignore CAMELCASE &
>> LONG_LINE_STRING warnings.
> 
> Hi Ferruh,
> 
>  Thank you for the review comments. I have addressed them all and sent v2 
> patches for review.
>  
>  In addition to CAMELCASE, there are few LEADING_SPACE warnings that I 
> have not addressed. This is an existing problem with all the vmxnet3 
> headers and only fixing it for the lines added by this patch series will 
> be odd. Hope that is OK. 

I agree, better to keep existing style.

> Perhaps a separate patch can fix these style 
> issues in vmxnet3 header files all at once.

That would be nice, thank you.

> 
> Thanks,
> Shri

<...>

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2017-03-07 12:17 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-25 21:59 [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade to version 3 Shrikrishna Khare
2017-02-25 21:59 ` [dpdk-dev] [PATCH 1/7] vmxnet3: prepare for version 3 changes Shrikrishna Khare
2017-02-25 21:59 ` [dpdk-dev] [PATCH 2/7] vmxnet3: introduce generalized command interface to configure the device Shrikrishna Khare
2017-02-25 21:59 ` [dpdk-dev] [PATCH 3/7] vmxnet3: allow variable length transmit data ring buffer Shrikrishna Khare
2017-02-25 21:59 ` [dpdk-dev] [PATCH 4/7] vmxnet3: add receive data ring support Shrikrishna Khare
2017-02-25 21:59 ` [dpdk-dev] [PATCH 5/7] vmxnet3: add reserved version 3 command Shrikrishna Khare
2017-02-25 21:59 ` [dpdk-dev] [PATCH 6/7] vmxnet3: introduce command to register memory region Shrikrishna Khare
2017-03-03 10:46   ` Ferruh Yigit
2017-03-03 10:51   ` Ferruh Yigit
2017-02-25 21:59 ` [dpdk-dev] [PATCH 7/7] vmxnet3: update to version 3 Shrikrishna Khare
2017-03-03 10:57 ` [dpdk-dev] [PATCH 0/7] vmxnet3: upgrade " Ferruh Yigit
2017-03-06 17:25   ` Shrikrishna Khare
2017-03-07 12:17     ` Ferruh Yigit

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).