Re: [PATCH] asm-generic: add another generic ext2 atomic bitops

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Hi Akinobu,

On 02/06/11 00:32, Akinobu Mita wrote:
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.h and
use it wherever possible.

I am trying to get consensus on merging the m68k bitops_mm.h and
bitops_no.h. Here is a proposed patch to do this:

http://www.spinics.net/lists/linux-m68k/msg03803.html

I expect you wouldn't need to patch m68k/bitops_mm.h if this
goes in.

Regards
Greg



Suggested-by: Andreas Dilger<adilger@xxxxxxxxx>
Signed-off-by: Akinobu Mita<akinobu.mita@xxxxxxxxx>
Cc: Arnd Bergmann<arnd@xxxxxxxx>
Cc: linux-arch@xxxxxxxxxxxxxxx
---
  arch/alpha/include/asm/bitops.h          |    4 ++--
  arch/arm/include/asm/bitops.h            |    6 ++----
  arch/cris/include/asm/bitops.h           |    4 ++--
  arch/frv/include/asm/bitops.h            |    4 ++--
  arch/ia64/include/asm/bitops.h           |    4 ++--
  arch/m68k/include/asm/bitops_mm.h        |    6 ++----
  arch/mn10300/include/asm/bitops.h        |    8 ++------
  arch/parisc/include/asm/bitops.h         |   10 ++--------
  arch/powerpc/include/asm/bitops.h        |    6 ++----
  arch/s390/include/asm/bitops.h           |    6 ++----
  arch/sparc/include/asm/bitops_64.h       |    6 ++----
  arch/tile/include/asm/bitops_64.h        |    6 ++----
  arch/x86/include/asm/bitops.h            |    6 ++----
  arch/xtensa/include/asm/bitops.h         |   15 ++-------------
  include/asm-generic/bitops/ext2-atomic.h |    9 +++++++++
  15 files changed, 37 insertions(+), 63 deletions(-)

diff --git a/arch/alpha/include/asm/bitops.h b/arch/alpha/include/asm/bitops.h
index 85b8152..e7f02c6 100644
--- a/arch/alpha/include/asm/bitops.h
+++ b/arch/alpha/include/asm/bitops.h
@@ -456,8 +456,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* __KERNEL__ */

diff --git a/arch/arm/include/asm/bitops.h b/arch/arm/include/asm/bitops.h
index b4892a0..5720428 100644
--- a/arch/arm/include/asm/bitops.h
+++ b/arch/arm/include/asm/bitops.h
@@ -310,10 +310,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* __KERNEL__ */

diff --git a/arch/cris/include/asm/bitops.h b/arch/cris/include/asm/bitops.h
index 310e0de..5388ebf 100644
--- a/arch/cris/include/asm/bitops.h
+++ b/arch/cris/include/asm/bitops.h
@@ -156,8 +156,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

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

diff --git a/arch/frv/include/asm/bitops.h b/arch/frv/include/asm/bitops.h
index a1d00b0..d0bde35 100644
--- a/arch/frv/include/asm/bitops.h
+++ b/arch/frv/include/asm/bitops.h
@@ -403,8 +403,8 @@ 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))
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* __KERNEL__ */

diff --git a/arch/ia64/include/asm/bitops.h b/arch/ia64/include/asm/bitops.h
index b76f7e0..6d7b4d8 100644
--- a/arch/ia64/include/asm/bitops.h
+++ b/arch/ia64/include/asm/bitops.h
@@ -458,8 +458,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

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

diff --git a/arch/m68k/include/asm/bitops_mm.h b/arch/m68k/include/asm/bitops_mm.h
index 89cf5b8..2514ad7 100644
--- a/arch/m68k/include/asm/bitops_mm.h
+++ b/arch/m68k/include/asm/bitops_mm.h
@@ -491,10 +491,8 @@ static inline unsigned long find_next_bit_le(const void *addr,

  /* Bitmap functions for the ext2 filesystem. */

-#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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* __KERNEL__ */

diff --git a/arch/mn10300/include/asm/bitops.h b/arch/mn10300/include/asm/bitops.h
index 0939462..d42ba8e 100644
--- a/arch/mn10300/include/asm/bitops.h
+++ b/arch/mn10300/include/asm/bitops.h
@@ -227,12 +227,8 @@ 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))
-
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>
  #include<asm-generic/bitops/le.h>

  #endif /* __KERNEL__ */
diff --git a/arch/parisc/include/asm/bitops.h b/arch/parisc/include/asm/bitops.h
index 43c516f..e9a5bc9 100644
--- a/arch/parisc/include/asm/bitops.h
+++ b/arch/parisc/include/asm/bitops.h
@@ -223,14 +223,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif	/* __KERNEL__ */

diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h
index f18c6d9..9fb8f9d 100644
--- a/arch/powerpc/include/asm/bitops.h
+++ b/arch/powerpc/include/asm/bitops.h
@@ -327,10 +327,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

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

diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h
index 667c6e9..5f60712 100644
--- a/arch/s390/include/asm/bitops.h
+++ b/arch/s390/include/asm/bitops.h
@@ -832,10 +832,8 @@ 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)
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>


  #endif /* __KERNEL__ */
diff --git a/arch/sparc/include/asm/bitops_64.h b/arch/sparc/include/asm/bitops_64.h
index 38e9aa1..e67166c 100644
--- a/arch/sparc/include/asm/bitops_64.h
+++ b/arch/sparc/include/asm/bitops_64.h
@@ -91,10 +91,8 @@ 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))
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* __KERNEL__ */

diff --git a/arch/tile/include/asm/bitops_64.h b/arch/tile/include/asm/bitops_64.h
index 99615e8..ce6ec72 100644
--- a/arch/tile/include/asm/bitops_64.h
+++ b/arch/tile/include/asm/bitops_64.h
@@ -97,9 +97,7 @@ 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))
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* _ASM_TILE_BITOPS_64_H */
diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
index 69d5813..abe730f 100644
--- a/arch/x86/include/asm/bitops.h
+++ b/arch/x86/include/asm/bitops.h
@@ -458,10 +458,8 @@ 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))
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #endif /* __KERNEL__ */
  #endif /* _ASM_X86_BITOPS_H */
diff --git a/arch/xtensa/include/asm/bitops.h b/arch/xtensa/include/asm/bitops.h
index c8fac8d..f948187 100644
--- a/arch/xtensa/include/asm/bitops.h
+++ b/arch/xtensa/include/asm/bitops.h
@@ -108,19 +108,8 @@ 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
+#define ARCH_NO_EXT2_ATOMIC_SPINLOCK
+#include<asm-generic/bitops/ext2-atomic.h>

  #include<asm-generic/bitops/hweight.h>
  #include<asm-generic/bitops/lock.h>
diff --git a/include/asm-generic/bitops/ext2-atomic.h b/include/asm-generic/bitops/ext2-atomic.h
index ecf1c9d..315760b 100644
--- a/include/asm-generic/bitops/ext2-atomic.h
+++ b/include/asm-generic/bitops/ext2-atomic.h
@@ -1,6 +1,13 @@
  #ifndef _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_
  #define _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_

+#ifdef ARCH_NO_EXT2_ATOMIC_SPINLOCK
+
+#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)
+
+#else
+
  #define ext2_set_bit_atomic(lock, nr, addr)		\
  	({						\
  		int ret;				\
@@ -19,4 +26,6 @@
  		ret;					\
  	})

+#endif
+
  #endif /* _ASM_GENERIC_BITOPS_EXT2_ATOMIC_H_ */


--
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     gerg@xxxxxxxxxxxx
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com
--
To unsubscribe from this list: send the line "unsubscribe linux-arch" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel]     [Kernel Newbies]     [x86 Platform Driver]     [Netdev]     [Linux Wireless]     [Netfilter]     [Bugtraq]     [Linux Filesystems]     [Yosemite Discussion]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]

  Powered by Linux