[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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.