public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCHv4 01/11] atomic: add *_dec_not_zero
@ 2011-07-27  9:47 Sven Eckelmann
       [not found] ` <1311760070-21532-1-git-send-email-sven-KaDOiPu9UxWEi8DpZVb4nw@public.gmane.org>
                   ` (10 more replies)
  0 siblings, 11 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-m32r-ja, linux-mips, linux-ia64, linux-doc,
	Benjamin Herrenschmidt, H. Peter Anvin, Heiko Carstens,
	Randy Dunlap, Paul Mackerras, Helge Deller, sparclinux,
	Sven Eckelmann, linux-s390, Russell King, user-mode-linux-devel,
	Richard Weinberger, Hirokazu Takata, x86, James E.J. Bottomley,
	Ingo Molnar, Matt Turner, Fenghua Yu, Arnd Bergmann, Jeff Dike,
	Chris Metcalf, linux-m32r

Introduce an *_dec_not_zero operation.  Make this a special case of
*_add_unless because batman-adv uses atomic_dec_not_zero in different
places like re-broadcast queue or aggregation queue management. There
are other non-final patches which may also want to use this macro.

Reported-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Randy Dunlap <rdunlap@xenotime.net>
Cc: Richard Henderson <rth@twiddle.net>
Cc: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
Cc: Matt Turner <mattst88@gmail.com>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Kyle McMartin <kyle@mcmartin.ca>
Cc: Helge Deller <deller@gmx.de>
Cc: "James E.J. Bottomley" <jejb@parisc-linux.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: linux390@de.ibm.com
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Chris Metcalf <cmetcalf@tilera.com>
Cc: Jeff Dike <jdike@addtoit.com>
Cc: Richard Weinberger <richard@nod.at>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: x86@kernel.org
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-doc@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-alpha@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-ia64@vger.kernel.org
Cc: linux-m32r@ml.linux-m32r.org
Cc: linux-m32r-ja@ml.linux-m32r.org
Cc: linux-mips@linux-mips.org
Cc: linux-parisc@vger.kernel.org
Cc: linuxppc-dev@lists.ozlabs.org
Cc: linux-s390@vger.kernel.org
Cc: sparclinux@vger.kernel.org
Cc: user-mode-linux-devel@lists.sourceforge.net
---
David S. Miller recommended this change in
 https://lists.open-mesh.org/pipermail/b.a.t.m.a.n/2011-May/004560.html

Arnd Bergmann wanted to apply it in 201106172320.26476.arnd@arndb.de

... and then Arun Sharma created a big merge conflict with
https://lkml.org/lkml/2011/6/6/430

I don't think that it is a a good idea to asume that everyone still agrees
with the patch after I've rewritten it.

 Documentation/atomic_ops.txt       |    1 +
 arch/alpha/include/asm/atomic.h    |    1 +
 arch/alpha/include/asm/local.h     |    1 +
 arch/arm/include/asm/atomic.h      |    1 +
 arch/ia64/include/asm/atomic.h     |    1 +
 arch/m32r/include/asm/local.h      |    1 +
 arch/mips/include/asm/atomic.h     |    1 +
 arch/mips/include/asm/local.h      |    1 +
 arch/parisc/include/asm/atomic.h   |    1 +
 arch/powerpc/include/asm/atomic.h  |    1 +
 arch/powerpc/include/asm/local.h   |    1 +
 arch/s390/include/asm/atomic.h     |    1 +
 arch/sparc/include/asm/atomic_64.h |    1 +
 arch/tile/include/asm/atomic_32.h  |    1 +
 arch/tile/include/asm/atomic_64.h  |    1 +
 arch/um/sys-i386/atomic64_cx8_32.S |   28 ++++++++++++++++++++++++++++
 arch/x86/include/asm/atomic64_32.h |   12 ++++++++++++
 arch/x86/include/asm/atomic64_64.h |    1 +
 arch/x86/include/asm/local.h       |    1 +
 arch/x86/lib/atomic64_32.c         |    4 ++++
 arch/x86/lib/atomic64_386_32.S     |   21 +++++++++++++++++++++
 arch/x86/lib/atomic64_cx8_32.S     |   28 ++++++++++++++++++++++++++++
 include/asm-generic/atomic-long.h  |    2 ++
 include/asm-generic/atomic64.h     |    1 +
 include/asm-generic/local.h        |    1 +
 include/asm-generic/local64.h      |    2 ++
 include/linux/atomic.h             |    9 +++++++++
 27 files changed, 125 insertions(+), 0 deletions(-)

diff --git a/Documentation/atomic_ops.txt b/Documentation/atomic_ops.txt
index 3bd585b..1eec221 100644
--- a/Documentation/atomic_ops.txt
+++ b/Documentation/atomic_ops.txt
@@ -190,6 +190,7 @@ atomic_add_unless requires explicit memory barriers around the operation
 unless it fails (returns 0).
 
 atomic_inc_not_zero, equivalent to atomic_add_unless(v, 1, 0)
+atomic_dec_not_zero, equivalent to atomic_add_unless(v, -1, 0)
 
 
 If a caller requires memory barrier semantics around an atomic_t
diff --git a/arch/alpha/include/asm/atomic.h b/arch/alpha/include/asm/atomic.h
index 640f909..09d1571 100644
--- a/arch/alpha/include/asm/atomic.h
+++ b/arch/alpha/include/asm/atomic.h
@@ -225,6 +225,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
 #define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
diff --git a/arch/alpha/include/asm/local.h b/arch/alpha/include/asm/local.h
index 9c94b84..51eb678 100644
--- a/arch/alpha/include/asm/local.h
+++ b/arch/alpha/include/asm/local.h
@@ -79,6 +79,7 @@ static __inline__ long local_sub_return(long i, local_t * l)
 	c != (u);						\
 })
 #define local_inc_not_zero(l) local_add_unless((l), 1, 0)
+#define local_dec_not_zero(l) local_add_unless((l), -1, 0)
 
 #define local_add_negative(a, l) (local_add_return((a), (l)) < 0)
 
diff --git a/arch/arm/include/asm/atomic.h b/arch/arm/include/asm/atomic.h
index 86976d0..80ed975 100644
--- a/arch/arm/include/asm/atomic.h
+++ b/arch/arm/include/asm/atomic.h
@@ -458,6 +458,7 @@ static inline int atomic64_add_unless(atomic64_t *v, u64 a, u64 u)
 #define atomic64_dec_return(v)		atomic64_sub_return(1LL, (v))
 #define atomic64_dec_and_test(v)	(atomic64_dec_return((v)) == 0)
 #define atomic64_inc_not_zero(v)	atomic64_add_unless((v), 1LL, 0LL)
+#define atomic64_dec_not_zero(v)	atomic64_add_unless((v), -1LL, 0LL)
 
 #endif /* !CONFIG_GENERIC_ATOMIC64 */
 #endif
diff --git a/arch/ia64/include/asm/atomic.h b/arch/ia64/include/asm/atomic.h
index 3fad89e..af6e9b2 100644
--- a/arch/ia64/include/asm/atomic.h
+++ b/arch/ia64/include/asm/atomic.h
@@ -122,6 +122,7 @@ static __inline__ long atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 #define atomic_add_return(i,v)						\
 ({									\
diff --git a/arch/m32r/include/asm/local.h b/arch/m32r/include/asm/local.h
index 734bca8..d536082 100644
--- a/arch/m32r/include/asm/local.h
+++ b/arch/m32r/include/asm/local.h
@@ -272,6 +272,7 @@ static inline int local_add_unless(local_t *l, long a, long u)
 }
 
 #define local_inc_not_zero(l) local_add_unless((l), 1, 0)
+#define local_dec_not_zero(l) local_add_unless((l), -1, 0)
 
 static inline void local_clear_mask(unsigned long  mask, local_t *addr)
 {
diff --git a/arch/mips/include/asm/atomic.h b/arch/mips/include/asm/atomic.h
index 1d93f81..babb043 100644
--- a/arch/mips/include/asm/atomic.h
+++ b/arch/mips/include/asm/atomic.h
@@ -697,6 +697,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 #define atomic64_dec_return(v) atomic64_sub_return(1, (v))
 #define atomic64_inc_return(v) atomic64_add_return(1, (v))
diff --git a/arch/mips/include/asm/local.h b/arch/mips/include/asm/local.h
index 94fde8d..0242256 100644
--- a/arch/mips/include/asm/local.h
+++ b/arch/mips/include/asm/local.h
@@ -137,6 +137,7 @@ static __inline__ long local_sub_return(long i, local_t * l)
 	c != (u);						\
 })
 #define local_inc_not_zero(l) local_add_unless((l), 1, 0)
+#define local_dec_not_zero(l) local_add_unless((l), -1, 0)
 
 #define local_dec_return(l) local_sub_return(1, (l))
 #define local_inc_return(l) local_add_return(1, (l))
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h
index b1dc71f..8a50234 100644
--- a/arch/parisc/include/asm/atomic.h
+++ b/arch/parisc/include/asm/atomic.h
@@ -334,6 +334,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 #endif /* !CONFIG_64BIT */
 
diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h
index e2a4c26..c0131a6 100644
--- a/arch/powerpc/include/asm/atomic.h
+++ b/arch/powerpc/include/asm/atomic.h
@@ -468,6 +468,7 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 #endif /* __powerpc64__ */
 
diff --git a/arch/powerpc/include/asm/local.h b/arch/powerpc/include/asm/local.h
index b8da913..d182e34 100644
--- a/arch/powerpc/include/asm/local.h
+++ b/arch/powerpc/include/asm/local.h
@@ -134,6 +134,7 @@ static __inline__ int local_add_unless(local_t *l, long a, long u)
 }
 
 #define local_inc_not_zero(l) local_add_unless((l), 1, 0)
+#define local_dec_not_zero(l) local_add_unless((l), -1, 0)
 
 #define local_sub_and_test(a, l)	(local_sub_return((a), (l)) == 0)
 #define local_dec_and_test(l)		(local_dec_return((l)) == 0)
diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h
index 8517d2a..92e7d5d 100644
--- a/arch/s390/include/asm/atomic.h
+++ b/arch/s390/include/asm/atomic.h
@@ -325,6 +325,7 @@ static inline long long atomic64_dec_if_positive(atomic64_t *v)
 #define atomic64_dec_return(_v)		atomic64_sub_return(1, _v)
 #define atomic64_dec_and_test(_v)	(atomic64_sub_return(1, _v) == 0)
 #define atomic64_inc_not_zero(v)	atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v)	atomic64_add_unless((v), -1, 0)
 
 #define smp_mb__before_atomic_dec()	smp_mb()
 #define smp_mb__after_atomic_dec()	smp_mb()
diff --git a/arch/sparc/include/asm/atomic_64.h b/arch/sparc/include/asm/atomic_64.h
index 9f421df..94cf160 100644
--- a/arch/sparc/include/asm/atomic_64.h
+++ b/arch/sparc/include/asm/atomic_64.h
@@ -106,6 +106,7 @@ static inline long atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 /* Atomic operations are already serializing */
 #define smp_mb__before_atomic_dec()	barrier()
diff --git a/arch/tile/include/asm/atomic_32.h b/arch/tile/include/asm/atomic_32.h
index c03349e..9cfafb3 100644
--- a/arch/tile/include/asm/atomic_32.h
+++ b/arch/tile/include/asm/atomic_32.h
@@ -233,6 +233,7 @@ static inline void atomic64_set(atomic64_t *v, u64 n)
 #define atomic64_dec_return(v)		atomic64_sub_return(1LL, (v))
 #define atomic64_dec_and_test(v)	(atomic64_dec_return((v)) == 0)
 #define atomic64_inc_not_zero(v)	atomic64_add_unless((v), 1LL, 0LL)
+#define atomic64_dec_not_zero(v)	atomic64_add_unless((v), -1LL, 0LL)
 
 /*
  * We need to barrier before modifying the word, since the _atomic_xxx()
diff --git a/arch/tile/include/asm/atomic_64.h b/arch/tile/include/asm/atomic_64.h
index 27fe667..9c22f50 100644
--- a/arch/tile/include/asm/atomic_64.h
+++ b/arch/tile/include/asm/atomic_64.h
@@ -141,6 +141,7 @@ static inline long atomic64_add_unless(atomic64_t *v, long a, long u)
 #define atomic64_add_negative(i, v)	(atomic64_add_return((i), (v)) < 0)
 
 #define atomic64_inc_not_zero(v)	atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v)	atomic64_add_unless((v), -1, 0)
 
 /* Atomic dec and inc don't implement barrier, so provide them if needed. */
 #define smp_mb__before_atomic_dec()	smp_mb()
diff --git a/arch/um/sys-i386/atomic64_cx8_32.S b/arch/um/sys-i386/atomic64_cx8_32.S
index 1e901d3..a58a1d4 100644
--- a/arch/um/sys-i386/atomic64_cx8_32.S
+++ b/arch/um/sys-i386/atomic64_cx8_32.S
@@ -223,3 +223,31 @@ ENTRY(atomic64_inc_not_zero_cx8)
 	jmp 3b
 	CFI_ENDPROC
 ENDPROC(atomic64_inc_not_zero_cx8)
+
+ENTRY(atomic64_dec_not_zero_cx8)
+	CFI_STARTPROC
+	SAVE ebx
+
+	read64 %esi
+1:
+	testl %eax, %eax
+	je 4f
+2:
+	movl %eax, %ebx
+	movl %edx, %ecx
+	subl $1, %ebx
+	sbbl $0, %ecx
+	LOCK_PREFIX
+	cmpxchg8b (%esi)
+	jne 1b
+
+	movl $1, %eax
+3:
+	RESTORE ebx
+	ret
+4:
+	testl %edx, %edx
+	jne 2b
+	jmp 3b
+	CFI_ENDPROC
+ENDPROC(atomic64_dec_not_zero_cx8)
diff --git a/arch/x86/include/asm/atomic64_32.h b/arch/x86/include/asm/atomic64_32.h
index 24098aa..3cd4431 100644
--- a/arch/x86/include/asm/atomic64_32.h
+++ b/arch/x86/include/asm/atomic64_32.h
@@ -287,6 +287,18 @@ static inline int atomic64_inc_not_zero(atomic64_t *v)
 	return r;
 }
 
+
+static inline int atomic64_dec_not_zero(atomic64_t *v)
+{
+	int r;
+	asm volatile(ATOMIC64_ALTERNATIVE(dec_not_zero)
+		     : "=a" (r)
+		     : "S" (v)
+		     : "ecx", "edx", "memory"
+		     );
+	return r;
+}
+
 static inline long long atomic64_dec_if_positive(atomic64_t *v)
 {
 	long long r;
diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h
index 017594d..93c9d8b 100644
--- a/arch/x86/include/asm/atomic64_64.h
+++ b/arch/x86/include/asm/atomic64_64.h
@@ -220,6 +220,7 @@ static inline int atomic64_add_unless(atomic64_t *v, long a, long u)
 }
 
 #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0)
+#define atomic64_dec_not_zero(v) atomic64_add_unless((v), -1, 0)
 
 /*
  * atomic64_dec_if_positive - decrement by 1 if old value positive
diff --git a/arch/x86/include/asm/local.h b/arch/x86/include/asm/local.h
index 9cdae5d..2c8c92d 100644
--- a/arch/x86/include/asm/local.h
+++ b/arch/x86/include/asm/local.h
@@ -185,6 +185,7 @@ static inline long local_sub_return(long i, local_t *l)
 	c != (u);						\
 })
 #define local_inc_not_zero(l) local_add_unless((l), 1, 0)
+#define local_dec_not_zero(l) local_add_unless((l), -1, 0)
 
 /* On x86_32, these are no better than the atomic variants.
  * On x86-64 these are better than the atomic variants on SMP kernels
diff --git a/arch/x86/lib/atomic64_32.c b/arch/x86/lib/atomic64_32.c
index 042f682..7da05c3 100644
--- a/arch/x86/lib/atomic64_32.c
+++ b/arch/x86/lib/atomic64_32.c
@@ -24,6 +24,8 @@ long long atomic64_dec_if_positive_cx8(atomic64_t *v);
 EXPORT_SYMBOL(atomic64_dec_if_positive_cx8);
 int atomic64_inc_not_zero_cx8(atomic64_t *v);
 EXPORT_SYMBOL(atomic64_inc_not_zero_cx8);
+int atomic64_dec_not_zero_cx8(atomic64_t *v);
+EXPORT_SYMBOL(atomic64_dec_not_zero_cx8);
 int atomic64_add_unless_cx8(atomic64_t *v, long long a, long long u);
 EXPORT_SYMBOL(atomic64_add_unless_cx8);
 
@@ -54,6 +56,8 @@ long long atomic64_dec_if_positive_386(atomic64_t *v);
 EXPORT_SYMBOL(atomic64_dec_if_positive_386);
 int atomic64_inc_not_zero_386(atomic64_t *v);
 EXPORT_SYMBOL(atomic64_inc_not_zero_386);
+int atomic64_dec_not_zero_386(atomic64_t *v);
+EXPORT_SYMBOL(atomic64_dec_not_zero_386);
 int atomic64_add_unless_386(atomic64_t *v, long long a, long long u);
 EXPORT_SYMBOL(atomic64_add_unless_386);
 #endif
diff --git a/arch/x86/lib/atomic64_386_32.S b/arch/x86/lib/atomic64_386_32.S
index e8e7e0d..c78337b 100644
--- a/arch/x86/lib/atomic64_386_32.S
+++ b/arch/x86/lib/atomic64_386_32.S
@@ -181,6 +181,27 @@ ENDP
 #undef v
 
 #define v %esi
+BEGIN(dec_not_zero)
+	movl  (v), %eax
+	movl 4(v), %edx
+	testl %eax, %eax
+	je 3f
+1:
+	subl $1, %eax
+	sbbl $0, %edx
+	movl %eax,  (v)
+	movl %edx, 4(v)
+	movl $1, %eax
+2:
+	RET
+3:
+	testl %edx, %edx
+	jne 1b
+	jmp 2b
+ENDP
+#undef v
+
+#define v %esi
 BEGIN(dec_if_positive)
 	movl  (v), %eax
 	movl 4(v), %edx
diff --git a/arch/x86/lib/atomic64_cx8_32.S b/arch/x86/lib/atomic64_cx8_32.S
index 391a083..989638c 100644
--- a/arch/x86/lib/atomic64_cx8_32.S
+++ b/arch/x86/lib/atomic64_cx8_32.S
@@ -220,3 +220,31 @@ ENTRY(atomic64_inc_not_zero_cx8)
 	jmp 3b
 	CFI_ENDPROC
 ENDPROC(atomic64_inc_not_zero_cx8)
+
+ENTRY(atomic64_dec_not_zero_cx8)
+	CFI_STARTPROC
+	SAVE ebx
+
+	read64 %esi
+1:
+	testl %eax, %eax
+	je 4f
+2:
+	movl %eax, %ebx
+	movl %edx, %ecx
+	subl $1, %ebx
+	sbbl $0, %ecx
+	LOCK_PREFIX
+	cmpxchg8b (%esi)
+	jne 1b
+
+	movl $1, %eax
+3:
+	RESTORE ebx
+	ret
+4:
+	testl %edx, %edx
+	jne 2b
+	jmp 3b
+	CFI_ENDPROC
+ENDPROC(atomic64_dec_not_zero_cx8)
diff --git a/include/asm-generic/atomic-long.h b/include/asm-generic/atomic-long.h
index b7babf0..0fe75ab 100644
--- a/include/asm-generic/atomic-long.h
+++ b/include/asm-generic/atomic-long.h
@@ -130,6 +130,7 @@ static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
 }
 
 #define atomic_long_inc_not_zero(l) atomic64_inc_not_zero((atomic64_t *)(l))
+#define atomic_long_dec_not_zero(l) atomic64_dec_not_zero((atomic64_t *)(l))
 
 #define atomic_long_cmpxchg(l, old, new) \
 	(atomic64_cmpxchg((atomic64_t *)(l), (old), (new)))
@@ -247,6 +248,7 @@ static inline long atomic_long_add_unless(atomic_long_t *l, long a, long u)
 }
 
 #define atomic_long_inc_not_zero(l) atomic_inc_not_zero((atomic_t *)(l))
+#define atomic_long_dec_not_zero(l) atomic_dec_not_zero((atomic_t *)(l))
 
 #define atomic_long_cmpxchg(l, old, new) \
 	(atomic_cmpxchg((atomic_t *)(l), (old), (new)))
diff --git a/include/asm-generic/atomic64.h b/include/asm-generic/atomic64.h
index b18ce4f..90ff9b1 100644
--- a/include/asm-generic/atomic64.h
+++ b/include/asm-generic/atomic64.h
@@ -38,5 +38,6 @@ extern int	 atomic64_add_unless(atomic64_t *v, long long a, long long u);
 #define atomic64_dec_return(v)		atomic64_sub_return(1LL, (v))
 #define atomic64_dec_and_test(v)	(atomic64_dec_return((v)) == 0)
 #define atomic64_inc_not_zero(v) 	atomic64_add_unless((v), 1LL, 0LL)
+#define atomic64_dec_not_zero(v)	atomic64_add_unless((v), -1LL, 0LL)
 
 #endif  /*  _ASM_GENERIC_ATOMIC64_H  */
diff --git a/include/asm-generic/local.h b/include/asm-generic/local.h
index 9ceb03b..fabf4f3 100644
--- a/include/asm-generic/local.h
+++ b/include/asm-generic/local.h
@@ -44,6 +44,7 @@ typedef struct
 #define local_xchg(l, n) atomic_long_xchg((&(l)->a), (n))
 #define local_add_unless(l, _a, u) atomic_long_add_unless((&(l)->a), (_a), (u))
 #define local_inc_not_zero(l) atomic_long_inc_not_zero(&(l)->a)
+#define local_dec_not_zero(l) atomic_long_dec_not_zero(&(l)->a)
 
 /* Non-atomic variants, ie. preemption disabled and won't be touched
  * in interrupt, etc.  Some archs can optimize this case well. */
diff --git a/include/asm-generic/local64.h b/include/asm-generic/local64.h
index 5980002..76acbe2 100644
--- a/include/asm-generic/local64.h
+++ b/include/asm-generic/local64.h
@@ -45,6 +45,7 @@ typedef struct {
 #define local64_xchg(l, n)	local_xchg((&(l)->a), (n))
 #define local64_add_unless(l, _a, u) local_add_unless((&(l)->a), (_a), (u))
 #define local64_inc_not_zero(l)	local_inc_not_zero(&(l)->a)
+#define local64_dec_not_zero(l)	local_dec_not_zero(&(l)->a)
 
 /* Non-atomic variants, ie. preemption disabled and won't be touched
  * in interrupt, etc.  Some archs can optimize this case well. */
@@ -83,6 +84,7 @@ typedef struct {
 #define local64_xchg(l, n)	atomic64_xchg((&(l)->a), (n))
 #define local64_add_unless(l, _a, u) atomic64_add_unless((&(l)->a), (_a), (u))
 #define local64_inc_not_zero(l)	atomic64_inc_not_zero(&(l)->a)
+#define local64_dec_not_zero(l)	atomic64_dec_not_zero(&(l)->a)
 
 /* Non-atomic variants, ie. preemption disabled and won't be touched
  * in interrupt, etc.  Some archs can optimize this case well. */
diff --git a/include/linux/atomic.h b/include/linux/atomic.h
index 42b77b5..ad2b750 100644
--- a/include/linux/atomic.h
+++ b/include/linux/atomic.h
@@ -27,6 +27,15 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
 #define atomic_inc_not_zero(v)		atomic_add_unless((v), 1, 0)
 
 /**
+ * atomic_dec_not_zero - decrement unless the number is zero
+ * @v: pointer of type atomic_t
+ *
+ * Atomically decrements @v by 1, so long as @v is non-zero.
+ * Returns non-zero if @v was non-zero, and zero otherwise.
+ */
+#define atomic_dec_not_zero(v)		atomic_add_unless((v), -1, 0)
+
+/**
  * atomic_inc_not_zero_hint - increment if not null
  * @v: pointer of type atomic_t
  * @hint: probable value of the atomic before the increment
-- 
1.7.5.4

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

* [PATCHv4 02/11] batman-adv: Remove private define of atomic_dec_not_zero
       [not found] ` <1311760070-21532-1-git-send-email-sven-KaDOiPu9UxWEi8DpZVb4nw@public.gmane.org>
@ 2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27  9:47     ` Sven Eckelmann
  0 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch-u79uwXL29TY76Z2rM5mHXA
  Cc: Simon Wunderlich, Marek Lindner,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA,
	b.a.t.m.a.n-ZwoEplunGu2X36UT3dwllkB+6BGkLq7r

atomic_dec_not_zero is defined through <linux/atomic.h> for all
architectures and batman-adv doesn't need an extra define which may
collide with the global one.

Signed-off-by: Sven Eckelmann <sven-KaDOiPu9UxWEi8DpZVb4nw@public.gmane.org>
Cc: Marek Lindner <lindner_marek-LWAfsSFWpa4@public.gmane.org>
Cc: Simon Wunderlich <siwu-MaAgPAbsBIVS8oHt8HbXEIQuADTiUCJX@public.gmane.org>
Cc: b.a.t.m.a.n-ZwoEplunGu2X36UT3dwllkB+6BGkLq7r@public.gmane.org
---
 net/batman-adv/main.h |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h
index a6df61a..d986f34 100644
--- a/net/batman-adv/main.h
+++ b/net/batman-adv/main.h
@@ -201,8 +201,6 @@ static inline int compare_eth(const void *data1, const void *data2)
 }
 
 
-#define atomic_dec_not_zero(v)	atomic_add_unless((v), -1, 0)
-
 /* Returns the smallest signed integer in two's complement with the sizeof x */
 #define smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
 
-- 
1.7.5.4

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

* [PATCHv4 02/11] batman-adv: Remove private define of atomic_dec_not_zero
  2011-07-27  9:47   ` [PATCHv4 02/11] batman-adv: Remove private define of atomic_dec_not_zero Sven Eckelmann
@ 2011-07-27  9:47     ` Sven Eckelmann
  0 siblings, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Marek Lindner, Simon Wunderlich,
	b.a.t.m.a.n

atomic_dec_not_zero is defined through <linux/atomic.h> for all
architectures and batman-adv doesn't need an extra define which may
collide with the global one.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Marek Lindner <lindner_marek@yahoo.de>
Cc: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Cc: b.a.t.m.a.n@lists.open-mesh.org
---
 net/batman-adv/main.h |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/net/batman-adv/main.h b/net/batman-adv/main.h
index a6df61a..d986f34 100644
--- a/net/batman-adv/main.h
+++ b/net/batman-adv/main.h
@@ -201,8 +201,6 @@ static inline int compare_eth(const void *data1, const void *data2)
 }
 
 
-#define atomic_dec_not_zero(v)	atomic_add_unless((v), -1, 0)
-
 /* Returns the smallest signed integer in two's complement with the sizeof x */
 #define smallest_signed_int(x) (1u << (7u + 8u * (sizeof(x) - 1u)))
 
-- 
1.7.5.4


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

* [PATCHv4 03/11] fault_inject: Remove private define of atomic_dec_not_zero
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
       [not found] ` <1311760070-21532-1-git-send-email-sven-KaDOiPu9UxWEi8DpZVb4nw@public.gmane.org>
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27  9:47 ` [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless Sven Eckelmann
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Akinobu Mita

atomic_dec_not_zero is defined through <linux/atomic.h> for all
architectures and fault_inject doesn't need an extra define which may
collide with the global one.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Akinobu Mita <akinobu.mita@gmail.com>
---
 lib/fault-inject.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/lib/fault-inject.c b/lib/fault-inject.c
index 2577b12..8ce98c6 100644
--- a/lib/fault-inject.c
+++ b/lib/fault-inject.c
@@ -45,8 +45,6 @@ static void fail_dump(struct fault_attr *attr)
 		dump_stack();
 }
 
-#define atomic_dec_not_zero(v)		atomic_add_unless((v), -1, 0)
-
 static bool fail_task(struct fault_attr *attr, struct task_struct *task)
 {
 	return !in_interrupt() && task->make_it_fail;
-- 
1.7.5.4

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

* [PATCHv4 03/11] fault_inject: Remove private define of atomic_dec_not_zero
  2011-07-27  9:47 ` [PATCHv4 03/11] fault_inject: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  0 siblings, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Akinobu Mita

atomic_dec_not_zero is defined through <linux/atomic.h> for all
architectures and fault_inject doesn't need an extra define which may
collide with the global one.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Akinobu Mita <akinobu.mita@gmail.com>
---
 lib/fault-inject.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/lib/fault-inject.c b/lib/fault-inject.c
index 2577b12..8ce98c6 100644
--- a/lib/fault-inject.c
+++ b/lib/fault-inject.c
@@ -45,8 +45,6 @@ static void fail_dump(struct fault_attr *attr)
 		dump_stack();
 }
 
-#define atomic_dec_not_zero(v)		atomic_add_unless((v), -1, 0)
-
 static bool fail_task(struct fault_attr *attr, struct task_struct *task)
 {
 	return !in_interrupt() && task->make_it_fail;
-- 
1.7.5.4


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

* [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
       [not found] ` <1311760070-21532-1-git-send-email-sven-KaDOiPu9UxWEi8DpZVb4nw@public.gmane.org>
  2011-07-27  9:47 ` [PATCHv4 03/11] fault_inject: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27 19:50   ` Rafael J. Wysocki
  2011-07-27  9:47 ` [PATCHv4 05/11] omap3isp: " Sven Eckelmann
                   ` (7 subsequent siblings)
  10 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Len Brown, Pavel Machek,
	Rafael J. Wysocki, linux-pm

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Cc: linux-pm@lists.linux-foundation.org
---
 drivers/base/power/runtime.c |    4 ++--
 include/linux/pm_runtime.h   |    2 +-
 kernel/power/hibernate.c     |    4 ++--
 kernel/power/user.c          |    2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
index 8dc247c..bda10d9 100644
--- a/drivers/base/power/runtime.c
+++ b/drivers/base/power/runtime.c
@@ -401,7 +401,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
 
 		if (dev->parent) {
 			parent = dev->parent;
-			atomic_add_unless(&parent->power.child_count, -1, 0);
+			atomic_dec_not_zero(&parent->power.child_count);
 		}
 	}
 	wake_up_all(&dev->power.wait_queue);
@@ -841,7 +841,7 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
 	if (status == RPM_SUSPENDED) {
 		/* It always is possible to set the status to 'suspended'. */
 		if (parent) {
-			atomic_add_unless(&parent->power.child_count, -1, 0);
+			atomic_dec_not_zero(&parent->power.child_count);
 			notify_parent = !parent->power.ignore_children;
 		}
 		goto out_set;
diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
index daac05d..3b4931c 100644
--- a/include/linux/pm_runtime.h
+++ b/include/linux/pm_runtime.h
@@ -63,7 +63,7 @@ static inline void pm_runtime_get_noresume(struct device *dev)
 
 static inline void pm_runtime_put_noidle(struct device *dev)
 {
-	atomic_add_unless(&dev->power.usage_count, -1, 0);
+	atomic_dec_not_zero(&dev->power.usage_count);
 }
 
 static inline bool device_run_wake(struct device *dev)
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index 8f7b1db..0ba8d87 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -606,7 +606,7 @@ int hibernate(void)
 
 	mutex_lock(&pm_mutex);
 	/* The snapshot device should not be opened while we're running */
-	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
+	if (!atomic_dec_not_zero(&snapshot_device_available)) {
 		error = -EBUSY;
 		goto Unlock;
 	}
@@ -756,7 +756,7 @@ static int software_resume(void)
 		goto Unlock;
 
 	/* The snapshot device should not be opened while we're running */
-	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
+	if (!atomic_dec_not_zero(&snapshot_device_available)) {
 		error = -EBUSY;
 		swsusp_close(FMODE_READ);
 		goto Unlock;
diff --git a/kernel/power/user.c b/kernel/power/user.c
index 42ddbc6..1c1cc01 100644
--- a/kernel/power/user.c
+++ b/kernel/power/user.c
@@ -72,7 +72,7 @@ static int snapshot_open(struct inode *inode, struct file *filp)
 
 	mutex_lock(&pm_mutex);
 
-	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
+	if (!atomic_dec_not_zero(&snapshot_device_available)) {
 		error = -EBUSY;
 		goto Unlock;
 	}
-- 
1.7.5.4

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

* [PATCHv4 05/11] omap3isp: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (2 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-31 15:00   ` Laurent Pinchart
  2011-07-27  9:47 ` [PATCHv4 06/11] qeth: " Sven Eckelmann
                   ` (6 subsequent siblings)
  10 siblings, 2 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Laurent Pinchart, linux-media

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org
---
 drivers/media/video/omap3isp/ispstat.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/media/video/omap3isp/ispstat.c b/drivers/media/video/omap3isp/ispstat.c
index b44cb68..81b1ec9 100644
--- a/drivers/media/video/omap3isp/ispstat.c
+++ b/drivers/media/video/omap3isp/ispstat.c
@@ -652,7 +652,7 @@ static int isp_stat_buf_process(struct ispstat *stat, int buf_state)
 {
 	int ret = STAT_NO_BUF;
 
-	if (!atomic_add_unless(&stat->buf_err, -1, 0) &&
+	if (!atomic_dec_not_zero(&stat->buf_err) &&
 	    buf_state == STAT_BUF_DONE && stat->state == ISPSTAT_ENABLED) {
 		ret = isp_stat_buf_queue(stat);
 		isp_stat_buf_next(stat);
-- 
1.7.5.4

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

* [PATCHv4 05/11] omap3isp: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 05/11] omap3isp: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  2011-07-31 15:00   ` Laurent Pinchart
  1 sibling, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Laurent Pinchart, linux-media

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: linux-media@vger.kernel.org
---
 drivers/media/video/omap3isp/ispstat.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/media/video/omap3isp/ispstat.c b/drivers/media/video/omap3isp/ispstat.c
index b44cb68..81b1ec9 100644
--- a/drivers/media/video/omap3isp/ispstat.c
+++ b/drivers/media/video/omap3isp/ispstat.c
@@ -652,7 +652,7 @@ static int isp_stat_buf_process(struct ispstat *stat, int buf_state)
 {
 	int ret = STAT_NO_BUF;
 
-	if (!atomic_add_unless(&stat->buf_err, -1, 0) &&
+	if (!atomic_dec_not_zero(&stat->buf_err) &&
 	    buf_state == STAT_BUF_DONE && stat->state == ISPSTAT_ENABLED) {
 		ret = isp_stat_buf_queue(stat);
 		isp_stat_buf_next(stat);
-- 
1.7.5.4


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

* [PATCHv4 06/11] qeth: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (3 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 05/11] omap3isp: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27  9:47 ` [PATCHv4 07/11] ext4: " Sven Eckelmann
                   ` (5 subsequent siblings)
  10 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Ursula Braun, Frank Blaschka,
	linux390, linux-s390

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Ursula Braun <ursula.braun@de.ibm.com>
Cc: Frank Blaschka <blaschka@linux.vnet.ibm.com>
Cc: linux390@de.ibm.com
Cc: linux-s390@vger.kernel.org
---
 drivers/s390/net/qeth_core_main.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 4550573..56ceed2 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -2765,7 +2765,7 @@ void qeth_queue_input_buffer(struct qeth_card *card, int index)
 			atomic_set(&card->force_alloc_skb, 3);
 			count = newcount;
 		} else {
-			atomic_add_unless(&card->force_alloc_skb, -1, 0);
+			atomic_dec_not_zero(&card->force_alloc_skb);
 		}
 
 		/*
-- 
1.7.5.4

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

* [PATCHv4 06/11] qeth: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 06/11] qeth: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  0 siblings, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Ursula Braun, Frank Blaschka,
	linux390, linux-s390

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Ursula Braun <ursula.braun@de.ibm.com>
Cc: Frank Blaschka <blaschka@linux.vnet.ibm.com>
Cc: linux390@de.ibm.com
Cc: linux-s390@vger.kernel.org
---
 drivers/s390/net/qeth_core_main.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index 4550573..56ceed2 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -2765,7 +2765,7 @@ void qeth_queue_input_buffer(struct qeth_card *card, int index)
 			atomic_set(&card->force_alloc_skb, 3);
 			count = newcount;
 		} else {
-			atomic_add_unless(&card->force_alloc_skb, -1, 0);
+			atomic_dec_not_zero(&card->force_alloc_skb);
 		}
 
 		/*
-- 
1.7.5.4


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

* [PATCHv4 07/11] ext4: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (4 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 06/11] qeth: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27  9:47 ` [PATCHv4 08/11] xfs: " Sven Eckelmann
                   ` (4 subsequent siblings)
  10 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Theodore Ts'o, Andreas Dilger,
	linux-ext4

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Cc: linux-ext4@vger.kernel.org
---
 fs/ext4/ext4.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index fa44df8..29996e8 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2098,7 +2098,7 @@ static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group)
 		 * We're able to grab the lock right away, so drop the
 		 * lock contention counter.
 		 */
-		atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0);
+		atomic_dec_not_zero(&EXT4_SB(sb)->s_lock_busy);
 	else {
 		/*
 		 * The lock is busy, so bump the contention counter,
-- 
1.7.5.4

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

* [PATCHv4 07/11] ext4: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 07/11] ext4: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  0 siblings, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Theodore Ts'o, Andreas Dilger,
	linux-ext4

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: "Theodore Ts'o" <tytso@mit.edu>
Cc: Andreas Dilger <adilger.kernel@dilger.ca>
Cc: linux-ext4@vger.kernel.org
---
 fs/ext4/ext4.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index fa44df8..29996e8 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2098,7 +2098,7 @@ static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group)
 		 * We're able to grab the lock right away, so drop the
 		 * lock contention counter.
 		 */
-		atomic_add_unless(&EXT4_SB(sb)->s_lock_busy, -1, 0);
+		atomic_dec_not_zero(&EXT4_SB(sb)->s_lock_busy);
 	else {
 		/*
 		 * The lock is busy, so bump the contention counter,
-- 
1.7.5.4


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

* [PATCHv4 08/11] xfs: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (5 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 07/11] ext4: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27  9:47 ` [PATCHv4 09/11] memcg: " Sven Eckelmann
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: xfs-masters, xfs, linux-kernel, Sven Eckelmann, Alex Elder

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Alex Elder <aelder@sgi.com>
Cc: xfs-masters@oss.sgi.com
Cc: xfs@oss.sgi.com
---
 fs/xfs/linux-2.6/xfs_buf.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index b2b4119..a68d9bf 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -1429,7 +1429,7 @@ xfs_buftarg_shrink(
 		 * zero. If the value is already zero, we need to reclaim the
 		 * buffer, otherwise it gets another trip through the LRU.
 		 */
-		if (!atomic_add_unless(&bp->b_lru_ref, -1, 0)) {
+		if (!atomic_dec_not_zero(&bp->b_lru_ref)) {
 			list_move_tail(&bp->b_lru, &btp->bt_lru);
 			continue;
 		}
-- 
1.7.5.4

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

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

* [PATCHv4 08/11] xfs: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 08/11] xfs: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  0 siblings, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Alex Elder, xfs-masters, xfs

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Alex Elder <aelder@sgi.com>
Cc: xfs-masters@oss.sgi.com
Cc: xfs@oss.sgi.com
---
 fs/xfs/linux-2.6/xfs_buf.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
index b2b4119..a68d9bf 100644
--- a/fs/xfs/linux-2.6/xfs_buf.c
+++ b/fs/xfs/linux-2.6/xfs_buf.c
@@ -1429,7 +1429,7 @@ xfs_buftarg_shrink(
 		 * zero. If the value is already zero, we need to reclaim the
 		 * buffer, otherwise it gets another trip through the LRU.
 		 */
-		if (!atomic_add_unless(&bp->b_lru_ref, -1, 0)) {
+		if (!atomic_dec_not_zero(&bp->b_lru_ref)) {
 			list_move_tail(&bp->b_lru, &btp->bt_lru);
 			continue;
 		}
-- 
1.7.5.4


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

* [PATCHv4 09/11] memcg: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (6 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 08/11] xfs: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27 11:58   ` Michal Hocko
  2011-07-27  9:47 ` [PATCHv4 10/11] drop_monitor: " Sven Eckelmann
                   ` (2 subsequent siblings)
  10 siblings, 2 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Balbir Singh, Daisuke Nishimura,
	KAMEZAWA Hiroyuki, linux-mm

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: linux-mm@kvack.org
---
 mm/memcontrol.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 5f84d23..00a7580 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1909,10 +1909,10 @@ static void mem_cgroup_unmark_under_oom(struct mem_cgroup *mem)
 	/*
 	 * When a new child is created while the hierarchy is under oom,
 	 * mem_cgroup_oom_lock() may not be called. We have to use
-	 * atomic_add_unless() here.
+	 * atomic_dec_not_zero() here.
 	 */
 	for_each_mem_cgroup_tree(iter, mem)
-		atomic_add_unless(&iter->under_oom, -1, 0);
+		atomic_dec_not_zero(&iter->under_oom);
 }
 
 static DEFINE_SPINLOCK(memcg_oom_lock);
-- 
1.7.5.4

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

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

* [PATCHv4 09/11] memcg: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 09/11] memcg: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27 11:58   ` Michal Hocko
  1 sibling, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch
  Cc: linux-kernel, Sven Eckelmann, Balbir Singh, Daisuke Nishimura,
	KAMEZAWA Hiroyuki, linux-mm

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: linux-mm@kvack.org
---
 mm/memcontrol.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 5f84d23..00a7580 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1909,10 +1909,10 @@ static void mem_cgroup_unmark_under_oom(struct mem_cgroup *mem)
 	/*
 	 * When a new child is created while the hierarchy is under oom,
 	 * mem_cgroup_oom_lock() may not be called. We have to use
-	 * atomic_add_unless() here.
+	 * atomic_dec_not_zero() here.
 	 */
 	for_each_mem_cgroup_tree(iter, mem)
-		atomic_add_unless(&iter->under_oom, -1, 0);
+		atomic_dec_not_zero(&iter->under_oom);
 }
 
 static DEFINE_SPINLOCK(memcg_oom_lock);
-- 
1.7.5.4


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

* [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (7 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 09/11] memcg: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27 10:59   ` Neil Horman
  2011-07-27  9:47 ` [PATCHv4 11/11] Phonet: " Sven Eckelmann
  2011-08-02  9:58 ` [PATCHv4 01/11] atomic: add *_dec_not_zero Ralf Baechle
  10 siblings, 2 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Neil Horman, netdev

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: netdev@vger.kernel.org
---
 net/core/drop_monitor.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
index 7f36b38..ef4a05d 100644
--- a/net/core/drop_monitor.c
+++ b/net/core/drop_monitor.c
@@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb, void *location)
 	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
 
 
-	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
+	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
 		/*
 		 * we're already at zero, discard this hit
 		 */
-- 
1.7.5.4


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

* [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 10/11] drop_monitor: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27 10:59   ` Neil Horman
  1 sibling, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Neil Horman, netdev

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Neil Horman <nhorman@tuxdriver.com>
Cc: netdev@vger.kernel.org
---
 net/core/drop_monitor.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
index 7f36b38..ef4a05d 100644
--- a/net/core/drop_monitor.c
+++ b/net/core/drop_monitor.c
@@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb, void *location)
 	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
 
 
-	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
+	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
 		/*
 		 * we're already at zero, discard this hit
 		 */
-- 
1.7.5.4


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

* [PATCHv4 11/11] Phonet: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (8 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 10/11] drop_monitor: " Sven Eckelmann
@ 2011-07-27  9:47 ` Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27 10:29   ` Rémi Denis-Courmont
  2011-08-02  9:58 ` [PATCHv4 01/11] atomic: add *_dec_not_zero Ralf Baechle
  10 siblings, 2 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Remi Denis-Courmont

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
---
 net/phonet/pep.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/net/phonet/pep.c b/net/phonet/pep.c
index f17fd84..b192c83 100644
--- a/net/phonet/pep.c
+++ b/net/phonet/pep.c
@@ -1013,7 +1013,7 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff *skb)
 	int err;
 
 	if (pn_flow_safe(pn->tx_fc) &&
-	    !atomic_add_unless(&pn->tx_credits, -1, 0)) {
+	    !atomic_dec_not_zero(&pn->tx_credits)) {
 		kfree_skb(skb);
 		return -ENOBUFS;
 	}
-- 
1.7.5.4

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

* [PATCHv4 11/11] Phonet: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 11/11] Phonet: " Sven Eckelmann
@ 2011-07-27  9:47   ` Sven Eckelmann
  2011-07-27 10:29   ` Rémi Denis-Courmont
  1 sibling, 0 replies; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27  9:47 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel, Sven Eckelmann, Remi Denis-Courmont

atomic_dec_not_zero is defined for each architecture through
<linux/atomic.h> to provide the functionality of
atomic_add_unless(x, -1, 0).

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Cc: Remi Denis-Courmont <remi.denis-courmont@nokia.com>
---
 net/phonet/pep.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/net/phonet/pep.c b/net/phonet/pep.c
index f17fd84..b192c83 100644
--- a/net/phonet/pep.c
+++ b/net/phonet/pep.c
@@ -1013,7 +1013,7 @@ static int pipe_skb_send(struct sock *sk, struct sk_buff *skb)
 	int err;
 
 	if (pn_flow_safe(pn->tx_fc) &&
-	    !atomic_add_unless(&pn->tx_credits, -1, 0)) {
+	    !atomic_dec_not_zero(&pn->tx_credits)) {
 		kfree_skb(skb);
 		return -ENOBUFS;
 	}
-- 
1.7.5.4


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

* Re: [PATCHv4 11/11] Phonet: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 11/11] Phonet: " Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
@ 2011-07-27 10:29   ` Rémi Denis-Courmont
  1 sibling, 0 replies; 37+ messages in thread
From: Rémi Denis-Courmont @ 2011-07-27 10:29 UTC (permalink / raw)
  To: linux-arch; +Cc: linux-kernel

On Wednesday 27 July 2011 12:47:50 ext Sven Eckelmann, you wrote:
> atomic_dec_not_zero is defined for each architecture through
> <linux/atomic.h> to provide the functionality of
> atomic_add_unless(x, -1, 0).
> 
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Cc: Remi Denis-Courmont <remi.denis-courmont@nokia.com>

Acked-by: Rémi Denis-Courmont <remi.denis-courmont@nokia.com>

> ---
>  net/phonet/pep.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/net/phonet/pep.c b/net/phonet/pep.c
> index f17fd84..b192c83 100644
> --- a/net/phonet/pep.c
> +++ b/net/phonet/pep.c
> @@ -1013,7 +1013,7 @@ static int pipe_skb_send(struct sock *sk, struct
> sk_buff *skb) int err;
> 
>  	if (pn_flow_safe(pn->tx_fc) &&
> -	    !atomic_add_unless(&pn->tx_credits, -1, 0)) {
> +	    !atomic_dec_not_zero(&pn->tx_credits)) {
>  		kfree_skb(skb);
>  		return -ENOBUFS;
>  	}


-- 
Rémi Denis-Courmont
http://www.remlab.net/

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

* Re: [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 10/11] drop_monitor: " Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
@ 2011-07-27 10:59   ` Neil Horman
  2011-07-27 10:59     ` Neil Horman
  2011-07-27 11:52     ` Sven Eckelmann
  1 sibling, 2 replies; 37+ messages in thread
From: Neil Horman @ 2011-07-27 10:59 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, netdev

On Wed, Jul 27, 2011 at 11:47:49AM +0200, Sven Eckelmann wrote:
> atomic_dec_not_zero is defined for each architecture through
> <linux/atomic.h> to provide the functionality of
> atomic_add_unless(x, -1, 0).
> 
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Cc: Neil Horman <nhorman@tuxdriver.com>
> Cc: netdev@vger.kernel.org
> ---
>  net/core/drop_monitor.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
> index 7f36b38..ef4a05d 100644
> --- a/net/core/drop_monitor.c
> +++ b/net/core/drop_monitor.c
> @@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb, void *location)
>  	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
>  
>  
> -	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
> +	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
>  		/*
>  		 * we're already at zero, discard this hit
>  		 */
> -- 
> 1.7.5.4
> 
> 
Wheres the patch that creates the per arch definition of this function?  I see
the other posts in this series went to lkml, but the archives don't have the
first in the series anywhere, which ostensibly adds the definition.  
Neil


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

* Re: [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 10:59   ` Neil Horman
@ 2011-07-27 10:59     ` Neil Horman
  2011-07-27 11:52     ` Sven Eckelmann
  1 sibling, 0 replies; 37+ messages in thread
From: Neil Horman @ 2011-07-27 10:59 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, netdev

On Wed, Jul 27, 2011 at 11:47:49AM +0200, Sven Eckelmann wrote:
> atomic_dec_not_zero is defined for each architecture through
> <linux/atomic.h> to provide the functionality of
> atomic_add_unless(x, -1, 0).
> 
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Cc: Neil Horman <nhorman@tuxdriver.com>
> Cc: netdev@vger.kernel.org
> ---
>  net/core/drop_monitor.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
> index 7f36b38..ef4a05d 100644
> --- a/net/core/drop_monitor.c
> +++ b/net/core/drop_monitor.c
> @@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb, void *location)
>  	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
>  
>  
> -	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
> +	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
>  		/*
>  		 * we're already at zero, discard this hit
>  		 */
> -- 
> 1.7.5.4
> 
> 
Wheres the patch that creates the per arch definition of this function?  I see
the other posts in this series went to lkml, but the archives don't have the
first in the series anywhere, which ostensibly adds the definition.  
Neil


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

* Re: Re: [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 10:59   ` Neil Horman
  2011-07-27 10:59     ` Neil Horman
@ 2011-07-27 11:52     ` Sven Eckelmann
  2011-07-27 14:25       ` Neil Horman
  1 sibling, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-07-27 11:52 UTC (permalink / raw)
  To: Neil Horman; +Cc: linux-arch, linux-kernel, netdev

[-- Attachment #1: Type: text/plain, Size: 1659 bytes --]

On Wednesday 27 July 2011 06:59:07 Neil Horman wrote:
> On Wed, Jul 27, 2011 at 11:47:49AM +0200, Sven Eckelmann wrote:
> > atomic_dec_not_zero is defined for each architecture through
> > <linux/atomic.h> to provide the functionality of
> > atomic_add_unless(x, -1, 0).
> > 
> > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > Cc: Neil Horman <nhorman@tuxdriver.com>
> > Cc: netdev@vger.kernel.org
> > ---
> > 
> >  net/core/drop_monitor.c |    2 +-
> >  1 files changed, 1 insertions(+), 1 deletions(-)
> > 
> > diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
> > index 7f36b38..ef4a05d 100644
> > --- a/net/core/drop_monitor.c
> > +++ b/net/core/drop_monitor.c
> > @@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb,
> > void *location)
> > 
> >  	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
> > 
> > -	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
> > +	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
> > 
> >  		/*
> >  		
> >  		 * we're already at zero, discard this hit
> >  		 */
> 
> Wheres the patch that creates the per arch definition of this function?  I
> see the other posts in this series went to lkml, but the archives don't
> have the first in the series anywhere, which ostensibly adds the
> definition. Neil

Most architectures don't use a per architecture definition anymore, but a 
cross-architecture the definition in include/linux/atomic.h.

The 01/11 can be found in different archives under the message id 
1311760070-21532-1-git-send-email-sven@narfation.org ... for example gmane: 
http://article.gmane.org/gmane.linux.ports.arm.kernel/126704

Kind regards,
	Sven

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCHv4 09/11] memcg: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 09/11] memcg: " Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
@ 2011-07-27 11:58   ` Michal Hocko
  1 sibling, 0 replies; 37+ messages in thread
From: Michal Hocko @ 2011-07-27 11:58 UTC (permalink / raw)
  To: Sven Eckelmann
  Cc: linux-arch, linux-kernel, Balbir Singh, Daisuke Nishimura,
	KAMEZAWA Hiroyuki, linux-mm

On Wed 27-07-11 11:47:48, Sven Eckelmann wrote:
> atomic_dec_not_zero is defined for each architecture through
> <linux/atomic.h> to provide the functionality of
> atomic_add_unless(x, -1, 0).

yes, I like it because atomic_dec_* is more consistent (at least from
the code reading) with atomic_inc used by mem_cgroup_mark_under_oom
which.

> 
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Cc: Balbir Singh <balbir@linux.vnet.ibm.com>
> Cc: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
> Cc: linux-mm@kvack.org

Acked-by: Michal Hocko <mhocko@suse.cz>

> ---
>  mm/memcontrol.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 5f84d23..00a7580 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1909,10 +1909,10 @@ static void mem_cgroup_unmark_under_oom(struct mem_cgroup *mem)
>  	/*
>  	 * When a new child is created while the hierarchy is under oom,
>  	 * mem_cgroup_oom_lock() may not be called. We have to use
> -	 * atomic_add_unless() here.
> +	 * atomic_dec_not_zero() here.
>  	 */
>  	for_each_mem_cgroup_tree(iter, mem)
> -		atomic_add_unless(&iter->under_oom, -1, 0);
> +		atomic_dec_not_zero(&iter->under_oom);
>  }
>  
>  static DEFINE_SPINLOCK(memcg_oom_lock);
> -- 
> 1.7.5.4
> 
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to majordomo@kvack.org.  For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

-- 
Michal Hocko
SUSE Labs
SUSE LINUX s.r.o.
Lihovarska 1060/12
190 00 Praha 9    
Czech Republic

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

* Re: Re: [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 11:52     ` Sven Eckelmann
@ 2011-07-27 14:25       ` Neil Horman
  2011-07-27 14:25         ` Neil Horman
  0 siblings, 1 reply; 37+ messages in thread
From: Neil Horman @ 2011-07-27 14:25 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, netdev

On Wed, Jul 27, 2011 at 01:52:50PM +0200, Sven Eckelmann wrote:
> On Wednesday 27 July 2011 06:59:07 Neil Horman wrote:
> > On Wed, Jul 27, 2011 at 11:47:49AM +0200, Sven Eckelmann wrote:
> > > atomic_dec_not_zero is defined for each architecture through
> > > <linux/atomic.h> to provide the functionality of
> > > atomic_add_unless(x, -1, 0).
> > > 
> > > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > > Cc: Neil Horman <nhorman@tuxdriver.com>
> > > Cc: netdev@vger.kernel.org
> > > ---
> > > 
> > >  net/core/drop_monitor.c |    2 +-
> > >  1 files changed, 1 insertions(+), 1 deletions(-)
> > > 
> > > diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
> > > index 7f36b38..ef4a05d 100644
> > > --- a/net/core/drop_monitor.c
> > > +++ b/net/core/drop_monitor.c
> > > @@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb,
> > > void *location)
> > > 
> > >  	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
> > > 
> > > -	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
> > > +	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
> > > 
> > >  		/*
> > >  		
> > >  		 * we're already at zero, discard this hit
> > >  		 */
> > 
> > Wheres the patch that creates the per arch definition of this function?  I
> > see the other posts in this series went to lkml, but the archives don't
> > have the first in the series anywhere, which ostensibly adds the
> > definition. Neil
> 
> Most architectures don't use a per architecture definition anymore, but a 
> cross-architecture the definition in include/linux/atomic.h.
> 
> The 01/11 can be found in different archives under the message id 
> 1311760070-21532-1-git-send-email-sven@narfation.org ... for example gmane: 
> http://article.gmane.org/gmane.linux.ports.arm.kernel/126704
> 
> Kind regards,
> 	Sven
Ok, thank you, I just didn't see the patch that implemented it in the lkml
archive at MARC, and wanted to be sure this wasn't proposed for a different tree
than the patch with the definition.

Acked-by: Neil Horman <nhorman@tuxdriver.com>

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

* Re: Re: [PATCHv4 10/11] drop_monitor: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 14:25       ` Neil Horman
@ 2011-07-27 14:25         ` Neil Horman
  0 siblings, 0 replies; 37+ messages in thread
From: Neil Horman @ 2011-07-27 14:25 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, netdev

On Wed, Jul 27, 2011 at 01:52:50PM +0200, Sven Eckelmann wrote:
> On Wednesday 27 July 2011 06:59:07 Neil Horman wrote:
> > On Wed, Jul 27, 2011 at 11:47:49AM +0200, Sven Eckelmann wrote:
> > > atomic_dec_not_zero is defined for each architecture through
> > > <linux/atomic.h> to provide the functionality of
> > > atomic_add_unless(x, -1, 0).
> > > 
> > > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > > Cc: Neil Horman <nhorman@tuxdriver.com>
> > > Cc: netdev@vger.kernel.org
> > > ---
> > > 
> > >  net/core/drop_monitor.c |    2 +-
> > >  1 files changed, 1 insertions(+), 1 deletions(-)
> > > 
> > > diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c
> > > index 7f36b38..ef4a05d 100644
> > > --- a/net/core/drop_monitor.c
> > > +++ b/net/core/drop_monitor.c
> > > @@ -137,7 +137,7 @@ static void trace_drop_common(struct sk_buff *skb,
> > > void *location)
> > > 
> > >  	struct per_cpu_dm_data *data = &__get_cpu_var(dm_cpu_data);
> > > 
> > > -	if (!atomic_add_unless(&data->dm_hit_count, -1, 0)) {
> > > +	if (!atomic_dec_not_zero(&data->dm_hit_count)) {
> > > 
> > >  		/*
> > >  		
> > >  		 * we're already at zero, discard this hit
> > >  		 */
> > 
> > Wheres the patch that creates the per arch definition of this function?  I
> > see the other posts in this series went to lkml, but the archives don't
> > have the first in the series anywhere, which ostensibly adds the
> > definition. Neil
> 
> Most architectures don't use a per architecture definition anymore, but a 
> cross-architecture the definition in include/linux/atomic.h.
> 
> The 01/11 can be found in different archives under the message id 
> 1311760070-21532-1-git-send-email-sven@narfation.org ... for example gmane: 
> http://article.gmane.org/gmane.linux.ports.arm.kernel/126704
> 
> Kind regards,
> 	Sven
Ok, thank you, I just didn't see the patch that implemented it in the lkml
archive at MARC, and wanted to be sure this wasn't proposed for a different tree
than the patch with the definition.

Acked-by: Neil Horman <nhorman@tuxdriver.com>




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

* Re: [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless Sven Eckelmann
@ 2011-07-27 19:50   ` Rafael J. Wysocki
  2011-07-27 20:36     ` Pavel Machek
  0 siblings, 1 reply; 37+ messages in thread
From: Rafael J. Wysocki @ 2011-07-27 19:50 UTC (permalink / raw)
  To: Sven Eckelmann
  Cc: linux-arch, linux-kernel, Len Brown, Pavel Machek, linux-pm

On Wednesday, July 27, 2011, Sven Eckelmann wrote:
> atomic_dec_not_zero is defined for each architecture through
> <linux/atomic.h> to provide the functionality of
> atomic_add_unless(x, -1, 0).
> 
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Cc: Len Brown <len.brown@intel.com>
> Cc: Pavel Machek <pavel@ucw.cz>
> Cc: Rafael J. Wysocki <rjw@sisk.pl>
> Cc: linux-pm@lists.linux-foundation.org

Acked-by: Rafael J. Wysocki <rjw@sisk.pl>

> ---
>  drivers/base/power/runtime.c |    4 ++--
>  include/linux/pm_runtime.h   |    2 +-
>  kernel/power/hibernate.c     |    4 ++--
>  kernel/power/user.c          |    2 +-
>  4 files changed, 6 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> index 8dc247c..bda10d9 100644
> --- a/drivers/base/power/runtime.c
> +++ b/drivers/base/power/runtime.c
> @@ -401,7 +401,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
>  
>  		if (dev->parent) {
>  			parent = dev->parent;
> -			atomic_add_unless(&parent->power.child_count, -1, 0);
> +			atomic_dec_not_zero(&parent->power.child_count);
>  		}
>  	}
>  	wake_up_all(&dev->power.wait_queue);
> @@ -841,7 +841,7 @@ int __pm_runtime_set_status(struct device *dev, unsigned int status)
>  	if (status == RPM_SUSPENDED) {
>  		/* It always is possible to set the status to 'suspended'. */
>  		if (parent) {
> -			atomic_add_unless(&parent->power.child_count, -1, 0);
> +			atomic_dec_not_zero(&parent->power.child_count);
>  			notify_parent = !parent->power.ignore_children;
>  		}
>  		goto out_set;
> diff --git a/include/linux/pm_runtime.h b/include/linux/pm_runtime.h
> index daac05d..3b4931c 100644
> --- a/include/linux/pm_runtime.h
> +++ b/include/linux/pm_runtime.h
> @@ -63,7 +63,7 @@ static inline void pm_runtime_get_noresume(struct device *dev)
>  
>  static inline void pm_runtime_put_noidle(struct device *dev)
>  {
> -	atomic_add_unless(&dev->power.usage_count, -1, 0);
> +	atomic_dec_not_zero(&dev->power.usage_count);
>  }
>  
>  static inline bool device_run_wake(struct device *dev)
> diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
> index 8f7b1db..0ba8d87 100644
> --- a/kernel/power/hibernate.c
> +++ b/kernel/power/hibernate.c
> @@ -606,7 +606,7 @@ int hibernate(void)
>  
>  	mutex_lock(&pm_mutex);
>  	/* The snapshot device should not be opened while we're running */
> -	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
> +	if (!atomic_dec_not_zero(&snapshot_device_available)) {
>  		error = -EBUSY;
>  		goto Unlock;
>  	}
> @@ -756,7 +756,7 @@ static int software_resume(void)
>  		goto Unlock;
>  
>  	/* The snapshot device should not be opened while we're running */
> -	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
> +	if (!atomic_dec_not_zero(&snapshot_device_available)) {
>  		error = -EBUSY;
>  		swsusp_close(FMODE_READ);
>  		goto Unlock;
> diff --git a/kernel/power/user.c b/kernel/power/user.c
> index 42ddbc6..1c1cc01 100644
> --- a/kernel/power/user.c
> +++ b/kernel/power/user.c
> @@ -72,7 +72,7 @@ static int snapshot_open(struct inode *inode, struct file *filp)
>  
>  	mutex_lock(&pm_mutex);
>  
> -	if (!atomic_add_unless(&snapshot_device_available, -1, 0)) {
> +	if (!atomic_dec_not_zero(&snapshot_device_available)) {
>  		error = -EBUSY;
>  		goto Unlock;
>  	}
> 

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

* Re: [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 19:50   ` Rafael J. Wysocki
@ 2011-07-27 20:36     ` Pavel Machek
  2011-07-27 20:36       ` Pavel Machek
  2011-07-28 21:43       ` Rafael J. Wysocki
  0 siblings, 2 replies; 37+ messages in thread
From: Pavel Machek @ 2011-07-27 20:36 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Sven Eckelmann, linux-arch, linux-kernel, Len Brown, linux-pm

Hi!

> > atomic_dec_not_zero is defined for each architecture through
> > <linux/atomic.h> to provide the functionality of
> > atomic_add_unless(x, -1, 0).
> > 
> > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > Cc: Len Brown <len.brown@intel.com>
> > Cc: Pavel Machek <pavel@ucw.cz>
> > Cc: Rafael J. Wysocki <rjw@sisk.pl>
> > Cc: linux-pm@lists.linux-foundation.org
> 
> Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
> 
> > ---
> >  drivers/base/power/runtime.c |    4 ++--
> >  include/linux/pm_runtime.h   |    2 +-
> >  kernel/power/hibernate.c     |    4 ++--
> >  kernel/power/user.c          |    2 +-
> >  4 files changed, 6 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> > index 8dc247c..bda10d9 100644
> > --- a/drivers/base/power/runtime.c
> > +++ b/drivers/base/power/runtime.c
> > @@ -401,7 +401,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
> >  
> >  		if (dev->parent) {
> >  			parent = dev->parent;
> > -			atomic_add_unless(&parent->power.child_count, -1, 0);
> > +  atomic_dec_not_zero(&parent->power.child_count);

I'd like to understand... Why not atomic_dec in the first place? Count
should be exact, anyway, or we run into problems, right?

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* Re: [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 20:36     ` Pavel Machek
@ 2011-07-27 20:36       ` Pavel Machek
  2011-07-28 21:43       ` Rafael J. Wysocki
  1 sibling, 0 replies; 37+ messages in thread
From: Pavel Machek @ 2011-07-27 20:36 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: Sven Eckelmann, linux-arch, linux-kernel, Len Brown, linux-pm

Hi!

> > atomic_dec_not_zero is defined for each architecture through
> > <linux/atomic.h> to provide the functionality of
> > atomic_add_unless(x, -1, 0).
> > 
> > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > Cc: Len Brown <len.brown@intel.com>
> > Cc: Pavel Machek <pavel@ucw.cz>
> > Cc: Rafael J. Wysocki <rjw@sisk.pl>
> > Cc: linux-pm@lists.linux-foundation.org
> 
> Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
> 
> > ---
> >  drivers/base/power/runtime.c |    4 ++--
> >  include/linux/pm_runtime.h   |    2 +-
> >  kernel/power/hibernate.c     |    4 ++--
> >  kernel/power/user.c          |    2 +-
> >  4 files changed, 6 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> > index 8dc247c..bda10d9 100644
> > --- a/drivers/base/power/runtime.c
> > +++ b/drivers/base/power/runtime.c
> > @@ -401,7 +401,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
> >  
> >  		if (dev->parent) {
> >  			parent = dev->parent;
> > -			atomic_add_unless(&parent->power.child_count, -1, 0);
> > +  atomic_dec_not_zero(&parent->power.child_count);

I'd like to understand... Why not atomic_dec in the first place? Count
should be exact, anyway, or we run into problems, right?

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* Re: [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless
  2011-07-27 20:36     ` Pavel Machek
  2011-07-27 20:36       ` Pavel Machek
@ 2011-07-28 21:43       ` Rafael J. Wysocki
  2011-07-28 21:43         ` Rafael J. Wysocki
  1 sibling, 1 reply; 37+ messages in thread
From: Rafael J. Wysocki @ 2011-07-28 21:43 UTC (permalink / raw)
  To: Pavel Machek
  Cc: linux-arch, Len Brown, linux-pm, linux-kernel, Sven Eckelmann

On Wednesday, July 27, 2011, Pavel Machek wrote:
> Hi!
> 
> > > atomic_dec_not_zero is defined for each architecture through
> > > <linux/atomic.h> to provide the functionality of
> > > atomic_add_unless(x, -1, 0).
> > > 
> > > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > > Cc: Len Brown <len.brown@intel.com>
> > > Cc: Pavel Machek <pavel@ucw.cz>
> > > Cc: Rafael J. Wysocki <rjw@sisk.pl>
> > > Cc: linux-pm@lists.linux-foundation.org
> > 
> > Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
> > 
> > > ---
> > >  drivers/base/power/runtime.c |    4 ++--
> > >  include/linux/pm_runtime.h   |    2 +-
> > >  kernel/power/hibernate.c     |    4 ++--
> > >  kernel/power/user.c          |    2 +-
> > >  4 files changed, 6 insertions(+), 6 deletions(-)
> > > 
> > > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> > > index 8dc247c..bda10d9 100644
> > > --- a/drivers/base/power/runtime.c
> > > +++ b/drivers/base/power/runtime.c
> > > @@ -401,7 +401,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
> > >  
> > >  		if (dev->parent) {
> > >  			parent = dev->parent;
> > > -			atomic_add_unless(&parent->power.child_count, -1, 0);
> > > +  atomic_dec_not_zero(&parent->power.child_count);
> 
> I'd like to understand... Why not atomic_dec in the first place? Count
> should be exact, anyway, or we run into problems, right?

Well, we'll also run into trouble if the count becomes negative.  We might
throw a WARN_ON() there if the old value weren't as expected, but that
would be a separate patch.

Thanks,
Rafael

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

* Re: [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless
  2011-07-28 21:43       ` Rafael J. Wysocki
@ 2011-07-28 21:43         ` Rafael J. Wysocki
  0 siblings, 0 replies; 37+ messages in thread
From: Rafael J. Wysocki @ 2011-07-28 21:43 UTC (permalink / raw)
  To: Pavel Machek
  Cc: Sven Eckelmann, linux-arch, linux-kernel, Len Brown, linux-pm

On Wednesday, July 27, 2011, Pavel Machek wrote:
> Hi!
> 
> > > atomic_dec_not_zero is defined for each architecture through
> > > <linux/atomic.h> to provide the functionality of
> > > atomic_add_unless(x, -1, 0).
> > > 
> > > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > > Cc: Len Brown <len.brown@intel.com>
> > > Cc: Pavel Machek <pavel@ucw.cz>
> > > Cc: Rafael J. Wysocki <rjw@sisk.pl>
> > > Cc: linux-pm@lists.linux-foundation.org
> > 
> > Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
> > 
> > > ---
> > >  drivers/base/power/runtime.c |    4 ++--
> > >  include/linux/pm_runtime.h   |    2 +-
> > >  kernel/power/hibernate.c     |    4 ++--
> > >  kernel/power/user.c          |    2 +-
> > >  4 files changed, 6 insertions(+), 6 deletions(-)
> > > 
> > > diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c
> > > index 8dc247c..bda10d9 100644
> > > --- a/drivers/base/power/runtime.c
> > > +++ b/drivers/base/power/runtime.c
> > > @@ -401,7 +401,7 @@ static int rpm_suspend(struct device *dev, int rpmflags)
> > >  
> > >  		if (dev->parent) {
> > >  			parent = dev->parent;
> > > -			atomic_add_unless(&parent->power.child_count, -1, 0);
> > > +  atomic_dec_not_zero(&parent->power.child_count);
> 
> I'd like to understand... Why not atomic_dec in the first place? Count
> should be exact, anyway, or we run into problems, right?

Well, we'll also run into trouble if the count becomes negative.  We might
throw a WARN_ON() there if the old value weren't as expected, but that
would be a separate patch.

Thanks,
Rafael

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

* Re: [PATCHv4 05/11] omap3isp: Use *_dec_not_zero instead of *_add_unless
  2011-07-27  9:47 ` [PATCHv4 05/11] omap3isp: " Sven Eckelmann
  2011-07-27  9:47   ` Sven Eckelmann
@ 2011-07-31 15:00   ` Laurent Pinchart
  2011-08-01 10:07     ` Sven Eckelmann
  1 sibling, 1 reply; 37+ messages in thread
From: Laurent Pinchart @ 2011-07-31 15:00 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, linux-media

Hi Sven,

Thanks for the patch.

On Wednesday 27 July 2011 11:47:44 Sven Eckelmann wrote:
> atomic_dec_not_zero is defined for each architecture through
> <linux/atomic.h> to provide the functionality of
> atomic_add_unless(x, -1, 0).
> 
> Signed-off-by: Sven Eckelmann <sven@narfation.org>
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

I'll queue this to my tree for v3.2. Please let me know if you would rather 
push the patch through another tree.

> Cc: linux-media@vger.kernel.org
> ---
>  drivers/media/video/omap3isp/ispstat.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/media/video/omap3isp/ispstat.c
> b/drivers/media/video/omap3isp/ispstat.c index b44cb68..81b1ec9 100644
> --- a/drivers/media/video/omap3isp/ispstat.c
> +++ b/drivers/media/video/omap3isp/ispstat.c
> @@ -652,7 +652,7 @@ static int isp_stat_buf_process(struct ispstat *stat,
> int buf_state) {
>  	int ret = STAT_NO_BUF;
> 
> -	if (!atomic_add_unless(&stat->buf_err, -1, 0) &&
> +	if (!atomic_dec_not_zero(&stat->buf_err) &&
>  	    buf_state == STAT_BUF_DONE && stat->state == ISPSTAT_ENABLED) {
>  		ret = isp_stat_buf_queue(stat);
>  		isp_stat_buf_next(stat);

-- 
Regards,

Laurent Pinchart

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

* Re: Re: [PATCHv4 05/11] omap3isp: Use *_dec_not_zero instead of *_add_unless
  2011-07-31 15:00   ` Laurent Pinchart
@ 2011-08-01 10:07     ` Sven Eckelmann
  2011-08-01 11:10       ` Laurent Pinchart
  0 siblings, 1 reply; 37+ messages in thread
From: Sven Eckelmann @ 2011-08-01 10:07 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: linux-arch, linux-kernel, linux-media

[-- Attachment #1: Type: text/plain, Size: 1161 bytes --]

On Sunday 31 July 2011 17:00:43 Laurent Pinchart wrote:
> Hi Sven,
> 
> Thanks for the patch.
> 
> On Wednesday 27 July 2011 11:47:44 Sven Eckelmann wrote:
> > atomic_dec_not_zero is defined for each architecture through
> > <linux/atomic.h> to provide the functionality of
> > atomic_add_unless(x, -1, 0).
> > 
> > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> 
> I'll queue this to my tree for v3.2. Please let me know if you would rather
> push the patch through another tree.

The problem is that until now no one from linux-arch has applied the patch 
01/11 in his tree (which is needed before this patch can be applied) and you 
tree have to be based on the "yet to be chosen linux-arch tree". Otherwise 
your tree will just break and not be acceptable for a pull request. 

Maybe it is easier when one person applies 01-11 after 02-11 was Acked-by the 
responsible maintainers.

02 is more or less automatically Acked-by us :)
04, 09 and 10 are also Acked.
... and the rest is waiting for actions.

Kind regards,
	Sven

[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

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

* Re: [PATCHv4 05/11] omap3isp: Use *_dec_not_zero instead of *_add_unless
  2011-08-01 10:07     ` Sven Eckelmann
@ 2011-08-01 11:10       ` Laurent Pinchart
  2011-08-01 11:10         ` Laurent Pinchart
  0 siblings, 1 reply; 37+ messages in thread
From: Laurent Pinchart @ 2011-08-01 11:10 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, linux-media

Hi Sven,

On Monday 01 August 2011 12:07:15 Sven Eckelmann wrote:
> On Sunday 31 July 2011 17:00:43 Laurent Pinchart wrote:
> > On Wednesday 27 July 2011 11:47:44 Sven Eckelmann wrote:
> > > atomic_dec_not_zero is defined for each architecture through
> > > <linux/atomic.h> to provide the functionality of
> > > atomic_add_unless(x, -1, 0).
> > > 
> > > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > > Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > 
> > Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > 
> > I'll queue this to my tree for v3.2. Please let me know if you would
> > rather push the patch through another tree.
> 
> The problem is that until now no one from linux-arch has applied the patch
> 01/11 in his tree (which is needed before this patch can be applied) and
> you tree have to be based on the "yet to be chosen linux-arch tree".
> Otherwise your tree will just break and not be acceptable for a pull
> request.
> 
> Maybe it is easier when one person applies 01-11 after 02-11 was Acked-by
> the responsible maintainers.
> 
> 02 is more or less automatically Acked-by us :)
> 04, 09 and 10 are also Acked.
> ... and the rest is waiting for actions.

OK. I'm fine with 05/11 being pushed through any tree with my ack. Please let 
me know if/when you want me to apply it to my tree.

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCHv4 05/11] omap3isp: Use *_dec_not_zero instead of *_add_unless
  2011-08-01 11:10       ` Laurent Pinchart
@ 2011-08-01 11:10         ` Laurent Pinchart
  0 siblings, 0 replies; 37+ messages in thread
From: Laurent Pinchart @ 2011-08-01 11:10 UTC (permalink / raw)
  To: Sven Eckelmann; +Cc: linux-arch, linux-kernel, linux-media

Hi Sven,

On Monday 01 August 2011 12:07:15 Sven Eckelmann wrote:
> On Sunday 31 July 2011 17:00:43 Laurent Pinchart wrote:
> > On Wednesday 27 July 2011 11:47:44 Sven Eckelmann wrote:
> > > atomic_dec_not_zero is defined for each architecture through
> > > <linux/atomic.h> to provide the functionality of
> > > atomic_add_unless(x, -1, 0).
> > > 
> > > Signed-off-by: Sven Eckelmann <sven@narfation.org>
> > > Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > 
> > Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> > 
> > I'll queue this to my tree for v3.2. Please let me know if you would
> > rather push the patch through another tree.
> 
> The problem is that until now no one from linux-arch has applied the patch
> 01/11 in his tree (which is needed before this patch can be applied) and
> you tree have to be based on the "yet to be chosen linux-arch tree".
> Otherwise your tree will just break and not be acceptable for a pull
> request.
> 
> Maybe it is easier when one person applies 01-11 after 02-11 was Acked-by
> the responsible maintainers.
> 
> 02 is more or less automatically Acked-by us :)
> 04, 09 and 10 are also Acked.
> ... and the rest is waiting for actions.

OK. I'm fine with 05/11 being pushed through any tree with my ack. Please let 
me know if/when you want me to apply it to my tree.

-- 
Regards,

Laurent Pinchart

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

* Re: [PATCHv4 01/11] atomic: add *_dec_not_zero
  2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
                   ` (9 preceding siblings ...)
  2011-07-27  9:47 ` [PATCHv4 11/11] Phonet: " Sven Eckelmann
@ 2011-08-02  9:58 ` Ralf Baechle
  10 siblings, 0 replies; 37+ messages in thread
From: Ralf Baechle @ 2011-08-02  9:58 UTC (permalink / raw)
  To: Sven Eckelmann
  Cc: linux-m32r-ja, linux-mips, linux-ia64, linux-doc,
	Benjamin Herrenschmidt, H. Peter Anvin, Heiko Carstens,
	Randy Dunlap, Paul Mackerras, Helge Deller, sparclinux,
	linux-arch, linux-s390, Russell King, user-mode-linux-devel,
	Richard Weinberger, Hirokazu Takata, x86, James E.J. Bottomley,
	Ingo Molnar, Matt Turner, Fenghua Yu, Arnd Bergmann, Jeff Dike,
	Chris Metcalf, linux-m32r

On Wed, Jul 27, 2011 at 11:47:40AM +0200, Sven Eckelmann wrote:

For MIPS:

Acked-by: Ralf Baechle <ralf@linux-mips.org>

  Ralf

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

end of thread, other threads:[~2011-08-02  9:58 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-07-27  9:47 [PATCHv4 01/11] atomic: add *_dec_not_zero Sven Eckelmann
     [not found] ` <1311760070-21532-1-git-send-email-sven-KaDOiPu9UxWEi8DpZVb4nw@public.gmane.org>
2011-07-27  9:47   ` [PATCHv4 02/11] batman-adv: Remove private define of atomic_dec_not_zero Sven Eckelmann
2011-07-27  9:47     ` Sven Eckelmann
2011-07-27  9:47 ` [PATCHv4 03/11] fault_inject: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27  9:47 ` [PATCHv4 04/11] PM: Use *_dec_not_zero instead of *_add_unless Sven Eckelmann
2011-07-27 19:50   ` Rafael J. Wysocki
2011-07-27 20:36     ` Pavel Machek
2011-07-27 20:36       ` Pavel Machek
2011-07-28 21:43       ` Rafael J. Wysocki
2011-07-28 21:43         ` Rafael J. Wysocki
2011-07-27  9:47 ` [PATCHv4 05/11] omap3isp: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-31 15:00   ` Laurent Pinchart
2011-08-01 10:07     ` Sven Eckelmann
2011-08-01 11:10       ` Laurent Pinchart
2011-08-01 11:10         ` Laurent Pinchart
2011-07-27  9:47 ` [PATCHv4 06/11] qeth: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27  9:47 ` [PATCHv4 07/11] ext4: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27  9:47 ` [PATCHv4 08/11] xfs: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27  9:47 ` [PATCHv4 09/11] memcg: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27 11:58   ` Michal Hocko
2011-07-27  9:47 ` [PATCHv4 10/11] drop_monitor: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27 10:59   ` Neil Horman
2011-07-27 10:59     ` Neil Horman
2011-07-27 11:52     ` Sven Eckelmann
2011-07-27 14:25       ` Neil Horman
2011-07-27 14:25         ` Neil Horman
2011-07-27  9:47 ` [PATCHv4 11/11] Phonet: " Sven Eckelmann
2011-07-27  9:47   ` Sven Eckelmann
2011-07-27 10:29   ` Rémi Denis-Courmont
2011-08-02  9:58 ` [PATCHv4 01/11] atomic: add *_dec_not_zero Ralf Baechle

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox