[dpdk-dev] [PATCH v2 04/18] eal: add lightweight kvarg parsing utility

Gaëtan Rivet gaetan.rivet at 6wind.com
Fri Mar 23 14:12:36 CET 2018


On Fri, Mar 23, 2018 at 07:54:11AM -0400, Neil Horman wrote:
> On Fri, Mar 23, 2018 at 10:31:22AM +0100, Gaëtan Rivet wrote:
> > On Thu, Mar 22, 2018 at 08:53:49PM -0400, Neil Horman wrote:
> > > On Thu, Mar 22, 2018 at 05:27:51PM +0100, Gaëtan Rivet wrote:
> > > > On Thu, Mar 22, 2018 at 10:10:37AM -0400, Neil Horman wrote:
> > > > > On Wed, Mar 21, 2018 at 05:32:24PM +0000, Wiles, Keith wrote:
> > > > > > 
> > > > > > 
> > > > > > > On Mar 21, 2018, at 12:15 PM, Gaetan Rivet <gaetan.rivet at 6wind.com> wrote:
> > > > > > > 
> > > > > > > This library offers a quick way to parse parameters passed with a
> > > > > > > key=value syntax.
> > > > > > > 
> > > > > > > A single function is needed and finds the relevant element within the
> > > > > > > text. No dynamic allocation is performed. It is possible to chain the
> > > > > > > parsing of each pairs for quickly scanning a list.
> > > > > > > 
> > > > > > > This utility is private to the EAL and should allow avoiding having to
> > > > > > > move around the more complete librte_kvargs.
> > > > > > 
> > > > > > What is the big advantage with this code and the librte_kvargs code. Is it just no allocation, rte_kvargs needs to be build before parts of EAL or what?
> > > > > > 
> > > > > > My concern is we have now two flavors one in EAL and one in librte_kvargs, would it not be more reasonable to improve rte_kvargs to remove your objections? I am all for fast, better, stronger code :-)
> > > > > > 
> > > > > +1, this really doesn't make much sense to me.  Two parsing routines seems like
> > > > > its just asking for us to have to fix parsing bugs in two places.  If allocation
> > > > > is a concern, I don't see why you can't just change the malloc in
> > > > > rte_kvargs_parse to an automatic allocation on the stack, or a preallocation set
> > > > > of kvargs that can be shared from init time.
> > > > 
> > > > I think the existing allocation scheme is fine for other usages (in
> > > > drivers and so on). Not for what I wanted to do.
> > > > 
> > > Ok, but thats an adressable issue.  you can bifurcate the parse function to an
> > > internal function that accepts any preallocated kvargs struct, and export two
> > > wrapper functions, one which allocates the struct from the heap, another which
> > > allocated automatically on the stack.
> > > 
> > 
> > Sure, everything is possible.
> > 
> Ok.
> 
> > > > >                                               librte_kvargs isn't necessecarily
> > > > > the best parsing library ever, but its not bad, and it just seems wrong to go
> > > > > re-inventing the wheel.
> > > > > 
> > > > 
> > > > It serves a different purpose than the one I'm pursuing.
> > > > 
> > > > This helper is lightweight and private. If I wanted to integrate my
> > > > needs with librte_kvargs, I would be adding new functionalities, making
> > > > it more complex, and for a use-case that is useless for the vast
> > > > majority of users of the lib.
> > > > 
> > > Ok, to that end:
> > > 
> > > 1) Privacy is not an issue (at least from my understanding of what your doing).
> > > If we start with the assumption that librte_kvargs is capable of satisfying your
> > > needs (even if its not done in an optimal way), the fact that your version of
> > > the function is internal to the library doesn't seem overly relevant, unless
> > > theres something critical to that privacy that I'm missing.
> > > 
> > 
> > Privacy is only a point I brought up to say that the impact of this
> > function is minimal. People looking to parse their kvargs should not
> > have any ambiguity regarding how they should do so. Only librte_kvargs
> > is available.
> > 
> Ok, would you also council others developing dpdk apps to write their own
> parsing routines when what they needed was trivial for the existing library?
> You are people too :)
> 
> > > 2) Lightweight function  seems like something that can be integrated with
> > > librte_kvargs.  Looking at it, what may I ask in librte_kvargs is insufficiently
> > > non-performant for your needs, specifically?  We talked about the heap
> > > allocation above, is there something else? The string duplication perhaps?
> > > 
> > > 
> > 
> > Mostly the way to use it.
> > The filter strings are
> > bus=value,.../class=value,...
> > 
> > where either bus= list or class= list can be omitted, but at least one
> > must appear.
> > 
> Ok, so whats the problem with using librte_kvargs for that?  Is it that the list
> that acts as the value to the key isn't parsed out into its own set of tokens?
> That seems entirely addressable.
> 
> > I want to read a single kvarg. I do not want to parse the whole string.
> > the '/' signifies the end of the current layer.
> > 
> This makes it seem like librte_kvargs can handle this as a trivial case of its
> functionality.
> 
> > librte_kvargs does not care about those points. I cannot ask it to only
> > read either bus or class, as it would then throw an error for all the
> > other keys (which the EAL has necessarily no knowledge of).
> > 
> But you can ask it to read both, and within your libraries logic make the
> determination as to the validitiy of receiving both.  Alternatively you can
> modify the valid_keys check in kvargs to be a regex that matches on either bus
> or class, or accept an ignore parameter for keys that may appear but should be
> ignored in the light of other keys.  Theres lots of options here.
> 

No, I will not be adding regex parsing to express a set of acceptable
token :)

> > So I would need to:
> > 
> >   * Add a custom storage scheme
> >   * Add a custom parsing mode stopping at the first kvarg
> >   * Add an edge-case to ignore the '/', so as not to throw off the rest
> >     of the parsing (least it be considered part of the previous kvarg
> >     value field).
> > 
> > Seeing this, does adding those really specifics functionality help
> > librte_kvargs to be more useful and usable? I do not think so.
> > 
> I think you're overcomplicating this.
> How about enhancing librte_kvargs to make parsing configurable
> such that invalid keys get ignored rather than generate errors?
> 

Invalid keys can already be ignored, it's not an issue.

> > It would only serve to disrupt the library for a marginal use-case, with
> > the introduction of edge-cases that will blur the specs of the lib's
> > API, making it harder to avoid subtle bugs.
> > 
> What do you mean "disrupt the library"?  What is its purpose of a library if not
> to do the jobs we want it to?  If everyone created their own routine to do
> something that a library could do with some modifications, we'd be left with
> 1000 versions of the same routine.  If the existing library does 99% of what you
> want it to, lets ennumerate what the missing %1 is and make the change, not
> throw the baby out with the bathwater.
> 
> > Only way to do so sanely would be to add rte_parse_kv as part of
> > librte_kvargs, as is. But then the whole thing does not make sense IMO:
> > no one would care to use it, the maintainance effort is the same, the
> > likelyhood of bugs as well (but in the process we would disrupt the
> > distribution of librte_kvargs by moving it within the EAL).
> > 
> > I see no benefit to either solution.
> > 
> Again, thats an overcomplication.  As I read it, you have a need to interrogate
> a key/value string, whos contents may contain invalid keys (for your parsing
> purposes), and whos values may themselves be lists, correct?  If so, I don't see
> the problem in enhancing libkvargs to:
> 
> 1) Allow for the parsing routine to ignore invalid keys (or even ignore specific
> invalid keys, and trigger on any unknown keys)
> 
> 2) Allows for the subparsing of lists into their own set of tokens.
> 

What I would do if I wanted to use librte_kvargs, would be to duplicate
the input text, mangle it to respect the intended format, and feed it to
librte_kvargs for parsing. Then I would iterate over the pairs, and stop
on the two I'm concerned about.

What I dislike here:

  * I actually do the bulk of the parsing by hand (recognizing first a
    valid input, modifying it to respect the lib, and after iterating on
    the list of pairs and strcmp-ing the ones I want). This is approximately
    as complicated as the current helper function.

  * I have to move librte_kvargs in the EAL.

> > > > If that's really an issue, I'm better off simply removing rte_parse_kv
> > > > and writing the parsing by hand within my function. This would be ugly
> > > > and tedious, but less than moving librte_kvargs within EAL and changing
> > > > it to my needs.
> > > I don't think thats necessecary, I just think if you can ennumerate the items
> > > that are non-performant for your needs we can make some changes to librte_kvargs
> > > to optimize around them, or offer parsing options to avoid them, and in the
> > > process avoid some code duplication
> > > 
> > 
> > I think it makes sense to have specialized functions for specialized
> > use-cases, and forcing the code to be generic and work with all of them
> > will make it more complicated.
> > 
> This isn't specialized, its trivial.  Its just a trivial case that libkvargs
> isn't built to handle at the moment.  Lets get it there.
> 

My use-case is trivial. Putting it within the librte_kvargs makes it
more complicated to write. I hate this.

> > The genericity would only be worth it if people actually needed to parse
> > the device strings the same way I do. No one has any business doing so.
> > This genericity adds complexity and issues, without even being useful in
> > the first place.
> > 
> I really think you're trying to take a short cut here where none is needed, and
> I'm sorry, but I can't support that.

There are countably infinite solutions, we will probably reach one (and
it might even do what we want).

-- 
Gaëtan Rivet
6WIND


More information about the dev mailing list