public inbox for elfutils@sourceware.org
 help / color / mirror / Atom feed
From: Mark Wielaard <mark@klomp.org>
To: Heather McIntyre <hsm2@rice.edu>, elfutils-devel@sourceware.org
Cc: John Mellor-Crummey <johnmc@rice.edu>
Subject: Re: [PATCH] Fix thread-safety for elfutils
Date: Sat, 14 Oct 2023 17:39:28 +0200	[thread overview]
Message-ID: <7e00014702b125aa4a9e0cc4534e1bffdbbe3d0a.camel@klomp.org> (raw)
In-Reply-To: <301fac87e83ebbbd677750579ae9a3429b461bdf.camel@klomp.org>

Hi Heather,

On Tue, 2023-10-10 at 15:40 +0200, Mark Wielaard wrote:
> Very nice. That is a lot of work. And I must admit that I cannot hold
> that much work in my little head at the same time. So I have split up
> your commit into (what I hope are) logical independent parts. That will
> make it easier to review. I might have split it into too many parts,
> but that at least makes it easier to just add those parts that are
> trivially correct.
> 
> The only changes I made were:
> 1. Move the ChangeLog entries into the commit message
>    (This is something we do now and makes cherry picking small
>     changes easier, but I see it isn't actually documented
>     in CONTRIBUTING, sorry. I'll try to update that.)
> 2. Fixed up some Copyright notices as discussed off-list.
> 3. Made some whitespace/indentation changes which made the
>    diffs slightly smaller (in most cases).
> 
> I'll comment/review the individual commits. Which I'll post to the
> list.

So I commented on each one individually.
Below is the summary. I have pushed 4 patches to git trunk already.
I am suggesting to drop 2 changes, but please feel free to say we
really need them. I have some questions about the rest, but some are
minor issues. In general I really like the direction of this.

Hope my splitting of your patch isn't too confusing. But it really
helps me review separate smaller independent parts. And it makes it so
we can push more of your changes early.

> Heather McIntyre (16):
>       lib: Add new once_define and once macros to eu-config.h

Looks good. Added to main branch.

>       libelf: Make elf_version thread-safe

Looks good. Added to main branch.
Question whether this could also have been done with atomics?

>       libelf: Fix deadlock in __libelf_readall

I think the locking here is subtly wrong in the case of
elf->map_address != NULL

Suggest to look into rewriting libelf_acquire_all and
libelf_release_all to libelf_acquire_all_children and
libelf_release_all_children (which would only be called
with the elf->lock already acquired).

>       libelf: Fix deadlock in elf_cntl

Looks correct, but can probably be simplified by just relying on
if (__libelf_readall (elf) == NULL)

>       libelf: Fix elf_end deadlock

Looks good. Added to main branch.

>       libelf: Make elf32_getchdr and elf64_getchdr thread-safe

Looks good. Just needs elf32_getchdr.h added to noinst_HEADERS.
Pushed to the main branch with that change.

>       lib: Add eu_tsearch and eu_tfind

I think this would work. But I really like to discuss whether we can
have more fine grained locking. The static global lock will likely
cause too much contention. I added a similar change to noinst_HEADERS
as above for eu-search.h.

>       libcpu: Change calls for tsearch/tfind to eu_tsearch/eu_tfind.

Suggest to drop this for now. It will need a twalk wrapper. And I am
not sure it will be easy to make the bison parser concurrent as a
whole. This is for libasm, not libdw, so can imho be handled separately
if we really want to make libasm also completely thread-safe.

>       src: Use eu-search in nm and findtextrel.

Although this works, I don't think it is needed because eu-nm and eu-
findtextrel are single threaded utilities.

>       libdw: make dwarf_getalt thread-safe

I think this should also include dwarf_setalt. Also lets discuss
whether the locking is done correctly.

>       libdw: Add locking around __libdw_dieabbrev for dwarf_hasattr

I think this is also incomplete. dwarf_child, dwarf_getattrs,
dwarf_haschildren and dwarf_tag also call __libdw_dieabbrev. I am also
concerned this locking is very "heavy". Lets discuss whether there is
an alternative way to update the die->abbrev in a thead-safe way.

>       libdw: Make libdw_find_split_unit thread-safe

I have some concerns about whether the locking is complete/wide enough.

>       libdw: Make libdw_findcu thread-safe

Looks mostly correct. Question about whether this could be a per struct
Dwarf lock and whether the lock should also be added for the
dwarf_formref_die call to __libdw_intern_next_unit.

>       libdw,libdwfl: Use eu-search for thread-safety

These all look good.  Just have to think about whether the global
static lock currently used in eu-search is the right approach.

>       tests: Add eu-search tests

I am enthusiastic about having these new tests. Some suggestions to
simplify the mechanics. I also have updated the Copyright on the new
files. Could you look into the invocation of eu_search_macros. Maybe I
am misinterpreting how this should be used. But it looks like this will
always fail.

>       configure: No longer mark --enable-thread-safety as EXPERIMENTAL

Looks good. Will push once at least all libelf patches are in.
Note, your NEWS entry seems missing.

> Which can also be found here:
> https://code.wildebeest.org/git/user/mjw/elfutils/log/?h=thread-safety

I have updated that git branch with some of the suggestions above and
removed the commits that have already been pushed.

Thanks,

Mark

  parent reply	other threads:[~2023-10-14 15:39 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-08 17:07 Heather McIntyre
2023-08-21 22:08 ` John Mellor-Crummey
2023-08-25 14:10   ` Mark Wielaard
2023-10-10 13:40 ` Mark Wielaard
2023-10-10 13:42   ` [PATCH 01/16] lib: Add new once_define and once macros to eu-config.h Mark Wielaard
2023-10-10 13:42     ` [PATCH 02/16] libelf: Make elf_version thread-safe Mark Wielaard
2023-10-10 14:00       ` Mark Wielaard
2023-10-17 19:05         ` Heather McIntyre
2023-10-19 21:00           ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 03/16] libelf: Fix deadlock in __libelf_readall Mark Wielaard
2023-10-10 15:06       ` Mark Wielaard
2023-10-17 19:11         ` Heather McIntyre
2023-11-09 13:26           ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 04/16] libelf: Fix deadlock in elf_cntl Mark Wielaard
2023-10-10 15:23       ` Mark Wielaard
2023-10-17 19:14         ` Heather McIntyre
2023-10-10 13:42     ` [PATCH 05/16] libelf: Fix elf_end deadlock Mark Wielaard
2023-10-10 15:28       ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 06/16] libelf: Make elf32_getchdr and elf64_getchdr thread-safe Mark Wielaard
2023-10-10 16:28       ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 07/16] lib: Add eu_tsearch and eu_tfind Mark Wielaard
2023-10-10 16:51       ` Mark Wielaard
2023-10-17 20:52         ` Heather McIntyre
2023-10-10 13:42     ` [PATCH 08/16] libcpu: Change calls for tsearch/tfind to eu_tsearch/eu_tfind Mark Wielaard
2023-10-10 21:10       ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 09/16] src: Use eu-search in nm and findtextrel Mark Wielaard
2023-10-10 21:25       ` Mark Wielaard
2023-10-17 19:20         ` Heather McIntyre
2023-10-10 13:42     ` [PATCH 10/16] libdw: make dwarf_getalt thread-safe Mark Wielaard
2023-10-10 22:02       ` Mark Wielaard
2023-10-17 19:25         ` Heather McIntyre
2023-10-10 13:42     ` [PATCH 11/16] libdw: Add locking around __libdw_dieabbrev for dwarf_hasattr Mark Wielaard
2023-10-11 15:10       ` Mark Wielaard
2023-10-17 19:57       ` Heather McIntyre
2023-10-19 22:06         ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 12/16] libdw: Make libdw_find_split_unit thread-safe Mark Wielaard
2023-10-11 17:17       ` Mark Wielaard
2023-10-17 20:01         ` Heather McIntyre
2023-10-10 13:42     ` [PATCH 13/16] libdw: Make libdw_findcu thread-safe Mark Wielaard
2023-10-12 22:02       ` Mark Wielaard
2023-10-17 20:10         ` Heather McIntyre
2023-10-10 13:42     ` [PATCH 14/16] libdw,libdwfl: Use eu-search for thread-safety Mark Wielaard
2023-10-12 22:05       ` Mark Wielaard
2023-10-10 13:42     ` [PATCH 15/16] tests: Add eu-search tests Mark Wielaard
2023-10-13 14:38       ` Mark Wielaard
2023-10-10 13:43     ` [PATCH 16/16] configure: No longer mark --enable-thread-safety as EXPERIMENTAL Mark Wielaard
2023-10-12 22:09       ` Mark Wielaard
2023-10-10 13:54     ` [PATCH 01/16] lib: Add new once_define and once macros to eu-config.h Mark Wielaard
2023-10-14 15:39   ` Mark Wielaard [this message]
2023-10-14 18:29     ` [PATCH] Fix thread-safety for elfutils Heather McIntyre
2023-10-17 15:04       ` Mark Wielaard

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=7e00014702b125aa4a9e0cc4534e1bffdbbe3d0a.camel@klomp.org \
    --to=mark@klomp.org \
    --cc=elfutils-devel@sourceware.org \
    --cc=hsm2@rice.edu \
    --cc=johnmc@rice.edu \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).