All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Monjalon <thomas@monjalon.net>
To: Andrew Rybchenko <arybchenko@solarflare.com>
Cc: dev@dpdk.org, gaetan.rivet@6wind.com, ophirmu@mellanox.com,
	ferruh.yigit@intel.com
Subject: Re: [PATCH 2/5] ethdev: add an iterator to match some devargs input
Date: Mon, 08 Oct 2018 09:58:44 +0200	[thread overview]
Message-ID: <2689730.oytcUrqQT6@xps> (raw)
In-Reply-To: <8689ac9f-c5dd-aa29-8f8b-e32674338160@solarflare.com>

08/10/2018 09:06, Andrew Rybchenko:
> On 10/8/18 1:25 AM, Thomas Monjalon wrote:
> > --- a/lib/librte_eal/common/include/rte_common.h
> > +++ b/lib/librte_eal/common/include/rte_common.h
> > @@ -164,6 +164,12 @@ static void __attribute__((destructor(RTE_PRIO(prio)), used)) func(void)
> >    */
> >   #define RTE_PTR_DIFF(ptr1, ptr2) ((uintptr_t)(ptr1) - (uintptr_t)(ptr2))
> >   
> > +/**
> > + * Workaround to cast a const field of a structure to non-const type.
> > + */
> > +#define RTE_CAST_FIELD(var,field,type) \
> 
> Missing space after each comma.
> 
> > +	(*(type*)((uintptr_t)(var) + offsetof(typeof(*(var)), field)))
> > +
> 
> In general it is bad symptom that we need it. I'd think more that twice
> before adding it :)

Yes, I tried to remove const in the struct but it brings other problems
when assigning const to the non-const fields.
And I think it was a good idea (from Gaetan) to give const hint to these
fields as they are not changed at each iteration.

So yes, it is a nasty hack, but I feel it is the best tradeoff.

[...]
> > --- a/lib/librte_ethdev/rte_ethdev.c
> > +++ b/lib/librte_ethdev/rte_ethdev.c
> > +	/* Split bus, device and parameters. */
> > +	ret = rte_devargs_parse(&devargs, devargs_str);
> 
> rte_devargs_parse() does strdup() for args. It requires free() in the 
> function
> if devargs parsed successfully, but init fails.
> In the case of success it is moved to cls_str which is 'const' and I see
> not code which frees it as well.

Oh yes, you're right!

[...]
> > +	do { /* loop for matching rte_device */
> > +		if (iter->class_device == NULL) {
> > +			iter->device = iter->bus->dev_iterate(
> > +					iter->device, iter->bus_str, iter);
> > +			if (iter->device == NULL)
> > +				break;
> > +		}
> > +		iter->class_device = iter->cls->dev_iterate(
> > +				iter->class_device, iter->cls_str, iter);
> > +		if (iter->class_device != NULL)
> > +			return eth_dev_to_id(iter->class_device);
> > +	} while (iter->class_device == NULL);
> 
> It is non-obvious what is happening above. It would be very useful to
> add comments which explains it. May be just hints.

OK I will try to add good comments.

> > +
> > +	/* No more ethdev port to iterate. */
> > +	free(RTE_CAST_FIELD(iter, bus_str, char *)); /* workaround const */
> > +	iter->bus_str = NULL;
> 
> Who does it if RTE_ETH_FOREACH_MATCHING_DEV caller breaks
> the loop before reaching maximum?

If the app breaks the loop, it becomes a responsibility of the app.
It is documented for the functions but not the macro.
I should add a comment in the doxygen of the macro, thanks.

[...]
> > +#define RTE_ETH_FOREACH_MATCHING_DEV(id, devargs, iter) \
> > +	for (rte_eth_iterator_init(iter, devargs), \
> > +	     id = rte_eth_iterator_next(iter); \
> > +	     id != RTE_MAX_ETHPORTS; \
> > +	     id = rte_eth_iterator_next(iter))
> > +
> 
> Such iterators are very convenient, but in this particular case
> it is a source of non-obvious memory leaks and necessity
> of the hack to discard 'const'.
> 
> May be iterator free callback with its own opaque data
> can help to avoid these hacks with const discard?
> I.e. rte_eth_iterator_free() which does the job and mentioned
> in the rte_eth_iterator_init() and the macro description.

Yes, definitely, I will add rte_eth_iterator_free().

Thanks for the very good review!

  reply	other threads:[~2018-10-08  7:58 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-07 22:25 [PATCH 0/5] replace attach/detach functions Thomas Monjalon
2018-10-07 22:25 ` [PATCH 1/5] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-08  6:46   ` Andrew Rybchenko
2018-10-08  7:47     ` Thomas Monjalon
2018-10-07 22:25 ` [PATCH 2/5] ethdev: add an iterator to match some devargs input Thomas Monjalon
2018-10-08  7:06   ` Andrew Rybchenko
2018-10-08  7:58     ` Thomas Monjalon [this message]
2018-10-07 22:25 ` [PATCH 3/5] ethdev: allow iterating with only class filter Thomas Monjalon
2018-10-08  7:20   ` Andrew Rybchenko
2018-10-08  8:07     ` Thomas Monjalon
2018-10-08  9:13       ` Andrew Rybchenko
2018-10-07 22:25 ` [PATCH 4/5] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-08  7:28   ` Andrew Rybchenko
2018-10-08  8:09     ` Thomas Monjalon
2018-10-07 22:25 ` [PATCH 5/5] eal: " Thomas Monjalon
2018-10-09  0:16 ` [PATCH v2 0/6] replace " Thomas Monjalon
2018-10-09  0:16   ` [PATCH v2 1/6] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-09  9:17     ` Andrew Rybchenko
2018-10-09  0:16   ` [PATCH v2 2/6] ethdev: add iterator to match devargs input Thomas Monjalon
2018-10-09  9:31     ` Andrew Rybchenko
2018-10-09  9:49       ` Thomas Monjalon
2018-10-09  0:16   ` [PATCH v2 3/6] ethdev: allow iterating with pure class filter Thomas Monjalon
2018-10-09  9:40     ` Andrew Rybchenko
2018-10-09  0:16   ` [PATCH v2 4/6] doc: replace doxygen example in contribution guide Thomas Monjalon
2018-10-09  9:41     ` Andrew Rybchenko
2018-10-09  0:16   ` [PATCH v2 5/6] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-09  9:43     ` Andrew Rybchenko
2018-10-09  0:16   ` [PATCH v2 6/6] eal: " Thomas Monjalon
2018-10-09  9:44     ` Andrew Rybchenko
2018-10-09 13:34 ` [PATCH v3 0/6] replace " Thomas Monjalon
2018-10-09 13:34   ` [PATCH v3 1/6] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-09 13:34   ` [PATCH v3 2/6] ethdev: add iterator to match devargs input Thomas Monjalon
2018-10-09 14:17     ` Thomas Monjalon
2018-10-09 13:34   ` [PATCH v3 3/6] ethdev: allow iterating with pure class filter Thomas Monjalon
2018-10-09 13:34   ` [PATCH v3 4/6] doc: replace doxygen example in contribution guide Thomas Monjalon
2018-10-09 13:34   ` [PATCH v3 5/6] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-09 13:34   ` [PATCH v3 6/6] eal: " Thomas Monjalon
2018-10-09 22:33 ` [PATCH v4 0/6] replace " Thomas Monjalon
2018-10-09 22:33   ` [PATCH v4 1/6] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-09 22:33   ` [PATCH v4 2/6] ethdev: add iterator to match devargs input Thomas Monjalon
2018-10-16 10:58     ` Ferruh Yigit
2018-10-16 12:06       ` Thomas Monjalon
2018-10-09 22:33   ` [PATCH v4 3/6] ethdev: allow iterating with pure class filter Thomas Monjalon
2018-10-09 22:33   ` [PATCH v4 4/6] doc: replace doxygen example in contribution guide Thomas Monjalon
2018-10-09 22:33   ` [PATCH v4 5/6] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-16 11:03     ` Ferruh Yigit
2018-10-16 12:12       ` Thomas Monjalon
2018-10-09 22:33   ` [PATCH v4 6/6] eal: " Thomas Monjalon
2018-10-18  1:35 ` [PATCH v5 0/7] replace " Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 1/7] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 2/7] ethdev: add iterator to match devargs input Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 3/7] ethdev: allow iterating with pure class filter Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 4/7] doc: replace doxygen example in contribution guide Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 5/7] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 6/7] eal: " Thomas Monjalon
2018-10-18  1:35   ` [PATCH v5 7/7] app/testpmd: check not detaching device twice Thomas Monjalon
2018-10-18  1:45     ` Thomas Monjalon
2018-10-22 12:31 ` [PATCH v6 0/7] replace attach/detach functions Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 1/7] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 2/7] ethdev: add iterator to match devargs input Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 3/7] ethdev: allow iterating with pure class filter Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 4/7] doc: replace doxygen example in contribution guide Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 5/7] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 6/7] eal: " Thomas Monjalon
2018-10-22 12:31   ` [PATCH v6 7/7] app/testpmd: check not detaching device twice Thomas Monjalon
2018-10-22 15:11   ` [PATCH v6 0/7] replace attach/detach functions Iremonger, Bernard
2018-10-22 15:38     ` Thomas Monjalon
2018-10-23  8:28 ` [PATCH v7 " Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 1/7] bus/vdev: add iteration filter on name Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 2/7] ethdev: add iterator to match devargs input Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 3/7] ethdev: allow iterating with pure class filter Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 4/7] doc: replace doxygen example in contribution guide Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 5/7] ethdev: remove deprecated attach/detach functions Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 6/7] eal: " Thomas Monjalon
2018-10-23  8:28   ` [PATCH v7 7/7] app/testpmd: check not detaching device twice Thomas Monjalon
2018-10-23 10:01     ` Iremonger, Bernard
2018-10-23 12:03       ` Thomas Monjalon
2018-10-23 12:13         ` Thomas Monjalon
2018-10-23 12:37           ` Thomas Monjalon
2018-10-23 14:06             ` Ferruh Yigit
2018-10-23 12:39           ` Iremonger, Bernard
2018-10-23 14:06   ` [PATCH v7 0/7] replace attach/detach functions Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2689730.oytcUrqQT6@xps \
    --to=thomas@monjalon.net \
    --cc=arybchenko@solarflare.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=gaetan.rivet@6wind.com \
    --cc=ophirmu@mellanox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.