Thread (45 messages) 45 messages, 6 authors, 2020-02-19

Re: Surprising code generated for vdso_read_begin()

From: Segher Boessenkool <hidden>
Date: 2020-01-09 20:08:27
Also in: linux-arm-kernel, linux-mips, lkml

On Thu, Jan 09, 2020 at 05:52:34PM +0000, Christophe Leroy wrote:
Wondering why we get something so complicated/redundant for 
vdso_read_begin() <include/vdso/helpers.h>

static __always_inline u32 vdso_read_begin(const struct vdso_data *vd)
{
	u32 seq;

	while ((seq = READ_ONCE(vd->seq)) & 1)
		cpu_relax();

	smp_rmb();
	return seq;
}


 6e0:   81 05 00 f0     lwz     r8,240(r5)
 6e4:   71 09 00 01     andi.   r9,r8,1
 6e8:   41 82 00 10     beq     6f8 <__c_kernel_clock_gettime+0x158>
 6ec:   81 05 00 f0     lwz     r8,240(r5)
 6f0:   71 0a 00 01     andi.   r10,r8,1
 6f4:   40 82 ff f8     bne     6ec <__c_kernel_clock_gettime+0x14c>
 6f8:

r5 being vd pointer

Why the first triplet, not only the second triplet ? Something wrong 
with using READ_ONCE() for that ?
It looks like the compiler did loop peeling.  What GCC version is this?
Please try current trunk (to become GCC 10), or at least GCC 9?


Segher
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help