[ltt-dev] [PATCH] fix the "unknown" case

Paul E. McKenney paulmck at linux.vnet.ibm.com
Mon Jun 14 14:25:57 EDT 2010


On Mon, Jun 14, 2010 at 07:04:43PM +0200, Paolo Bonzini wrote:
> On 06/13/2010 11:28 PM, Paul E. McKenney wrote:
> >On Sun, Jun 13, 2010 at 05:20:34PM -0400, Mathieu Desnoyers wrote:
> >>* Paul E. McKenney (paulmck at linux.vnet.ibm.com) wrote:
> >>>On Thu, Jun 10, 2010 at 09:46:31PM -0400, Mathieu Desnoyers wrote:
> >>
> >>[...]
> >>
> >>(will reply to the rest in the individual patches)
> >>
> >>>>Can we trust __sync_lock_test_and_set/__sync_add_and_fetch given that
> >>>>__sync_synchronize is broken ?
> >>>
> >>>I don't know yet.  If it turns out that we cannot, then I will use some
> >>>form of global locking.  But the __sync_lock_test_and_set() do at least
> >>>generate instructions, unlike __sync_synchronize().  ;-)
> >>
> >>I'm concerned about the fact that their synchronization primitives might have
> >>the assembly all with, except for the memory barriers.
> 
> The default implementation of these __sync_* builtins is based on
> cmpxchg, and will cause a link error unless cmpxchg is also
> available (either in libgcc or with a compiler-provided inline
> implementation).
> 
> Instead, the default implementation of __sync_synchronize is to just
> do a compiler barrier.  ARM implements __sync_synchronize only for
> Linux, so at least there it is not needed.  Strange that Paul needs
> it too.

When I use __sync_synchronize(), I get failures from the rcutorture_urcu_mb
stress test.  When I use a "dmb" instruction, I don't get any failures.

No idea why, to be honest.

> Anyway, a simple configure test is to compile this with -fdump-rtl-expand:
> 
> 	int
> 	f()
> 	{
> 	  __sync_synchronize();
> 	}
> 
> If the assembly output includes "__sync_synchronize", or the dump
> file includes the text "unspec:BLK", it should be fine.  In
> particular, ia64, mips, and Alpha are ok.  Else you can use the
> pthreads trick.  I can try to make a patch if you're interested.
> Or, more simply, it's possible to hardcode the above three platforms
> since it's unlikely that others will be added soon.

And I attached the input file, the .expand file, and the .s file.

I see neither __sync_synchronize in the .s file nor "unspec" in the
.expand file.  Or was I confused about what to look for?

							Thanx, Paul
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sync_sync.c
Type: text/x-csrc
Size: 35 bytes
Desc: sync_sync.c
URL: <http://lists.casi.polymtl.ca/pipermail/lttng-dev/attachments/20100614/20bd70cd/attachment-0003.c>
-------------- next part --------------
	.arch armv6
	.eabi_attribute 27, 3
	.fpu vfp
	.eabi_attribute 20, 1
	.eabi_attribute 21, 1
	.eabi_attribute 23, 3
	.eabi_attribute 24, 1
	.eabi_attribute 25, 1
	.eabi_attribute 26, 2
	.eabi_attribute 30, 6
	.eabi_attribute 18, 4
	.file	"sync_sync.c"
	.text
	.align	2
	.global	f
	.type	f, %function
f:
	@ args = 0, pretend = 0, frame = 0
	@ frame_needed = 1, uses_anonymous_args = 0
	@ link register save eliminated.
	str	fp, [sp, #-4]!
	add	fp, sp, #0
	add	sp, fp, #0
	ldmfd	sp!, {fp}
	bx	lr
	.size	f, .-f
	.ident	"GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1"
	.section	.note.GNU-stack,"",%progbits
-------------- next part --------------

;; Function f (f)


;; Generating RTL for gimple basic block 2


;;
;; Full RTL generated for this function:
;;
(note 1 0 3 NOTE_INSN_DELETED)

(note 3 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)

(note 2 3 4 2 NOTE_INSN_FUNCTION_BEG)

(note 4 2 5 3 [bb 3] NOTE_INSN_BASIC_BLOCK)

(insn 5 4 14 3 sync_sync.c:4 (parallel [
            (asm_operands/v ("") ("") 0 []
                 [] 477)
            (clobber (mem:BLK (scratch) [0 A8]))
        ]) -1 (nil))

(note 14 5 8 4 [bb 4] NOTE_INSN_BASIC_BLOCK)

(insn 8 14 9 4 sync_sync.c:5 (clobber (reg/i:SI 0 r0)) -1 (nil))

(insn 9 8 10 4 sync_sync.c:5 (clobber (reg:SI 133 [ <result> ])) -1 (nil))

(jump_insn 10 9 11 4 sync_sync.c:5 (set (pc)
        (label_ref 12)) -1 (nil))

(barrier 11 10 6)

(code_label 6 11 15 5 1 "" [0 uses])

(note 15 6 7 5 [bb 5] NOTE_INSN_BASIC_BLOCK)

(insn 7 15 12 5 sync_sync.c:5 (set (reg/i:SI 0 r0)
        (reg:SI 133 [ <result> ])) -1 (nil))

(code_label 12 7 16 6 2 "" [1 uses])

(note 16 12 13 6 [bb 6] NOTE_INSN_BASIC_BLOCK)

(insn 13 16 0 6 sync_sync.c:5 (use (reg/i:SI 0 r0)) -1 (nil))


More information about the lttng-dev mailing list