[CRIU] [PATCH] arm: fix compilation on ARMv6
Ruslan Kuprieiev
kupruser at gmail.com
Mon Dec 22 03:25:32 PST 2014
22.12.2014 13:16, Andrew Vagin пишет:
> Cc: Ruslan Kuprieiev <kupruser at gmail.com>
> Signed-off-by: Andrew Vagin <avagin at openvz.org>
> ---
> arch/arm/include/asm/atomic.h | 61 +++++++++++++++++++++++++----------------
> 1 file changed, 37 insertions(+), 24 deletions(-)
>
> diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
> index 04faf58..cd0df37 100644
> --- a/arch/arm/include/asm/atomic.h
> +++ b/arch/arm/include/asm/atomic.h
> @@ -14,10 +14,47 @@ typedef struct {
>
> #define smp_mb() __asm__ __volatile__ ("dmb" : : : "memory")
>
> +static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
> +{
> + int oldval;
> + unsigned long res;
> +
> + smp_mb();
> + prefetchw(&ptr->counter);
> +
> + do {
> + __asm__ __volatile__("@ atomic_cmpxchg\n"
> + "ldrex %1, [%3]\n"
> + "mov %0, #0\n"
> + "teq %1, %4\n"
> + "strexeq %0, %5, [%3]\n"
> + : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
> + : "r" (&ptr->counter), "Ir" (old), "r" (new)
> + : "cc");
> + } while (res);
> +
> + smp_mb();
> +
> + return oldval;
> +}
> +
> #elif defined(CONFIG_ARMV6)
>
> +/* SMP isn't supported for ARMv6 */
> +
> #define smp_mb() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory")
>
> +static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
> +{
> + int ret;
> +
> + ret = v->counter;
> + if (ret == old)
> + v->counter = new;
> +
I have a better one with raw_local_irq_*. =)
I will send it ASAP.
> + return ret;
> +}
> +
> #else
>
> #error ARM architecture version (CONFIG_ARMV*) not set or unsupported.
> @@ -91,28 +128,4 @@ static inline int atomic_dec(atomic_t *v) { return atomic_sub_return(1, v) + 1;
>
> #define atomic_inc_return(v) (atomic_add_return(1, v))
>
> -static inline int atomic_cmpxchg(atomic_t *ptr, int old, int new)
> -{
> - int oldval;
> - unsigned long res;
> -
> - smp_mb();
> - prefetchw(&ptr->counter);
> -
> - do {
> - __asm__ __volatile__("@ atomic_cmpxchg\n"
> - "ldrex %1, [%3]\n"
> - "mov %0, #0\n"
> - "teq %1, %4\n"
> - "strexeq %0, %5, [%3]\n"
> - : "=&r" (res), "=&r" (oldval), "+Qo" (ptr->counter)
> - : "r" (&ptr->counter), "Ir" (old), "r" (new)
> - : "cc");
> - } while (res);
> -
> - smp_mb();
> -
> - return oldval;
> -}
> -
> #endif /* __CR_ATOMIC_H__ */
>
More information about the CRIU
mailing list