From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 184D6A04E7;
	Tue,  3 Nov 2020 01:15:06 +0100 (CET)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id 64A495946;
	Tue,  3 Nov 2020 01:14:31 +0100 (CET)
Received: from wout4-smtp.messagingengine.com (wout4-smtp.messagingengine.com
 [64.147.123.20]) by dpdk.org (Postfix) with ESMTP id 2291F4C6B
 for <dev@dpdk.org>; Tue,  3 Nov 2020 01:14:28 +0100 (CET)
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
 by mailout.west.internal (Postfix) with ESMTP id B76DAB76;
 Mon,  2 Nov 2020 19:14:25 -0500 (EST)
Received: from mailfrontend2 ([10.202.2.163])
 by compute2.internal (MEProxy); Mon, 02 Nov 2020 19:14:26 -0500
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=monjalon.net; h=
 from:to:cc:subject:date:message-id:in-reply-to:references
 :mime-version:content-transfer-encoding; s=fm2; bh=4mqlsQMBaLocx
 1C0K6Bzrvjwazd84ZzcFUsiIpCxRd0=; b=NxL79xd6ZRPzNp56oRpTxoTFRjmAO
 S4SlHd2x7YZ0/4dWSrmgaOIrMuOk5W3n2jammlqMo8RdN77BqvR/ZsesZnZpVQ7F
 5QBNWdILCceWrJg/ErpDgxVehaoVaZ7DGkIAOd2trF5kNvZlcTC1NlFYpQyx8B+0
 c7l62eME9jg3eZwzatQRAhPbMhnB4qshZEyrZwiP9cSgOGPYh33LwHv/uGwtThQT
 hr0VrghNRplNnDEhlGFEqejkhxK2oZh7vxHR9+sklRd8H+ZuoATfjAjhQ+R/m5Bi
 2DCpwTtnKLAhz5M+pgeqzVqPVkdagi1+bQWf1At2ckfVYH2ypFfB5hxoA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=
 messagingengine.com; h=cc:content-transfer-encoding:date:from
 :in-reply-to:message-id:mime-version:references:subject:to
 :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=
 fm1; bh=4mqlsQMBaLocx1C0K6Bzrvjwazd84ZzcFUsiIpCxRd0=; b=r159p4Ng
 EMTMEGY5+PoqpEwaGZfJ+pSzWI5ixEHTATCbetf+r0SkqO5h7P3He/OyZyhjZEIo
 5FvREH6or/HOpMUtT40O5FLBCqP7Ow9MzK4XXlz7ZkcKOcjwhXHfiJE+wXxhiqhN
 OT8TKeboqgygW312vQ62uPLn20dODzouAfbSgJfw9miv4hCTU1obvyTVJaKtVaFy
 C63tq1mSstnV4w2/mCXGsF05Bt5rrDkUMgoqyIXgLHaRjHLd5f2U13Dyx3Gzm5Mo
 jiKmQmA2NDvdKjlS+WNk5T8r1tCkMu8dn5i1jrOQcT1OMevyK1cqHb5u6/JrbAdV
 QIJWgghnDfOK8w==
X-ME-Sender: <xms:4KCgX5QDYtm_9wYmkaKZQFI0s7MJWbdxIeydda5AhjVISPNPwtS3Eg>
 <xme:4KCgXyyaWIpEGx7y0zYmFVtg2h2-V-xW5WPEz93h9jqhBNvqOLjauexavjAMmkyFJ
 WmDru_s0lQFcEiiGA>
X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedujedruddtvddgudejucetufdoteggodetrfdotf
 fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen
 uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne
 cujfgurhephffvufffkffojghfggfgsedtkeertdertddtnecuhfhrohhmpefvhhhomhgr
 shcuofhonhhjrghlohhnuceothhhohhmrghssehmohhnjhgrlhhonhdrnhgvtheqnecugg
 ftrfgrthhtvghrnhepvdehgfeivdejgedtveehfefhteelfefgieevgfffveefjeegtdfg
 uedthedtgeevnecukfhppeejjedrudefgedrvddtfedrudekgeenucevlhhushhtvghruf
 hiiigvpedunecurfgrrhgrmhepmhgrihhlfhhrohhmpehthhhomhgrshesmhhonhhjrghl
 ohhnrdhnvght
X-ME-Proxy: <xmx:4KCgX-2ELcKOgLfWvYvSr6M5LIIazQCcQAbyPJut52AZNhimUGqqxA>
 <xmx:4KCgXxDzLeh45OTRA4l8OiznGFXBsm0drq2vxB7LdtpCreKZseXImA>
 <xmx:4KCgXyii9FKX6NCI7KXP4Glxj6anNg4vTbIYFACCJjt-iGS7mUcQAg>
 <xmx:4aCgX2gHDSD84dVL9vJgJf6Mj6gpiqCyoqqa39nXbzAvpNVysSdtsA>
Received: from xps.monjalon.net (184.203.134.77.rev.sfr.net [77.134.203.184])
 by mail.messagingengine.com (Postfix) with ESMTPA id 8ED463064674;
 Mon,  2 Nov 2020 19:14:23 -0500 (EST)
From: Thomas Monjalon <thomas@monjalon.net>
To: dev@dpdk.org
Cc: ferruh.yigit@intel.com, david.marchand@redhat.com,
 bruce.richardson@intel.com, olivier.matz@6wind.com,
 andrew.rybchenko@oktetlabs.ru, jerinj@marvell.com, viacheslavo@nvidia.com,
 Ray Kinsella <mdr@ashroe.eu>, Neil Horman <nhorman@tuxdriver.com>
Date: Tue,  3 Nov 2020 01:13:53 +0100
Message-Id: <20201103001407.2931963-3-thomas@monjalon.net>
X-Mailer: git-send-email 2.28.0
In-Reply-To: <20201103001407.2931963-1-thomas@monjalon.net>
References: <20201029092751.3837177-1-thomas@monjalon.net>
 <20201103001407.2931963-1-thomas@monjalon.net>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: [dpdk-dev] [PATCH v3 02/16] mbuf: add Rx timestamp flag and helpers
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

There is already a dynamic field for timestamp,
used only for Tx scheduling with the dedicated Tx offload flag.
The same field can be used for Rx timestamp filled by drivers.

A new dynamic flag is defined for Rx usage.
A new function wraps the registration of both field and Rx flag.
The type rte_mbuf_timestamp_t is defined for the API users.

After migrating all Rx timestamp usages, it will be possible
to remove the deprecated timestamp field.

Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
---
 lib/librte_mbuf/rte_mbuf_dyn.c | 43 ++++++++++++++++++++++++++++++++++
 lib/librte_mbuf/rte_mbuf_dyn.h | 33 ++++++++++++++++++++++----
 lib/librte_mbuf/version.map    |  1 +
 3 files changed, 72 insertions(+), 5 deletions(-)

diff --git a/lib/librte_mbuf/rte_mbuf_dyn.c b/lib/librte_mbuf/rte_mbuf_dyn.c
index 538a43f695..e279b23aea 100644
--- a/lib/librte_mbuf/rte_mbuf_dyn.c
+++ b/lib/librte_mbuf/rte_mbuf_dyn.c
@@ -13,6 +13,7 @@
 #include <rte_errno.h>
 #include <rte_malloc.h>
 #include <rte_string_fns.h>
+#include <rte_bitops.h>
 #include <rte_mbuf.h>
 #include <rte_mbuf_dyn.h>
 
@@ -569,3 +570,45 @@ void rte_mbuf_dyn_dump(FILE *out)
 
 	rte_mcfg_tailq_write_unlock();
 }
+
+static int
+rte_mbuf_dyn_timestamp_register(int *field_offset, uint64_t *flag,
+		const char *direction, const char *flag_name)
+{
+	static const struct rte_mbuf_dynfield field_desc = {
+		.name = RTE_MBUF_DYNFIELD_TIMESTAMP_NAME,
+		.size = sizeof(rte_mbuf_timestamp_t),
+		.align = __alignof__(rte_mbuf_timestamp_t),
+	};
+	struct rte_mbuf_dynflag flag_desc;
+	int offset;
+
+	offset = rte_mbuf_dynfield_register(&field_desc);
+	if (offset < 0) {
+		RTE_LOG(ERR, MBUF,
+			"Failed to register mbuf field for timestamp\n");
+		return -1;
+	}
+	if (field_offset != NULL)
+		*field_offset = offset;
+
+	strlcpy(flag_desc.name, flag_name, sizeof flag_desc.name);
+	offset = rte_mbuf_dynflag_register(&flag_desc);
+	if (offset < 0) {
+		RTE_LOG(ERR, MBUF,
+			"Failed to register mbuf flag for %s timestamp\n",
+			direction);
+		return -1;
+	}
+	if (flag != NULL)
+		*flag = RTE_BIT64(offset);
+
+	return 0;
+}
+
+int
+rte_mbuf_dyn_rx_timestamp_register(int *field_offset, uint64_t *rx_flag)
+{
+	return rte_mbuf_dyn_timestamp_register(field_offset, rx_flag,
+			"Rx", RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME);
+}
diff --git a/lib/librte_mbuf/rte_mbuf_dyn.h b/lib/librte_mbuf/rte_mbuf_dyn.h
index 0ebac88b83..2e729ddaca 100644
--- a/lib/librte_mbuf/rte_mbuf_dyn.h
+++ b/lib/librte_mbuf/rte_mbuf_dyn.h
@@ -258,13 +258,36 @@ void rte_mbuf_dyn_dump(FILE *out);
  * timestamp. The dynamic Tx timestamp flag tells whether the field contains
  * actual timestamp value for the packets being sent, this value can be
  * used by PMD to schedule packet sending.
- *
- * After PKT_RX_TIMESTAMP flag and fixed timestamp field deprecation
- * and obsoleting, the dedicated Rx timestamp flag is supposed to be
- * introduced and the shared dynamic timestamp field will be used
- * to handle the timestamps on receiving datapath as well.
  */
 #define RTE_MBUF_DYNFIELD_TIMESTAMP_NAME "rte_dynfield_timestamp"
+typedef uint64_t rte_mbuf_timestamp_t;
+
+/**
+ * Indicate that the timestamp field in the mbuf was filled by the driver.
+ */
+#define RTE_MBUF_DYNFLAG_RX_TIMESTAMP_NAME "rte_dynflag_rx_timestamp"
+
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice.
+ *
+ * Register dynamic mbuf field and flag for Rx timestamp.
+ *
+ * @param field_offset
+ *   Pointer to the offset of the registered mbuf field, can be NULL.
+ *   The same field is shared for Rx and Tx timestamp.
+ * @param rx_flag
+ *   Pointer to the mask of the registered offload flag, can be NULL.
+ * @return
+ *   0 on success, -1 otherwise.
+ *   Possible values for rte_errno:
+ *   - EEXIST: already registered with different parameters.
+ *   - EPERM: called from a secondary process.
+ *   - ENOENT: no more field or flag available.
+ *   - ENOMEM: allocation failure.
+ */
+__rte_experimental
+int rte_mbuf_dyn_rx_timestamp_register(int *field_offset, uint64_t *rx_flag);
 
 /**
  * When PMD sees the RTE_MBUF_DYNFLAG_TX_TIMESTAMP_NAME flag set on the
diff --git a/lib/librte_mbuf/version.map b/lib/librte_mbuf/version.map
index a011aaead3..0b66668bff 100644
--- a/lib/librte_mbuf/version.map
+++ b/lib/librte_mbuf/version.map
@@ -42,6 +42,7 @@ EXPERIMENTAL {
 	rte_mbuf_dynflag_register;
 	rte_mbuf_dynflag_register_bitnum;
 	rte_mbuf_dyn_dump;
+	rte_mbuf_dyn_rx_timestamp_register;
 	rte_pktmbuf_copy;
 	rte_pktmbuf_free_bulk;
 	rte_pktmbuf_pool_create_extbuf;
-- 
2.28.0