Skip to content

Commit

Permalink
asm-generic: add another generic ext2 atomic bitops
Browse files Browse the repository at this point in the history
The majority of architectures implement ext2 atomic bitops as
test_and_{set,clear}_bit() without spinlock.

This adds this type of generic implementation in ext2-atomic-setbit.h and
use it wherever possible.

Signed-off-by: Akinobu Mita <[email protected]>
Suggested-by: Andreas Dilger <[email protected]>
Suggested-by: Arnd Bergmann <[email protected]>
Acked-by: Arnd Bergmann <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
mita authored and torvalds committed Jul 26, 2011
1 parent b2c9cd3 commit 148817b
Show file tree
Hide file tree
Showing 15 changed files with 28 additions and 59 deletions.
3 changes: 1 addition & 2 deletions arch/alpha/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -456,8 +456,7 @@ sched_find_first_bit(const unsigned long b[2])

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a)
#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* __KERNEL__ */

Expand Down
5 changes: 1 addition & 4 deletions arch/arm/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,10 +310,7 @@ static inline int find_next_bit_le(const void *p, int size, int offset)
/*
* Ext2 is defined to use little-endian byte ordering.
*/
#define ext2_set_bit_atomic(lock, nr, p) \
test_and_set_bit_le(nr, p)
#define ext2_clear_bit_atomic(lock, nr, p) \
test_and_clear_bit_le(nr, p)
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* __KERNEL__ */

Expand Down
3 changes: 1 addition & 2 deletions arch/cris/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr)

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a)
#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#include <asm-generic/bitops/sched.h>

Expand Down
3 changes: 1 addition & 2 deletions arch/frv/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -403,8 +403,7 @@ int __ilog2_u64(u64 n)

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(lock,nr,addr) test_and_set_bit ((nr) ^ 0x18, (addr))
#define ext2_clear_bit_atomic(lock,nr,addr) test_and_clear_bit((nr) ^ 0x18, (addr))
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* __KERNEL__ */

Expand Down
3 changes: 1 addition & 2 deletions arch/ia64/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -458,8 +458,7 @@ static __inline__ unsigned long __arch_hweight64(unsigned long x)

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(l,n,a) test_and_set_bit(n,a)
#define ext2_clear_bit_atomic(l,n,a) test_and_clear_bit(n,a)
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#include <asm-generic/bitops/sched.h>

Expand Down
7 changes: 1 addition & 6 deletions arch/mn10300/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,12 +227,7 @@ int ffs(int x)
#include <asm-generic/bitops/find.h>
#include <asm-generic/bitops/sched.h>
#include <asm-generic/bitops/hweight.h>

#define ext2_set_bit_atomic(lock, nr, addr) \
test_and_set_bit((nr), (addr))
#define ext2_clear_bit_atomic(lock, nr, addr) \
test_and_clear_bit((nr), (addr))

#include <asm-generic/bitops/ext2-atomic-setbit.h>
#include <asm-generic/bitops/le.h>

#endif /* __KERNEL__ */
Expand Down
9 changes: 1 addition & 8 deletions arch/parisc/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -223,14 +223,7 @@ static __inline__ int fls(int x)
#ifdef __KERNEL__

#include <asm-generic/bitops/le.h>

/* '3' is bits per byte */
#define LE_BYTE_ADDR ((sizeof(unsigned long) - 1) << 3)

#define ext2_set_bit_atomic(l,nr,addr) \
test_and_set_bit((nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#define ext2_clear_bit_atomic(l,nr,addr) \
test_and_clear_bit( (nr) ^ LE_BYTE_ADDR, (unsigned long *)addr)
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* __KERNEL__ */

Expand Down
5 changes: 1 addition & 4 deletions arch/powerpc/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -327,10 +327,7 @@ unsigned long find_next_bit_le(const void *addr,
unsigned long size, unsigned long offset);
/* Bitmap functions for the ext2 filesystem */

#define ext2_set_bit_atomic(lock, nr, addr) \
test_and_set_bit_le((nr), (unsigned long*)addr)
#define ext2_clear_bit_atomic(lock, nr, addr) \
test_and_clear_bit_le((nr), (unsigned long*)addr)
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#include <asm-generic/bitops/sched.h>

Expand Down
5 changes: 1 addition & 4 deletions arch/s390/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -832,10 +832,7 @@ static inline int find_next_bit_le(void *vaddr, unsigned long size,

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(lock, nr, addr) \
test_and_set_bit_le(nr, addr)
#define ext2_clear_bit_atomic(lock, nr, addr) \
test_and_clear_bit_le(nr, addr)
#include <asm-generic/bitops/ext2-atomic-setbit.h>


#endif /* __KERNEL__ */
Expand Down
5 changes: 1 addition & 4 deletions arch/sparc/include/asm/bitops_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,7 @@ static inline unsigned int __arch_hweight8(unsigned int w)

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(lock,nr,addr) \
test_and_set_bit((nr) ^ 0x38,(unsigned long *)(addr))
#define ext2_clear_bit_atomic(lock,nr,addr) \
test_and_clear_bit((nr) ^ 0x38,(unsigned long *)(addr))
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* __KERNEL__ */

Expand Down
5 changes: 1 addition & 4 deletions arch/tile/include/asm/bitops_64.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,6 @@ static inline int test_and_change_bit(unsigned nr,
return (oldval & mask) != 0;
}

#define ext2_set_bit_atomic(lock, nr, addr) \
test_and_set_bit((nr), (unsigned long *)(addr))
#define ext2_clear_bit_atomic(lock, nr, addr) \
test_and_clear_bit((nr), (unsigned long *)(addr))
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* _ASM_TILE_BITOPS_64_H */
5 changes: 1 addition & 4 deletions arch/x86/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -458,10 +458,7 @@ static inline int fls(int x)

#include <asm-generic/bitops/le.h>

#define ext2_set_bit_atomic(lock, nr, addr) \
test_and_set_bit((nr), (unsigned long *)(addr))
#define ext2_clear_bit_atomic(lock, nr, addr) \
test_and_clear_bit((nr), (unsigned long *)(addr))
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#endif /* __KERNEL__ */
#endif /* _ASM_X86_BITOPS_H */
14 changes: 1 addition & 13 deletions arch/xtensa/include/asm/bitops.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,19 +108,7 @@ static inline unsigned long __fls(unsigned long word)
#include <asm-generic/bitops/find.h>
#include <asm-generic/bitops/le.h>

#ifdef __XTENSA_EL__
# define ext2_set_bit_atomic(lock,nr,addr) \
test_and_set_bit((nr), (unsigned long*)(addr))
# define ext2_clear_bit_atomic(lock,nr,addr) \
test_and_clear_bit((nr), (unsigned long*)(addr))
#elif defined(__XTENSA_EB__)
# define ext2_set_bit_atomic(lock,nr,addr) \
test_and_set_bit((nr) ^ 0x18, (unsigned long*)(addr))
# define ext2_clear_bit_atomic(lock,nr,addr) \
test_and_clear_bit((nr) ^ 0x18, (unsigned long*)(addr))
#else
# error processor byte order undefined!
#endif
#include <asm-generic/bitops/ext2-atomic-setbit.h>

#include <asm-generic/bitops/hweight.h>
#include <asm-generic/bitops/lock.h>
Expand Down
11 changes: 11 additions & 0 deletions include/asm-generic/bitops/ext2-atomic-setbit.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#ifndef _ASM_GENERIC_BITOPS_EXT2_ATOMIC_SETBIT_H_
#define _ASM_GENERIC_BITOPS_EXT2_ATOMIC_SETBIT_H_

/*
* Atomic bitops based version of ext2 atomic bitops
*/

#define ext2_set_bit_atomic(l, nr, addr) test_and_set_bit_le(nr, addr)
#define ext2_clear_bit_atomic(l, nr, addr) test_and_clear_bit_le(nr, addr)

#endif /* _ASM_GENERIC_BITOPS_EXT2_ATOMIC_SETBIT_H_ */
4 changes: 4 additions & 0 deletions include/asm-generic/bitops/ext2-atomic.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
#ifndef _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_
#define _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_

/*
* Spinlock based version of ext2 atomic bitops
*/

#define ext2_set_bit_atomic(lock, nr, addr) \
({ \
int ret; \
Expand Down

0 comments on commit 148817b

Please sign in to comment.