public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Carlos O'Donell <carlos@redhat.com>
To: Florian Weimer <fweimer@redhat.com>, Rich Felker <dalias@libc.org>
Cc: libc-alpha@sourceware.org,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: Re: [PATCH v2 0/8] Extensible rseq integration
Date: Wed, 2 Feb 2022 19:37:28 -0500	[thread overview]
Message-ID: <d6d97c4b-b6d1-68b6-bb85-bf4667b0d811@redhat.com> (raw)
In-Reply-To: <87fsp235of.fsf@oldenburg.str.redhat.com>

On 2/1/22 11:36, Florian Weimer wrote:
> * Rich Felker:
> 
>> 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.
> 
> Well, I Cc:ed you on the original proposal in November, and cross-posted
> it to linux-api as well.
> 
>> 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.
> 
> I rejected that because the programming model is too complex: In the
> extreme, a library that observes rseq support on the main thread may be
> called again from another thread where rseq is not yet enabled, and
> cannot be enabled.
> 
> I think it is also necessary to enable it unconditionally to force
> people to actually implement support for it in their tools (e.g., CRIU).
> Otherwise we'll never get to the point where it is reliable.  I doubt
> we'd have learned about the CRIU issue by now unless we took that step.

Agreed.

>> 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.
> 
> I expect that asking for rseq to be implemented outside of libc is like
> asking for robust mutexes to be implemented outside libc: it's really
> pushing what can be done in a library.

This is a design decision that we made in glibc.

>> 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).
> 
> If the memory is not allocated, __rseq_size can be set to 0.
> 
>> 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.
> 
> Yes, you'll need a compiler barrier with LTO.  It's not different from
> other types of relocations.

Agreed.

At the language level the offset is constant.

Of the two choices, I think that making __rseq_offset non-const is pessimistic.

LTO and static linking must be aware of details outside of the language level
and may need to handle those details in an implementation defined manner.

>> 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.
> 
> Quoting for Mathieu's benefit.  Also Cc:ing Carlos as the release
> manager.

We have spent ~1.5 years correcting rseq integration since the initial attempt
in July 2020. The inclusion of __rseq is ready for glibc 2.35.

I plan to make the release with the ABI included.

I think we can continue to work with the musl community on integration issues.

-- 
Cheers,
Carlos.


      reply	other threads:[~2022-02-03  0:37 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 ` [PATCH v2 0/8] Extensible rseq integration Rich Felker
2022-02-01 16:36   ` Florian Weimer
2022-02-03  0:37     ` Carlos O'Donell [this message]

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=d6d97c4b-b6d1-68b6-bb85-bf4667b0d811@redhat.com \
    --to=carlos@redhat.com \
    --cc=dalias@libc.org \
    --cc=fweimer@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=mathieu.desnoyers@efficios.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 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).