[dpdk-dev] [PATCH v3 3/7] mbuf: add pool ops name selection API helpers

Olivier Matz olivier.matz at 6wind.com
Fri Jan 19 14:10:52 CET 2018


Hi Hemant,

On Fri, Jan 19, 2018 at 06:11:47PM +0530, Hemant Agrawal wrote:
> Hi Olivier,
> 
> On 1/19/2018 3:31 PM, Olivier Matz wrote:
> > On Thu, Jan 18, 2018 at 06:56:28PM +0530, Hemant Agrawal wrote:
> > > This patch add support for various mempool ops config helper APIs.
> > > 
> > > 1.User defined mempool ops
> > > 2.Platform detected HW mempool ops (active).
> > > 3.Best selection of mempool ops by looking into user defined,
> > >   platform registered and compile time configured.
> > > 
> > > Signed-off-by: Hemant Agrawal <hemant.agrawal at nxp.com>
> > > ---
> > 
> > ...
> > 
> > > --- /dev/null
> > > +++ b/lib/librte_mbuf/rte_mbuf_pool_ops.c
> > > @@ -0,0 +1,68 @@
> > > +/* SPDX-License-Identifier: BSD-3-Clause
> > > + * Copyright 2018 NXP
> > > + */
> > > +
> > > +#include <string.h>
> > > +#include <rte_eal.h>
> > > +#include <rte_mbuf.h>
> > > +#include <rte_errno.h>
> > > +#include <rte_mbuf_pool_ops.h>
> > > +#include <rte_malloc.h>
> > > +
> > > +static char *plat_mbuf_pool_ops_name;
> > 
> > I have some doubts about secondary processes.
> > 
> > Maybe it's ok if the loaded driver and eal arguments are exactly the
> > same in the secondary process. It would be safer to use a named memzone
> > for that.
> > 
> Typically a secondary process should not set the platform mempool name.
> I can also add a check to know if secondary process is trying to do it.
> 
> Yes. I can change it to a named memzone.

With a memzone, maybe there is even no need for a static variable.
Something like this?

set():
  mz = rte_memzone_lookup("mbuf_platform_pool_ops");
  if (mz == NULL) {
    mz = rte_memzone_reszerve("mbuf_platform_pool_ops", LEN);
    if (mz == NULL)
      return -rte_errno; /* << this even protects against a set() in a 2nd process */
  }
  if (strlen(name) >= LEN)
    return -ENAMETOOLONG;
  strncpy(mz->addr, name, LEN);


get():
  mz = rte_memzone_lookup("mbuf_platform_pool_ops");
  if (mz == NULL)
    return NULL;
  return mz->addr;


> 
> 
> > It would be even safer to not use secondary processes ;)
> > 
> > 
> > > +
> > > +int
> > > +rte_mbuf_register_platform_mempool_ops(const char *ops_name)
> > > +{
> > 
> > We have "register" for platform and "set" for user.
> > I think "set" should be used everywhere.
> > 
> ok
> 
> > > +	if (plat_mbuf_pool_ops_name == NULL) {
> > > +		plat_mbuf_pool_ops_name =
> > > +			rte_malloc(NULL, RTE_MEMPOOL_OPS_NAMESIZE, 0);
> > > +		if (plat_mbuf_pool_ops_name == NULL)
> > > +			return -ENOMEM;
> > > +		strcpy((char *)plat_mbuf_pool_ops_name, ops_name);
> > 
> > If strlen(ops_name) >= RTE_MEMPOOL_OPS_NAMESIZE, this may lead to
> > bad behavior.
> > 
> That should not happen, we can check that.
> 
> > I suggest to simply do a strdup() instead.
> 
> Well, strdup based string will not be readable/accessible from the secondary
> process?

Correct.
something to check the length should be added though.


More information about the dev mailing list