[v2,1/2] mbuf: add function returning default buffer address

Message ID 20190109131908.4949-1-yskoh@mellanox.com (mailing list archive)
State Superseded, archived
Delegated to: Thomas Monjalon
Headers
Series [v2,1/2] mbuf: add function returning default buffer address |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/mellanox-Performance-Testing fail Performance Testing issues
ci/intel-Performance-Testing success Performance Testing PASS
ci/Intel-compilation success Compilation OK

Commit Message

Yongseok Koh Jan. 9, 2019, 1:19 p.m. UTC
  This patch introduces two new functions - rte_mbuf_buf_addr_default() and
rte_mbuf_data_baddr_default().

rte_mbuf_buf_addr_default() reutrns the default buffer address of given
mbuf which comes after mbuf structure and private data.

rte_mbuf_data_baddr_default() returns the default address of mbuf data
taking the headroom into account.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
---

v2:
* initial implementation

 lib/librte_mbuf/rte_mbuf.h | 43 ++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 40 insertions(+), 3 deletions(-)
  

Comments

David Marchand Jan. 9, 2019, 1:46 p.m. UTC | #1
On Wed, Jan 9, 2019 at 2:19 PM Yongseok Koh <yskoh@mellanox.com> wrote:

> This patch introduces two new functions - rte_mbuf_buf_addr_default() and
> rte_mbuf_data_baddr_default().
>
> rte_mbuf_buf_addr_default() reutrns the default buffer address of given
> mbuf which comes after mbuf structure and private data.
>

The buffer address should always be the same for a given mbuf, there is no
"default" value for it, there is only one value.
So for me s/rte_mbuf_buf_addr_default/rte_mbuf_buf_addr/g.


> rte_mbuf_data_baddr_default() returns the default address of mbuf data
> taking the headroom into account.
>

Or just rte_mbuf_data_addr_default() ?


> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
>

Those are new functions, they should go through the EXPERIMENTAL api
marking process.
  
Rami Rosen Jan. 10, 2019, 1:39 a.m. UTC | #2
Hi, Yongseok,

Maybe you should consider using the pool member of the mbuf, instead of
passing it as a parameter for rte_mbuf_buf_addr_default().
The pool member of mbuf indicates the pool from which it was allocated.
See
http://git.dpdk.org/dpdk/tree/lib/librte_mbuf/rte_mbuf.h#n631

And actually the is exactly what you do in the second method,
rte_mbuf_data_baddr_default(),
when invoking the first,  this is also kind of non consistency.

>> David Marchand wrote:

> So for me s/rte_mbuf_buf_addr_default/rte_mbuf_buf_addr/g


> Or just rte_mbuf_data_addr_default() ?

+ 1

>> David Marchand wrote:

>Those are new functions, they should go through the EXPERIMENTAL api

>marking process.


+1

Regards,
Rami Rosen

בתאריך יום ד׳, 9 בינו׳ 2019, 15:47, מאת David Marchand <
david.marchand@redhat.com>:

> On Wed, Jan 9, 2019 at 2:19 PM Yongseok Koh <yskoh@mellanox.com> wrote:
>
> > This patch introduces two new functions - rte_mbuf_buf_addr_default() and
> > rte_mbuf_data_baddr_default().
> >
> > rte_mbuf_buf_addr_default() reutrns the default buffer address of given
> > mbuf which comes after mbuf structure and private data.
> >
>
> The buffer address should always be the same for a given mbuf, there is no
> "default" value for it, there is only one value.
> So for me s/rte_mbuf_buf_addr_default/rte_mbuf_buf_addr/g.
>
>
> > rte_mbuf_data_baddr_default() returns the default address of mbuf data
> > taking the headroom into account.
> >
>
> Or just rte_mbuf_data_addr_default() ?
>
>
> > Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> >
>
> Those are new functions, they should go through the EXPERIMENTAL api
> marking process.
>
>
> --
> David Marchand
>
  
Yongseok Koh Jan. 10, 2019, 6:18 p.m. UTC | #3
> On Jan 9, 2019, at 5:39 PM, Rami Rosen <roszenrami@gmail.com> wrote:
> 
> Hi, Yongseok,
> 
> Maybe you should consider using the pool member of the mbuf, instead of passing it as a parameter for rte_mbuf_buf_addr_default().
> The pool member of mbuf indicates the pool from which it was allocated.
> See 
> http://git.dpdk.org/dpdk/tree/lib/librte_mbuf/rte_mbuf.h#n631
> 
> And actually the is exactly what you do in the second method, rte_mbuf_data_baddr_default(), when invoking the first,  this is also kind of non consistency.

Original intention is to not access mbuf struct to avoid any potential load stall.
I've mentioned it in the comments.
For example, on Rx, mbuf mempool is known to PMD and there's only one mempool,
it doesn't need to pull the pointer from mbuf struct.

So, idea is to know the initial buf_addr without accessing mbuf struct.

Thanks,
Yongseok

> >> David Marchand wrote: 
> > So for me s/rte_mbuf_buf_addr_default/rte_mbuf_buf_addr/g
> > Or just rte_mbuf_data_addr_default() ?
> + 1
> >> David Marchand wrote: 
> >Those are new functions, they should go through the EXPERIMENTAL api
> >marking process.
> 
> +1 
> 
> Regards,
> Rami Rosen
> 
> בתאריך יום ד׳, 9 בינו׳ 2019, 15:47, מאת David Marchand <david.marchand@redhat.com>:
> On Wed, Jan 9, 2019 at 2:19 PM Yongseok Koh <yskoh@mellanox.com> wrote:
> 
> > This patch introduces two new functions - rte_mbuf_buf_addr_default() and
> > rte_mbuf_data_baddr_default().
> >
> > rte_mbuf_buf_addr_default() reutrns the default buffer address of given
> > mbuf which comes after mbuf structure and private data.
> >
> 
> The buffer address should always be the same for a given mbuf, there is no
> "default" value for it, there is only one value.
> So for me s/rte_mbuf_buf_addr_default/rte_mbuf_buf_addr/g.
> 
> 
> > rte_mbuf_data_baddr_default() returns the default address of mbuf data
> > taking the headroom into account.
> >
> 
> Or just rte_mbuf_data_addr_default() ?
> 
> 
> > Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> >
> 
> Those are new functions, they should go through the EXPERIMENTAL api
> marking process.
> 
> 
> -- 
> David Marchand
  
Yongseok Koh Jan. 10, 2019, 6:22 p.m. UTC | #4
On Jan 9, 2019, at 5:46 AM, David Marchand <david.marchand@redhat.com<mailto:david.marchand@redhat.com>> wrote:


On Wed, Jan 9, 2019 at 2:19 PM Yongseok Koh <yskoh@mellanox.com<mailto:yskoh@mellanox.com>> wrote:
This patch introduces two new functions - rte_mbuf_buf_addr_default() and
rte_mbuf_data_baddr_default().

rte_mbuf_buf_addr_default() reutrns the default buffer address of given
mbuf which comes after mbuf structure and private data.

The buffer address should always be the same for a given mbuf, there is no "default" value for it, there is only one value.
So for me s/rte_mbuf_buf_addr_default/rte_mbuf_buf_addr/g.

+1



rte_mbuf_data_baddr_default() returns the default address of mbuf data
taking the headroom into account.

Or just rte_mbuf_data_addr_default() ?

+1



Signed-off-by: Yongseok Koh <yskoh@mellanox.com<mailto:yskoh@mellanox.com>>

Those are new functions, they should go through the EXPERIMENTAL api marking process.

If that's the rule, I'll follow anyway, although these are too obvious to be experimental.

Thanks,
Yongseok
  

Patch

diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h
index bc562dc8a9..6c4c1bd3e8 100644
--- a/lib/librte_mbuf/rte_mbuf.h
+++ b/lib/librte_mbuf/rte_mbuf.h
@@ -788,8 +788,47 @@  rte_mbuf_from_indirect(struct rte_mbuf *mi)
 }
 
 /**
+ * Return the default buffer address of the mbuf.
+ *
+ * @param mb
+ *   The pointer to the mbuf.
+ * @param mp
+ *   The pointer to the mempool of the mbuf.
+ * @return
+ *   The pointer of the mbuf buffer.
+ */
+static inline char *
+rte_mbuf_buf_addr_default(struct rte_mbuf *mb, struct rte_mempool *mp)
+{
+	char *buffer_addr;
+
+	buffer_addr = (char *)mb + sizeof(*mb) + rte_pktmbuf_priv_size(mp);
+	return buffer_addr;
+}
+
+
+/**
+ * Return the default address of the beginning of the mbuf data.
+ *
+ * @param mb
+ *   The pointer to the mbuf.
+ * @return
+ *   The pointer of the beginning of the mbuf data.
+ */
+static inline char *
+rte_mbuf_data_baddr_default(struct rte_mbuf *mb)
+{
+	return rte_mbuf_buf_addr_default(mb, mb->pool) + RTE_PKTMBUF_HEADROOM;
+}
+
+/**
  * Return the buffer address embedded in the given mbuf.
  *
+ * Note that accessing mempool pointer of a mbuf is expensive because the
+ * pointer is stored in the 2nd cache line of mbuf. If mempool is known, it
+ * is better not to reference the mempool pointer in mbuf but calling
+ * rte_mbuf_buf_addr_default() would be more efficient.
+ *
  * @param md
  *   The pointer to the mbuf.
  * @return
@@ -798,9 +837,7 @@  rte_mbuf_from_indirect(struct rte_mbuf *mi)
 static inline char *
 rte_mbuf_to_baddr(struct rte_mbuf *md)
 {
-	char *buffer_addr;
-	buffer_addr = (char *)md + sizeof(*md) + rte_pktmbuf_priv_size(md->pool);
-	return buffer_addr;
+	return rte_mbuf_buf_addr_default(md, md->pool);
 }
 
 /**