From: Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
To: Tyler Retzlaff <roretzla@linux.microsoft.com>
Cc: dev@dpdk.org, thomas@monjalon.net, anatoly.burakov@intel.com,
Narcisa Vasile <navasile@microsoft.com>
Subject: Re: [PATCH v2 2/6] eal: add thread lifetime management
Date: Wed, 22 Jun 2022 01:24:14 +0300 [thread overview]
Message-ID: <20220622012414.09abc32a@sovereign> (raw)
In-Reply-To: <20220621212823.GF18214@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net>
2022-06-21 14:28 (UTC-0700), Tyler Retzlaff:
> On Tue, Jun 21, 2022 at 10:44:21PM +0300, Dmitry Kozlyuk wrote:
> > 2022-06-21 11:51 (UTC-0700), Tyler Retzlaff:
> > > > > +int
> > > > > +rte_thread_join(rte_thread_t thread_id, unsigned long *value_ptr)
> > > > > +{
> > > > > + int ret = 0;
> > > > > + void *res = NULL;
> > > > > + void **pres = NULL;
> > > > > +
> > > > > + if (value_ptr != NULL)
> > > > > + pres = &res;
> > > > > +
> > > > > + ret = pthread_join((pthread_t)thread_id.opaque_id, pres);
> > > > > + if (ret != 0) {
> > > > > + RTE_LOG(DEBUG, EAL, "pthread_join failed\n");
> > > > > + return ret;
> > > > > + }
> > > > > +
> > > > > + if (value_ptr != NULL && *pres != NULL)
> > > > > + *value_ptr = *(unsigned long *)(*pres);
> > > > > +
> > > > > + return 0;
> > > > > +}
> > > >
> > > > What makes *pres == NULL special?
> > >
> > > it's not clear what you mean, can you explain? maybe there is some
> > > context i am missing from the original patch series?
> >
> > There's no previous context.
> > After ptread_join(), *pres holds the return value of the thread routine.
> > You only assign *value_ptr if value_ptr is not NULL (obviously correct)
> > and if *pres != NULL, that is, if the thread returned a non-NULL value.
> > But this value is opaque, why do you filter NULL?
>
> i don't think it is opaque here? unsigned long * value_ptr says we have
> to store an integer. which leads to a discussion of what should get
> stored at the value_ptr location if pthread_join() itself returns no
> result but the caller of rte_thread_join() requests the result.
There is no question. If `pthread_join()` fails, the function exits early
and `*value_ptr` remains unmodified. If `pthread_join()` succeeds
with a non-NULL second argument (`pres`), `*pres` aka `res` is always filled.
NULL can be placed there too if that's what the thread routine has returned.
>
> > Perhaps you meant if (pres != NULL), no dereference?
>
> that i think is just a repeat of a test checking if the caller of
> rte_thread_join is interested in the result?
> i.e. value_ptr != NULL -> pres != NULL
>
> both pres and *pres are dereferenced so it seems to track that prior to
> those dereferences they have to be validated as being non-NULL.
> i don't see how we could avoid dereferencing **pres to satisfy the
> calling contract when the result is requested.
>
> now if value_ptr was unsigned long ** i guess i'd understand. i could
> always be reading the code wrong. but thinking about further there is
> another problem with this in that we really don't know what is being
> aliased in *pres when using the pthread implementation, since pthread
> could be returning a pointer to something narrow or with unknown layout
> where later dereferencing it as something wider or in this case
> specifically as unsigned long * would have horrible consequences.
Sorry, no, it's just all wrong.
We get a pointer from `pthread_join()` and store it in `res`,
which can also be accessed as `*pres`, because `pres == &res`.
Then we store the lower bits of `res` in an `*value_ptr`.
We don't care what `res` points to because it is never dereferenced.
>
> i think this ends up semi-related to your other comment about what the
> result type from rte_thread_func is, we can discuss offline and post
> details back to the list.
next prev parent reply other threads:[~2022-06-21 22:24 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-09 13:58 [PATCH 0/6] add thread lifetime and attributes API Tyler Retzlaff
2022-06-09 13:58 ` [PATCH 1/6] eal: add thread attributes Tyler Retzlaff
2022-06-09 13:58 ` [PATCH 2/6] eal: add thread lifetime management Tyler Retzlaff
2022-06-09 13:58 ` [PATCH 3/6] eal: add basic rte thread ID equal API Tyler Retzlaff
2022-06-09 22:24 ` Konstantin Ananyev
2022-06-10 22:48 ` Tyler Retzlaff
2022-06-11 12:25 ` Konstantin Ananyev
2022-06-13 13:39 ` Tyler Retzlaff
2022-06-10 0:40 ` fengchengwen
2022-06-09 13:58 ` [PATCH 4/6] test/threads: add tests for thread lifetime API Tyler Retzlaff
2022-06-09 13:58 ` [PATCH 5/6] test/threads: add tests for thread attributes API Tyler Retzlaff
2022-06-09 13:58 ` [PATCH 6/6] test/threads: remove unit test use of pthread Tyler Retzlaff
2022-06-14 23:47 ` [PATCH v2 0/6] add thread lifetime and attributes API Tyler Retzlaff
2022-06-14 23:47 ` [PATCH v2 1/6] eal: add thread attributes Tyler Retzlaff
2022-06-14 23:47 ` [PATCH v2 2/6] eal: add thread lifetime management Tyler Retzlaff
2022-06-18 12:59 ` Dmitry Kozlyuk
2022-06-20 17:39 ` Tyler Retzlaff
2022-06-21 16:24 ` Tyler Retzlaff
2022-06-21 18:51 ` Tyler Retzlaff
2022-06-21 19:44 ` Dmitry Kozlyuk
2022-06-21 21:28 ` Tyler Retzlaff
2022-06-21 22:24 ` Dmitry Kozlyuk [this message]
2022-06-22 18:21 ` Tyler Retzlaff
2022-06-14 23:47 ` [PATCH v2 3/6] eal: add basic rte thread ID equal API Tyler Retzlaff
2022-06-20 8:34 ` Konstantin Ananyev
2022-06-14 23:47 ` [PATCH v2 4/6] test/threads: add tests for thread lifetime API Tyler Retzlaff
2022-06-14 23:47 ` [PATCH v2 5/6] test/threads: add tests for thread attributes API Tyler Retzlaff
2022-06-14 23:47 ` [PATCH v2 6/6] test/threads: remove unit test use of pthread Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 0/6] add thread lifetime and attributes API Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 1/6] eal: add thread attributes Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 2/6] eal: add thread lifetime management Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 3/6] eal: add basic rte thread ID equal API Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 4/6] test/threads: add tests for thread lifetime API Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 5/6] test/threads: add tests for thread attributes API Tyler Retzlaff
2022-06-22 20:26 ` [PATCH v3 6/6] test/threads: remove unit test use of pthread Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 0/6] add thread lifetime and attributes API Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 1/6] eal: add thread attributes Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 2/6] eal: add thread lifetime management Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 3/6] eal: add basic rte thread ID equal API Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 4/6] test/threads: add tests for thread lifetime API Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 5/6] test/threads: add tests for thread attributes API Tyler Retzlaff
2022-06-27 16:56 ` [PATCH v4 6/6] test/threads: remove unit test use of pthread Tyler Retzlaff
2022-07-31 21:16 ` [PATCH v4 0/6] add thread lifetime and attributes API Dmitry Kozlyuk
2022-09-21 8:15 ` David Marchand
2022-09-29 7:02 ` David Marchand
2022-10-05 16:11 ` Tyler Retzlaff
2022-10-05 16:34 ` Tyler Retzlaff
2022-10-06 6:52 ` David Marchand
2022-10-06 15:14 ` Tyler Retzlaff
2022-10-06 13:36 ` Thomas Monjalon
2022-10-06 15:10 ` Tyler Retzlaff
2022-10-06 15:14 ` Thomas Monjalon
2022-10-06 15:20 ` Tyler Retzlaff
2022-10-06 15:26 ` David Marchand
2022-10-06 15:27 ` Tyler Retzlaff
2022-10-05 17:07 ` [PATCH v5 " Tyler Retzlaff
2022-10-05 17:07 ` [PATCH v5 1/6] eal: add thread attributes Tyler Retzlaff
2022-10-06 8:32 ` David Marchand
2022-10-05 17:07 ` [PATCH v5 2/6] eal: add thread lifetime management Tyler Retzlaff
2023-03-01 8:11 ` David Marchand
2023-03-01 20:34 ` Tyler Retzlaff
2022-10-05 17:07 ` [PATCH v5 3/6] eal: add basic rte thread ID equal API Tyler Retzlaff
2022-10-05 17:07 ` [PATCH v5 4/6] test/threads: add tests for thread lifetime API Tyler Retzlaff
2022-10-06 8:32 ` David Marchand
2022-10-06 15:19 ` Tyler Retzlaff
2022-10-05 17:07 ` [PATCH v5 5/6] test/threads: add tests for thread attributes API Tyler Retzlaff
2022-10-05 17:07 ` [PATCH v5 6/6] test/threads: remove unit test use of pthread Tyler Retzlaff
2022-10-06 19:25 ` [PATCH v5 0/6] add thread lifetime and attributes API David Marchand
2022-10-07 19:20 ` Tyler Retzlaff
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=20220622012414.09abc32a@sovereign \
--to=dmitry.kozliuk@gmail.com \
--cc=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
--cc=navasile@microsoft.com \
--cc=roretzla@linux.microsoft.com \
--cc=thomas@monjalon.net \
/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.