[v2,1/2] mbuf: add function returning default buffer address
Checks
Commit Message
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
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.
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
>
> 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
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
@@ -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);
}
/**