[v2] eventdev: update rx timestamp in mbuf using mbuf dynamic field

Message ID 20210916091532.1848770-1-ganapati.kundapura@intel.com (mailing list archive)
State Changes Requested, archived
Delegated to: Jerin Jacob
Headers
Series [v2] eventdev: update rx timestamp in mbuf using mbuf dynamic field |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/iol-testing warning apply patch failure
ci/Intel-compilation success Compilation OK
ci/intel-Testing fail Testing issues

Commit Message

Ganapati Kundapura Sept. 16, 2021, 9:15 a.m. UTC
  Add support to register timestamp dynamic field in mbuf.

Update the timestamp in mbuf for each packet before enqueuing
to event device if the timestamp is not already set.

Adding the timestamp in Rx adapter avoids additional latency
due to the event device.

Signed-off-by: Ganapati Kundapura <ganapati.kundapura@intel.com>

---
Depends-on: patch-97549(make Rx-adapter enqueue buffer as circular buffer)

v2:
* Removed rte_ prefix from the internal function

v1:
* Add support to register timestamp dynamic field in mbuf
---
---
 lib/eventdev/rte_event_eth_rx_adapter.c | 33 +++++++++++++++++++++++++++++++++
 1 file changed, 33 insertions(+)
  

Comments

Jerin Jacob Sept. 28, 2021, 2:24 p.m. UTC | #1
On Thu, Sep 16, 2021 at 2:45 PM Ganapati Kundapura
<ganapati.kundapura@intel.com> wrote:
>
> Add support to register timestamp dynamic field in mbuf.
>
> Update the timestamp in mbuf for each packet before enqueuing
> to event device if the timestamp is not already set.
>
> Adding the timestamp in Rx adapter avoids additional latency
> due to the event device.
>
> Signed-off-by: Ganapati Kundapura <ganapati.kundapura@intel.com>
>
> ---
> Depends-on: patch-97549(make Rx-adapter enqueue buffer as circular buffer)
>
> v2:
> * Removed rte_ prefix from the internal function
>
> v1:
> * Add support to register timestamp dynamic field in mbuf
> ---
> ---
>  lib/eventdev/rte_event_eth_rx_adapter.c | 33 +++++++++++++++++++++++++++++++++
>  1 file changed, 33 insertions(+)
>
> diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c
> index f2dc695..fd79b28 100644
> --- a/lib/eventdev/rte_event_eth_rx_adapter.c
> +++ b/lib/eventdev/rte_event_eth_rx_adapter.c
> @@ -17,6 +17,7 @@
>  #include <rte_service_component.h>
>  #include <rte_thash.h>
>  #include <rte_interrupts.h>
> +#include <rte_mbuf_dyn.h>
>
>  #include "rte_eventdev.h"
>  #include "eventdev_pmd.h"
> @@ -240,6 +241,17 @@ struct eth_rx_queue_info {
>
>  static struct rte_event_eth_rx_adapter **event_eth_rx_adapter;
>
> +/* Enable dynamic timestamp field in mbuf */
> +uint64_t event_eth_rx_timestamp_dynflag;
> +int event_eth_rx_timestamp_dynfield_offset = -1;

# If the scope is only this file. Please make both as "static"
# Please fix the following check path and git log issue.


Wrong headline case:
                        "eventdev: update rx timestamp in mbuf using
mbuf dynamic field": rx --> Rx
Headline too long:
        eventdev: update rx timestamp in mbuf using mbuf dynamic field


Feel free to add my Acked-By in the next version.

> +
> +static inline rte_mbuf_timestamp_t *
> +rxa_timestamp_dynfield(struct rte_mbuf *mbuf)
> +{
> +       return RTE_MBUF_DYNFIELD(mbuf,
> +               event_eth_rx_timestamp_dynfield_offset, rte_mbuf_timestamp_t *);
> +}
> +
>  static inline int
>  rxa_validate_id(uint8_t id)
>  {
> @@ -890,8 +902,18 @@ rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
>         int do_rss;
>         uint16_t nb_cb;
>         uint16_t dropped;
> +       uint64_t ts, ts_mask;
>
>         if (!eth_rx_queue_info->ena_vector) {
> +               ts = m->ol_flags & event_eth_rx_timestamp_dynflag ?
> +                                               0 : rte_get_tsc_cycles();
> +
> +               /* 0xffff ffff ffff ffff if PKT_RX_TIMESTAMP is set,
> +                * otherwise 0
> +                */
> +               ts_mask = (uint64_t)(!(m->ol_flags &
> +                                      event_eth_rx_timestamp_dynflag)) - 1ULL;
> +
>                 /* 0xffff ffff if PKT_RX_RSS_HASH is set, otherwise 0 */
>                 rss_mask = ~(((m->ol_flags & PKT_RX_RSS_HASH) != 0) - 1);
>                 do_rss = !rss_mask && !eth_rx_queue_info->flow_id_mask;
> @@ -899,6 +921,9 @@ rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
>                         struct rte_event *ev;
>
>                         m = mbufs[i];
> +                       *rxa_timestamp_dynfield(m) = ts |
> +                                       (*rxa_timestamp_dynfield(m) & ts_mask);
> +
>                         ev = &buf->events[new_tail];
>
>                         rss = do_rss ? rxa_do_softrss(m, rx_adapter->rss_key_be)
> @@ -2238,6 +2263,14 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id,
>         event_eth_rx_adapter[id] = rx_adapter;
>         if (conf_cb == rxa_default_conf_cb)
>                 rx_adapter->default_cb_arg = 1;
> +
> +       if (rte_mbuf_dyn_rx_timestamp_register(
> +                       &event_eth_rx_timestamp_dynfield_offset,
> +                       &event_eth_rx_timestamp_dynflag) != 0) {
> +               RTE_EDEV_LOG_ERR("Error registering timestamp field in mbuf\n");
> +               return -rte_errno;
> +       }
> +
>         rte_eventdev_trace_eth_rx_adapter_create(id, dev_id, conf_cb,
>                 conf_arg);
>         return 0;
> --
> 2.6.4
>
  
Ganapati Kundapura Sept. 28, 2021, 3:47 p.m. UTC | #2
Hi Jerin,

> -----Original Message-----
> From: Jerin Jacob <jerinjacobk@gmail.com>
> Sent: 28 September 2021 19:55
> To: Kundapura, Ganapati <ganapati.kundapura@intel.com>
> Cc: Jayatheerthan, Jay <jay.jayatheerthan@intel.com>; dpdk-dev
> <dev@dpdk.org>; Yigit, Ferruh <ferruh.yigit@intel.com>
> Subject: Re: [PATCH v2] eventdev: update rx timestamp in mbuf using mbuf
> dynamic field
> 
> On Thu, Sep 16, 2021 at 2:45 PM Ganapati Kundapura
> <ganapati.kundapura@intel.com> wrote:
> >
> > Add support to register timestamp dynamic field in mbuf.
> >
> > Update the timestamp in mbuf for each packet before enqueuing to event
> > device if the timestamp is not already set.
> >
> > Adding the timestamp in Rx adapter avoids additional latency due to
> > the event device.
> >
> > Signed-off-by: Ganapati Kundapura <ganapati.kundapura@intel.com>
> >
> > ---
> > Depends-on: patch-97549(make Rx-adapter enqueue buffer as circular
> > buffer)
> >
> > v2:
> > * Removed rte_ prefix from the internal function
> >
> > v1:
> > * Add support to register timestamp dynamic field in mbuf
> > ---
> > ---
> >  lib/eventdev/rte_event_eth_rx_adapter.c | 33
> > +++++++++++++++++++++++++++++++++
> >  1 file changed, 33 insertions(+)
> >
> > diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c
> > b/lib/eventdev/rte_event_eth_rx_adapter.c
> > index f2dc695..fd79b28 100644
> > --- a/lib/eventdev/rte_event_eth_rx_adapter.c
> > +++ b/lib/eventdev/rte_event_eth_rx_adapter.c
> > @@ -17,6 +17,7 @@
> >  #include <rte_service_component.h>
> >  #include <rte_thash.h>
> >  #include <rte_interrupts.h>
> > +#include <rte_mbuf_dyn.h>
> >
> >  #include "rte_eventdev.h"
> >  #include "eventdev_pmd.h"
> > @@ -240,6 +241,17 @@ struct eth_rx_queue_info {
> >
> >  static struct rte_event_eth_rx_adapter **event_eth_rx_adapter;
> >
> > +/* Enable dynamic timestamp field in mbuf */ uint64_t
> > +event_eth_rx_timestamp_dynflag; int
> > +event_eth_rx_timestamp_dynfield_offset = -1;
> 
> # If the scope is only this file. Please make both as "static"
> # Please fix the following check path and git log issue.
> 
Updated timestamp variables to static

> 
> Wrong headline case:
>                         "eventdev: update rx timestamp in mbuf using mbuf dynamic
> field": rx --> Rx Headline too long:
>         eventdev: update rx timestamp in mbuf using mbuf dynamic field
> 
/workspace/sw/gkundap/LINUX/linux/scripts $ ./checkpatch.pl --version
Usage: ./checkpatch.pl [OPTION]... [FILE]...
Version: 0.32

/workspace/sw/gkundap/dpdk-upstream/dpdk-next-eventdev $ ./devtools/checkpatches.sh v3-0001-eventdev-update-Rx-timestamp-in-mbuf-using-mbuf-d.patch

1/1 valid patch
/workspace/sw/gkundap/dpdk-upstream/dpdk-next-eventdev $

/workspace/sw/gkundap/dpdk-upstream/dpdk-next-eventdev $ ./devtools/check-git-log.sh v3-0001-eventdev-update-Rx-timestamp-in-mbuf-using-mbuf-d.patch

1/1 valid patch
/workspace/sw/gkundap/dpdk-upstream/dpdk-next-eventdev $

> 
> Feel free to add my Acked-By in the next version.
Added in v3
> 
> > +
> > +static inline rte_mbuf_timestamp_t *
> > +rxa_timestamp_dynfield(struct rte_mbuf *mbuf) {
> > +       return RTE_MBUF_DYNFIELD(mbuf,
> > +               event_eth_rx_timestamp_dynfield_offset,
> > +rte_mbuf_timestamp_t *); }
> > +
> >  static inline int
> >  rxa_validate_id(uint8_t id)
> >  {
> > @@ -890,8 +902,18 @@ rxa_buffer_mbufs(struct
> rte_event_eth_rx_adapter *rx_adapter,
> >         int do_rss;
> >         uint16_t nb_cb;
> >         uint16_t dropped;
> > +       uint64_t ts, ts_mask;
> >
> >         if (!eth_rx_queue_info->ena_vector) {
> > +               ts = m->ol_flags & event_eth_rx_timestamp_dynflag ?
> > +                                               0 :
> > + rte_get_tsc_cycles();
> > +
> > +               /* 0xffff ffff ffff ffff if PKT_RX_TIMESTAMP is set,
> > +                * otherwise 0
> > +                */
> > +               ts_mask = (uint64_t)(!(m->ol_flags &
> > +
> > + event_eth_rx_timestamp_dynflag)) - 1ULL;
> > +
> >                 /* 0xffff ffff if PKT_RX_RSS_HASH is set, otherwise 0 */
> >                 rss_mask = ~(((m->ol_flags & PKT_RX_RSS_HASH) != 0) - 1);
> >                 do_rss = !rss_mask &&
> > !eth_rx_queue_info->flow_id_mask; @@ -899,6 +921,9 @@
> rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
> >                         struct rte_event *ev;
> >
> >                         m = mbufs[i];
> > +                       *rxa_timestamp_dynfield(m) = ts |
> > +                                       (*rxa_timestamp_dynfield(m) &
> > + ts_mask);
> > +
> >                         ev = &buf->events[new_tail];
> >
> >                         rss = do_rss ? rxa_do_softrss(m,
> > rx_adapter->rss_key_be) @@ -2238,6 +2263,14 @@
> rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id,
> >         event_eth_rx_adapter[id] = rx_adapter;
> >         if (conf_cb == rxa_default_conf_cb)
> >                 rx_adapter->default_cb_arg = 1;
> > +
> > +       if (rte_mbuf_dyn_rx_timestamp_register(
> > +                       &event_eth_rx_timestamp_dynfield_offset,
> > +                       &event_eth_rx_timestamp_dynflag) != 0) {
> > +               RTE_EDEV_LOG_ERR("Error registering timestamp field in
> mbuf\n");
> > +               return -rte_errno;
> > +       }
> > +
> >         rte_eventdev_trace_eth_rx_adapter_create(id, dev_id, conf_cb,
> >                 conf_arg);
> >         return 0;
> > --
> > 2.6.4
> >
  

Patch

diff --git a/lib/eventdev/rte_event_eth_rx_adapter.c b/lib/eventdev/rte_event_eth_rx_adapter.c
index f2dc695..fd79b28 100644
--- a/lib/eventdev/rte_event_eth_rx_adapter.c
+++ b/lib/eventdev/rte_event_eth_rx_adapter.c
@@ -17,6 +17,7 @@ 
 #include <rte_service_component.h>
 #include <rte_thash.h>
 #include <rte_interrupts.h>
+#include <rte_mbuf_dyn.h>
 
 #include "rte_eventdev.h"
 #include "eventdev_pmd.h"
@@ -240,6 +241,17 @@  struct eth_rx_queue_info {
 
 static struct rte_event_eth_rx_adapter **event_eth_rx_adapter;
 
+/* Enable dynamic timestamp field in mbuf */
+uint64_t event_eth_rx_timestamp_dynflag;
+int event_eth_rx_timestamp_dynfield_offset = -1;
+
+static inline rte_mbuf_timestamp_t *
+rxa_timestamp_dynfield(struct rte_mbuf *mbuf)
+{
+	return RTE_MBUF_DYNFIELD(mbuf,
+		event_eth_rx_timestamp_dynfield_offset, rte_mbuf_timestamp_t *);
+}
+
 static inline int
 rxa_validate_id(uint8_t id)
 {
@@ -890,8 +902,18 @@  rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
 	int do_rss;
 	uint16_t nb_cb;
 	uint16_t dropped;
+	uint64_t ts, ts_mask;
 
 	if (!eth_rx_queue_info->ena_vector) {
+		ts = m->ol_flags & event_eth_rx_timestamp_dynflag ?
+						0 : rte_get_tsc_cycles();
+
+		/* 0xffff ffff ffff ffff if PKT_RX_TIMESTAMP is set,
+		 * otherwise 0
+		 */
+		ts_mask = (uint64_t)(!(m->ol_flags &
+				       event_eth_rx_timestamp_dynflag)) - 1ULL;
+
 		/* 0xffff ffff if PKT_RX_RSS_HASH is set, otherwise 0 */
 		rss_mask = ~(((m->ol_flags & PKT_RX_RSS_HASH) != 0) - 1);
 		do_rss = !rss_mask && !eth_rx_queue_info->flow_id_mask;
@@ -899,6 +921,9 @@  rxa_buffer_mbufs(struct rte_event_eth_rx_adapter *rx_adapter,
 			struct rte_event *ev;
 
 			m = mbufs[i];
+			*rxa_timestamp_dynfield(m) = ts |
+					(*rxa_timestamp_dynfield(m) & ts_mask);
+
 			ev = &buf->events[new_tail];
 
 			rss = do_rss ? rxa_do_softrss(m, rx_adapter->rss_key_be)
@@ -2238,6 +2263,14 @@  rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id,
 	event_eth_rx_adapter[id] = rx_adapter;
 	if (conf_cb == rxa_default_conf_cb)
 		rx_adapter->default_cb_arg = 1;
+
+	if (rte_mbuf_dyn_rx_timestamp_register(
+			&event_eth_rx_timestamp_dynfield_offset,
+			&event_eth_rx_timestamp_dynflag) != 0) {
+		RTE_EDEV_LOG_ERR("Error registering timestamp field in mbuf\n");
+		return -rte_errno;
+	}
+
 	rte_eventdev_trace_eth_rx_adapter_create(id, dev_id, conf_cb,
 		conf_arg);
 	return 0;