All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] kref: prefer atomic_inc_not_zero to atomic_add_unless
@ 2015-10-10 10:56 Jason A. Donenfeld
  2015-10-11 19:59 ` Thomas Hellstrom
  2016-08-10 12:24 ` Fwd: " Thomas Hellstrom
  0 siblings, 2 replies; 14+ messages in thread
From: Jason A. Donenfeld @ 2015-10-10 10:56 UTC (permalink / raw)
  To: Dave Airlie, Thomas Hellstrom, linux-kernel; +Cc: Jason A. Donenfeld

On most platforms, there exists this ifdef:

 #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)

This makes this patch functionally useless. However, on PPC, there is
actually an explicit definition of atomic_inc_not_zero with its own
assembly that is slightly more optimized than atomic_add_unless. So,
this patch changes kref to use atomic_inc_not_zero instead, for PPC and
any future platforms that might provide an explicit implementation.

This also puts this usage of kref more in line with a verbatim reading
of the examples in Paul McKenney's paper [1] in the section titled "2.4
Atomic Counting With Check and Release Memory Barrier", which uses
atomic_inc_not_zero.

[1] http://open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2167.pdf

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
---
 include/linux/kref.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/include/linux/kref.h b/include/linux/kref.h
index 484604d..83d1f94 100644
--- a/include/linux/kref.h
+++ b/include/linux/kref.h
@@ -166,6 +166,6 @@ static inline int kref_put_mutex(struct kref *kref,
  */
 static inline int __must_check kref_get_unless_zero(struct kref *kref)
 {
-	return atomic_add_unless(&kref->refcount, 1, 0);
+	return atomic_inc_not_zero(&kref->refcount);
 }
 #endif /* _KREF_H_ */
-- 
2.6.0


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

end of thread, other threads:[~2016-12-16  7:33 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-10-10 10:56 [PATCH] kref: prefer atomic_inc_not_zero to atomic_add_unless Jason A. Donenfeld
2015-10-11 19:59 ` Thomas Hellstrom
2016-02-01 21:53   ` Jason A. Donenfeld
2016-06-29 22:52     ` Jason A. Donenfeld
2016-07-01  7:08       ` Patch for drm-next WAS " Thomas Hellstrom
2016-07-01  7:08         ` Thomas Hellstrom
2016-07-12 12:28         ` Daniel Vetter
2016-07-12 12:28           ` Daniel Vetter
2016-12-15  4:59           ` Jason A. Donenfeld
2016-12-15  5:01           ` Jason A. Donenfeld
2016-12-16  7:33             ` Daniel Vetter
2016-12-15  4:58   ` Jason A. Donenfeld
2016-12-15  8:51     ` Christoph Hellwig
2016-08-10 12:24 ` Fwd: " Thomas Hellstrom

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.