On Thu, 2016-09-15 at 09:22 +0200, Jakub Jelinek wrote:
> These days on many targets that use dl_iterate_phdr to find .eh_frame_hdr
> that way in most of the programs the old style EH registry is never used,
> yet we still lock a global mutex and unlock it soon afterwards to find out
> it is the case.
> This patch adds a fast path to that, by replacing that with an atomic load
> of a flag "has anything ever been registered in the old style registry"
> and if the flag says no, it avoids the locking.
I think this needs a more detailed reasoning about the synchronization,
and comments in the code that explain this reasoning. For example,
there are no comments why you need the acquire/release pair, nor what
the requirements or external synchronization is that would make it
sufficient to use relaxed memory order.
The current code with the critical sections seems to only ensure that
_Unwind_Find_FDE observes calls to __register_frame_info_bases or
__register_frame_info_table_bases if those already happen-before
(referring to the so-called relation in the memory model) the
_Unwind_Find_FDE call. This happen-before can be due to other
synchronization or sequenced-before.
If that is all you need, relaxed MO would be sufficient, but then this
should get documented. If that's not all that you need, then what the
patch adds seems insufficient (as well as the existing code).
The acquire/release pair you currently have in the patch would ensure
that the changes to unseen_objects are observed if
any_objects_registered is either 0 or 1; if 1, you use the critical
section, so the critical section that stores the 1 that you read from
would happen-before the _Unwind_Find_FDE critical section anyway. If
one observes 0, I guess you don't have any invariant wrt other stores
(that the caller would have to observe too).
Also, it might be possible that the critical section is required to
serve as a fence wrt something else, under some conditions. But that
would be a weird way to synchronize, so I guess that wouldn't be the
case. OTOH, I don't know enough about the callers, so maybe it's worth