linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* [RFC] change non-atomic bitops method
@ 2015-02-02  3:55 Wang, Yalin
  2015-02-02 18:53 ` Laura Abbott
                   ` (3 more replies)
  0 siblings, 4 replies; 23+ messages in thread
From: Wang, Yalin @ 2015-02-02  3:55 UTC (permalink / raw)
  To: linux-arm-kernel

This patch change non-atomic bitops,
add a if() condition to test it, before set/clear the bit.
so that we don't need dirty the cache line, if this bit
have been set or clear. On SMP system, dirty cache line will
need invalidate other processors cache line, this will have
some impact on SMP systems.

Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
---
 include/asm-generic/bitops/non-atomic.h | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/include/asm-generic/bitops/non-atomic.h b/include/asm-generic/bitops/non-atomic.h
index 697cc2b..e4ef18a 100644
--- a/include/asm-generic/bitops/non-atomic.h
+++ b/include/asm-generic/bitops/non-atomic.h
@@ -17,7 +17,9 @@ static inline void __set_bit(int nr, volatile unsigned long *addr)
 	unsigned long mask = BIT_MASK(nr);
 	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 
-	*p  |= mask;
+	if ((*p & mask) == 0)
+		*p  |= mask;
+
 }
 
 static inline void __clear_bit(int nr, volatile unsigned long *addr)
@@ -25,7 +27,8 @@ static inline void __clear_bit(int nr, volatile unsigned long *addr)
 	unsigned long mask = BIT_MASK(nr);
 	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 
-	*p &= ~mask;
+	if ((*p & mask) != 0)
+		*p &= ~mask;
 }
 
 /**
@@ -60,7 +63,8 @@ static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)
 	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 	unsigned long old = *p;
 
-	*p = old | mask;
+	if ((old & mask) == 0)
+		*p = old | mask;
 	return (old & mask) != 0;
 }
 
@@ -79,7 +83,8 @@ static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)
 	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);
 	unsigned long old = *p;
 
-	*p = old & ~mask;
+	if ((old & mask) != 0)
+		*p = old & ~mask;
 	return (old & mask) != 0;
 }
 
-- 
2.2.2

^ permalink raw reply related	[flat|nested] 23+ messages in thread

end of thread, other threads:[~2015-02-10  7:05 UTC | newest]

Thread overview: 23+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-02-02  3:55 [RFC] change non-atomic bitops method Wang, Yalin
2015-02-02 18:53 ` Laura Abbott
2015-02-02 19:31 ` Uwe Kleine-König
2015-02-02 23:29 ` Andrew Morton
2015-02-02 23:31   ` Russell King - ARM Linux
2015-02-03  1:17   ` Kirill A. Shutemov
2015-02-03  2:13     ` Wang, Yalin
2015-02-03  5:42       ` Wang, Yalin
2015-02-03  6:38         ` Andrew Morton
2015-02-03  7:03           ` Wang, Yalin
2015-02-03  8:42             ` Wang, Yalin
2015-02-03 10:59               ` Andrew Morton
2015-02-09  8:18                 ` Wang, Yalin
2015-02-09 20:34                   ` Andrew Morton
2015-02-10  7:05                     ` Wang, Yalin
2015-02-09 21:42                   ` Rasmus Villemoes
2015-02-03  8:40           ` David Miller
2015-02-03  8:48             ` Andrew Morton
2015-02-03  9:34           ` Rasmus Villemoes
2015-02-03  9:41             ` Wang, Yalin
2015-02-03 10:39     ` Kirill A. Shutemov
2015-02-03 15:14 ` David Howells
2015-02-03 19:10   ` Uwe Kleine-König

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).