This is the mail archive of the
mailing list for the libc-ports project.
RE: [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
- From: Abhishek Deb <adeb at nvidia dot com>
- To: Joseph Myers <joseph at codesourcery dot com>, Dinar Temirbulatov <dtemirbulatov at gmail dot com>
- Cc: "libc-ports at sourceware dot org" <libc-ports at sourceware dot org>
- Date: Tue, 3 Sep 2013 10:30:44 -0700
- Subject: RE: [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
- Authentication-results: sourceware.org; auth=none
- References: <CAMnfPmMADb=ZqSmC4J6=fMpQp56uGG8v9MKRj_Ly94kcXEtNZA at mail dot gmail dot com> <Pine dot LNX dot 4 dot 64 dot 1309021457010 dot 17654 at digraph dot polyomino dot org dot uk>
From the functionality point of view, the changes look ok.
An objdump of the atomic_compare_and_exchange_bool_acq shows the following:
60: e1903f9f ldrex r3, [r0]
64: e1530002 cmp r3, r2
68: 1a000003 bne 7c <local__lll_lock_wait+0x34>
6c: e1804f91 strex r4, r1, [r0]
70: e3540000 cmp r4, #0
74: 1afffff9 bne 60 <local__lll_lock_wait+0x18>
78: f57ff05f dmb sy
As you can see it contains only one dmb in the end and not in the beginning, which is in-line with acquire semantics to not allow any code hoisting.
From: Joseph Myers [mailto:firstname.lastname@example.org]
Sent: Monday, September 02, 2013 8:08 AM
To: Dinar Temirbulatov
Cc: email@example.com; Abhishek Deb
Subject: Re: [Patch] ARM define atomic_exchange_acq/atomic_exchange_rel to __atomic_exchange_n
On Mon, 2 Sep 2013, Dinar Temirbulatov wrote:
> Another version of change, I added
> l and
> rel defenitions and also for gcc-4.7 and higher in the case of
> unsupported atomic compare and swap operation, it uses the kernel
> helper inlines.
> Tested on arm a9 with no new regressions. Ok to commit?
> Oh, sorry. I missed to attach the change. Here it is.
For subsequent patch revisions, please note there should be an extra space after "#" for preprocessor directives inside #if conditionals, one per level of #if nesting (other than toplevel multiple-inclusion guards) - which means that if conditioning existing code, you need to adjust directives inside that code.
This patch appears to have too much duplication. For example, you duplicate the definition of __arm_assisted_compare_and_exchange_val_32_acq
- but that should not need any extra conditionals at all (beyond the existing #ifndef __arm_assisted_compare_and_exchange_val_32_acq), there's no reason ever not to define it. Similarly, you duplicate __arch_compare_and_exchange_val_64_acq, but with proper #if structure there should only need to be one copy of the version that uses __arm_link_error.
What I think you should aim for is that each definition, or small group of definitions, uses conditionals in the form
#if __GNUC_PREREQ (4, 7) && defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
/* Version using __atomic_*. */
#elif defined __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
/* Version using __sync_*. */
/* Version using __arm_assisted_*. */
with cases omitted if not useful for that particular macro (this may include some macros not being defined at all in some cases). So don't insert any global conditionals affecting all the existing definitions at all - look at each block of conditionals and add a third case as needed, along with any new macros (again with conditionals in that form) that are appropriate.
Where you use abort () in some definitions, use __arm_link_error () instead, like for the existing definitions.
Joseph S. Myers