public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Rich Felker <dalias@libc.org>
To: Florian Weimer <fweimer@redhat.com>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH v2 0/8] Extensible rseq integration
Date: Tue, 1 Feb 2022 10:21:12 -0500	[thread overview]
Message-ID: <20220201152112.GL7074@brightrain.aerifal.cx> (raw)
In-Reply-To: <cover.1638880888.git.fweimer@redhat.com>

On Tue, Dec 07, 2021 at 01:59:26PM +0100, Florian Weimer via Libc-alpha wrote:
> This series integrates the previous posted v2 for <thread_pointer.h>.
> 
> It incorporates Mathieu's and Paul E. McKenney suggestion to use a
> volatile read for rseq_abi.cpu_id access, using a new
> THREAD_GETMEM_VOLATILE macro.
> 
> The last patch in the series makes rseq registration consistent across
> threads.
> 
> Florian Weimer (8):
>   nptl: Add <thread_pointer.h> for defining __thread_pointer
>   nptl: Introduce <tcb-access.h> for THREAD_* accessors
>   nptl: Introduce THREAD_GETMEM_VOLATILE
>   nptl: Add rseq registration
>   Linux: Use rseq to accelerate sched_getcpu
>   nptl: Add glibc.pthread.rseq tunable to control rseq registration
>   nptl: Add public rseq symbols and <sys/rseq.h>
>   nptl: rseq failure after registration on main thread is fatal

I'm sorry for bringing this up so late; I wasn't aware that redesign
of the rseq ABI was taking place. I wish this had been discussed in a
cross-libc venue, since, in its current form, I don't think the ABI is
suitable for inclusion in, or use as a third-party library with, musl.

The most pressing issue I see is that it does not admit lazy
registration, which precludes it being implemented outside of libc
(because it has to hook into pthread_create) and imposes runtime cost
on programs which do not use it. RSEQ_CPU_ID_UNINITIALIZED exists to
inform the application about an uninitialized state, but the
application has no way to request an attempt at registration upon
seeing it. I think that would be easy to add. Basically it's just
making the syscall, which a consumer of the ABI could in theory do
itself, but it's probably best not to have it do that and instead have
registration mediated through the ABI/through libc.

Related to this, if rseq is implemented outside of libc, I'm not sure
if there's a safe way to ensure it's unregistered prior to thread
exit. It may already be possible but I haven't sufficiently convinced
myself.

On another issue, while this isn't entirely a show-stopper, I'm not a
fan of requiring constant __rseq_offset. This comes across as an
instance-specific hack to make up for GD TLS being slow, when we
already have a fully general solution to that which isn't being
deployed: TLSDESC. As it stands in the current ABI, whatever library
is providing rseq must be present at application startup; it can't be
dlopened. And due to the ABI this applies *even if* we just wanted to
make rseq always-fail in that case. The ABI simply doesn't admit not
having memory pre-reserved for every thread (note: the size is
something like a +30% increase to musl's per-thread memory usage and
will surely increase over time, which is a lot for something we don't
expect the vast majority of applications to use).

One minor and hopefully non-controversial declared-ABI issue I see is
that the __rseq_offset etc. objects are declared const, with a
pre-relro access hack used to modify them at runtime. This is
incompatible with LTO and static linking. If protecting them is
desired, they should be declared non-const but live in non-modifiable
memory, like string literals do. Otherwise a static linking LTO
compiler is free to copy the initial values directly into code.

I'm not sure what the right thing to do on the verge of release is. If
it were my choice, I would hold it back and wait until it was better
reviewed and these issues worked out before making it public API/ABI,
but I don't know what glibc's constraints here are and how to best
weigh them against the ability to revise this ABI after release. Most
of these things I think *are* of the sort that can be fixed in
non-breaking ways, except that applications written to the current
version might need to adjust before they can use a version of the
API/ABI we'd be willing to adopt in musl.

Rich

  parent reply	other threads:[~2022-02-01 15:21 UTC|newest]

Thread overview: 33+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-12-07 12:59 Florian Weimer
2021-12-07 13:00 ` [PATCH 1/8] nptl: Add <thread_pointer.h> for defining __thread_pointer Florian Weimer
2021-12-08 11:05   ` Szabolcs Nagy
2021-12-08 17:55     ` Florian Weimer
2021-12-09 11:52       ` Szabolcs Nagy
2021-12-07 13:00 ` [PATCH v2 2/8] nptl: Introduce <tcb-access.h> for THREAD_* accessors Florian Weimer
2021-12-08 11:09   ` Szabolcs Nagy
2021-12-07 13:00 ` [PATCH v2 3/8] nptl: Introduce THREAD_GETMEM_VOLATILE Florian Weimer
2021-12-08 11:23   ` Szabolcs Nagy
2021-12-07 13:01 ` [PATCH 4/8] nptl: Add rseq registration Florian Weimer
2021-12-08 16:51   ` Szabolcs Nagy
2021-12-08 18:03   ` Siddhesh Poyarekar
2021-12-08 18:08     ` Florian Weimer
2021-12-08 23:27       ` Siddhesh Poyarekar
2021-12-09  7:42         ` Florian Weimer
2021-12-09  8:01           ` Siddhesh Poyarekar
2021-12-09  1:51   ` Noah Goldstein
2021-12-07 13:02 ` [PATCH v2 5/8] Linux: Use rseq to accelerate sched_getcpu Florian Weimer
2021-12-08 16:53   ` Szabolcs Nagy
2021-12-07 13:02 ` [PATCH v2 6/8] nptl: Add glibc.pthread.rseq tunable to control rseq registration Florian Weimer
2021-12-08 17:22   ` Szabolcs Nagy
2021-12-08 18:03   ` Siddhesh Poyarekar
2021-12-09  8:03     ` Siddhesh Poyarekar
2021-12-07 13:03 ` [PATCH 7/8] nptl: Add public rseq symbols and <sys/rseq.h> Florian Weimer
2021-12-08 17:34   ` Szabolcs Nagy
2021-12-09 12:26   ` Szabolcs Nagy
2021-12-09 12:34     ` Florian Weimer
2021-12-09 12:36     ` Szabolcs Nagy
2021-12-07 13:04 ` [PATCH v2 8/8] nptl: rseq failure after registration on main thread is fatal Florian Weimer
2021-12-08 17:36   ` Szabolcs Nagy
2022-02-01 15:21 ` Rich Felker [this message]
2022-02-01 16:36   ` [PATCH v2 0/8] Extensible rseq integration Florian Weimer
2022-02-03  0:37     ` Carlos O'Donell

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=20220201152112.GL7074@brightrain.aerifal.cx \
    --to=dalias@libc.org \
    --cc=fweimer@redhat.com \
    --cc=libc-alpha@sourceware.org \
    /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).