Whamcloud - gitweb
Check "sbi->s_mb_history" before using it.
[fs/lustre-release.git] / lustre / kernel_patches / patches / atomic_add_return-sles9.patch
1 Index: linux-2.6.5-7.283/include/asm-i386/atomic.h
2 ===================================================================
3 --- linux-2.6.5-7.283.orig/include/asm-i386/atomic.h
4 +++ linux-2.6.5-7.283/include/asm-i386/atomic.h
5 @@ -2,6 +2,7 @@
6  #define __ARCH_I386_ATOMIC__
7  
8  #include <linux/config.h>
9 +#include <linux/bitops.h>
10  
11  /*
12   * Atomic operations that C can't guarantee us.  Useful for
13 @@ -176,6 +177,47 @@ static __inline__ int atomic_add_negativ
14         return c;
15  }
16  
17 +/**
18 + * atomic_add_return - add and return
19 + * @v: pointer of type atomic_t
20 + * @i: integer value to add
21 + *
22 + * Atomically adds @i to @v and returns @i + @v
23 + */
24 +static __inline__ int atomic_add_return(int i, atomic_t *v)
25 +{
26 +       int __i;
27 +#ifdef CONFIG_M386
28 +       unsigned long flags;
29 +       if(unlikely(boot_cpu_data.x86==3))
30 +               goto no_xadd;
31 +#endif
32 +       /* Modern 486+ processor */
33 +       __i = i;
34 +       __asm__ __volatile__(
35 +               LOCK_PREFIX "xaddl %0, %1"
36 +               :"+r" (i), "+m" (v->counter)
37 +               : : "memory");
38 +       return i + __i;
39 +
40 +#ifdef CONFIG_M386
41 +no_xadd: /* Legacy 386 processor */
42 +       local_irq_save(flags);
43 +       __i = atomic_read(v);
44 +       atomic_set(v, i + __i);
45 +       local_irq_restore(flags);
46 +       return i + __i;
47 +#endif
48 +}
49 +
50 +static __inline__ int atomic_sub_return(int i, atomic_t *v)
51 +{
52 +       return atomic_add_return(-i,v);
53 +}
54 +
55 +#define atomic_inc_return(v)  (atomic_add_return(1,v))
56 +#define atomic_dec_return(v)  (atomic_sub_return(1,v))
57 +
58  /* These are x86-specific, used by some header files */
59  #define atomic_clear_mask(mask, addr) \
60  __asm__ __volatile__(LOCK "andl %0,%1" \
61 Index: linux-2.6.5-7.283/include/asm-x86_64/atomic.h
62 ===================================================================
63 --- linux-2.6.5-7.283.orig/include/asm-x86_64/atomic.h
64 +++ linux-2.6.5-7.283/include/asm-x86_64/atomic.h
65 @@ -2,6 +2,7 @@
66  #define __ARCH_X86_64_ATOMIC__
67  
68  #include <linux/config.h>
69 +#include <linux/bitops.h>
70  
71  /* atomic_t should be 32 bit signed type */
72  
73 @@ -178,6 +179,31 @@ static __inline__ int atomic_add_negativ
74         return c;
75  }
76  
77 +/**
78 + * atomic_add_return - add and return
79 + * @i: integer value to add
80 + * @v: pointer of type atomic_t
81 + *
82 + * Atomically adds @i to @v and returns @i + @v
83 + */
84 +static __inline__ int atomic_add_return(int i, atomic_t *v)
85 +{
86 +       int __i = i;
87 +       __asm__ __volatile__(
88 +               LOCK_PREFIX "xaddl %0, %1"
89 +               :"+r" (i), "+m" (v->counter)
90 +               : : "memory");
91 +       return i + __i;
92 +}
93 +
94 +static __inline__ int atomic_sub_return(int i, atomic_t *v)
95 +{
96 +       return atomic_add_return(-i,v);
97 +}
98 +
99 +#define atomic_inc_return(v)  (atomic_add_return(1,v))
100 +#define atomic_dec_return(v)  (atomic_sub_return(1,v))
101 +
102  /* These are x86-specific, used by some header files */
103  #define atomic_clear_mask(mask, addr) \
104  __asm__ __volatile__(LOCK "andl %0,%1" \