Advertisement
Guest User

0001-ARM64-add-support-for-atomic-operations.patch

a guest
Sep 6th, 2016
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. From 6e0a3975a66fb14d7b5d029d3e460dc5410f1621 Mon Sep 17 00:00:00 2001
  2. From: Adam Oleksy <adam.oleksy@nokia.com>
  3. Date: Tue, 6 Sep 2016 11:53:09 +0200
  4. Subject: [PATCH] ARM64: add support for atomic operations
  5.  
  6. ---
  7. arch/arm/include/asm/atomic.h | 43 +++++++++++++++++++++++++++++++++++++++++++
  8. 1 file changed, 43 insertions(+)
  9.  
  10. diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
  11. index 9b79506..bc9f717 100644
  12. --- a/arch/arm/include/asm/atomic.h
  13. +++ b/arch/arm/include/asm/atomic.h
  14. @@ -29,6 +29,8 @@ typedef struct { volatile int counter; } atomic_t;
  15.  
  16. #define atomic_read(v) ((v)->counter)
  17. #define atomic_set(v,i) (((v)->counter) = (i))
  18. +#define atomic64_read(v) atomic_read(v)
  19. +#define atomic64_set(v,i) atomic_set(v,i)
  20.  
  21. static inline void atomic_add(int i, volatile atomic_t *v)
  22. {
  23. @@ -101,6 +103,47 @@ static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
  24. local_irq_restore(flags);
  25. }
  26.  
  27. +#if BITS_PER_LONG == 32
  28. +typedef struct { volatile long long counter; } atomic64_t;
  29. +static inline void atomic64_sub(long long i, volatile atomic64_t *v)
  30. +{
  31. + unsigned long flags = 0;
  32. +
  33. + local_irq_save(flags);
  34. + v->counter -= i;
  35. + local_irq_restore(flags);
  36. +}
  37. +#else /* BIT_PER_LONG == 32 */
  38. +typedef struct { volatile long counter; } atomic64_t;
  39. +
  40. +static inline void atomic64_sub(long i, volatile atomic64_t *v)
  41. +{
  42. + unsigned long flags = 0;
  43. +
  44. + local_irq_save(flags);
  45. + v->counter -= i;
  46. + local_irq_restore(flags);
  47. +}
  48. +#endif
  49. +
  50. +static inline void atomic64_inc(volatile atomic64_t *v)
  51. +{
  52. + unsigned long flags = 0;
  53. +
  54. + local_irq_save(flags);
  55. + v->counter += 1;
  56. + local_irq_restore(flags);
  57. +}
  58. +
  59. +static inline void atomic64_dec(volatile atomic64_t *v)
  60. +{
  61. + unsigned long flags = 0;
  62. +
  63. + local_irq_save(flags);
  64. + v->counter -= 1;
  65. + local_irq_restore(flags);
  66. +}
  67. +
  68. /* Atomic operations are already serializing on ARM */
  69. #define smp_mb__before_atomic_dec() barrier()
  70. #define smp_mb__after_atomic_dec() barrier()
  71. --
  72. 2.6.2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement