Messages in this thread |  | | Subject | Re: Surprising code generated for vdso_read_begin() | From | Christophe Leroy <> | Date | Fri, 10 Jan 2020 07:45:44 +0100 |
| |
Le 09/01/2020 à 21:07, Segher Boessenkool a écrit : > 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? >
It is with GCC 5.5
https://mirrors.edge.kernel.org/pub/tools/crosstool/ doesn't have more recent than 8.1
With 8.1, the problem doesn't show up.
Thanks Christophe
|  |