[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2] x86/atomic: Improvements and simplifications to assembly constraints
>>> On 18.03.19 at 15:49, <andrew.cooper3@xxxxxxxxxx> wrote: > On 18/03/2019 14:11, Andrew Cooper wrote: >> >>>> @@ -63,36 +65,38 @@ static always_inline __uint128_t cmpxchg16b_local_( >>>> * If no fault occurs then _o is updated to the value we saw at _p. If >>>> this >>>> * is the same as the initial value of _o then _n is written to location >>>> _p. >>>> */ >>>> -#define __cmpxchg_user(_p,_o,_n,_isuff,_oppre,_regtype) \ >>>> +#define __cmpxchg_user(_p, _o, _n, _oppre) \ >>>> stac(); \ >>>> asm volatile ( \ >>>> - "1: lock; cmpxchg"_isuff" %"_oppre"2,%3\n" \ >>>> + "1: lock cmpxchg %"_oppre"[new], %[ptr]\n" \ >>>> "2:\n" \ >>>> ".section .fixup,\"ax\"\n" \ >>>> - "3: movl $1,%1\n" \ >>>> + "3: movl $1, %[rc]\n" \ >>>> " jmp 2b\n" \ >>>> ".previous\n" \ >>>> _ASM_EXTABLE(1b, 3b) \ >>>> - : "=a" (_o), "=r" (_rc) \ >>>> - : _regtype (_n), "m" (*__xg((volatile void *)_p)), "0" (_o), "1" >>>> (0) \ >>>> + : "+a" (_o), [rc] "=r" (_rc), \ >>>> + [ptr] "+m" (*(volatile typeof(*(_p)) *)(_p)) \ >>>> + : [new] "r" (_n), "[rc]" (0) \ >>> Wouldn't it further help readability a little if _rc was initialized to zero >>> right when getting declared, eliminating the last input arg here (the >>> output then would need to be "+r" of course)? >> I can do. > > I've got the following incremental fix which I intend to fold in. LGTM. Jan > diff --git a/xen/include/asm-x86/x86_64/system.h > b/xen/include/asm-x86/x86_64/system.h > index 5b6e964..d65562b 100644 > --- a/xen/include/asm-x86/x86_64/system.h > +++ b/xen/include/asm-x86/x86_64/system.h > @@ -65,7 +65,7 @@ static always_inline __uint128_t cmpxchg16b_local_( > * If no fault occurs then _o is updated to the value we saw at _p. If this > * is the same as the initial value of _o then _n is written to location > _p. > */ > -#define __cmpxchg_user(_p, _o, _n, _oppre) \ > +#define __cmpxchg_user(_p, _o, _n, _rc, _oppre) \ > stac(); \ > asm volatile ( \ > "1: lock cmpxchg %"_oppre"[new], %[ptr]\n" \ > @@ -75,28 +75,29 @@ static always_inline __uint128_t cmpxchg16b_local_( > " jmp 2b\n" \ > ".previous\n" \ > _ASM_EXTABLE(1b, 3b) \ > - : "+a" (_o), [rc] "=r" (_rc), \ > + : "+a" (_o), [rc] "+r" (_rc), \ > [ptr] "+m" (*(volatile typeof(*(_p)) *)(_p)) \ > - : [new] "r" (_n), "[rc]" (0) \ > + : [new] "r" (_n) \ > : "memory"); \ > clac() > > #define cmpxchg_user(_p, _o, _n) \ > ({ \ > - int _rc; \ > + int _rc = 0; \ > + \ > switch ( sizeof(*(_p)) ) \ > { \ > case 1: \ > - __cmpxchg_user(_p, _o, _n, "b"); \ > + __cmpxchg_user(_p, _o, _n, _rc, "b"); \ > break; \ > case 2: \ > - __cmpxchg_user(_p, _o, _n, "w"); \ > + __cmpxchg_user(_p, _o, _n, _rc, "w"); \ > break; \ > case 4: \ > - __cmpxchg_user(_p, _o, _n, "k"); \ > + __cmpxchg_user(_p, _o, _n, _rc, "k"); \ > break; \ > case 8: \ > - __cmpxchg_user(_p, _o, _n, "q"); \ > + __cmpxchg_user(_p, _o, _n, _rc, "q"); \ > break; \ > } \ > _rc; \ _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |