diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2016-03-24 10:37:59 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-03-29 05:52:11 -0400 |
commit | 5acba71e18833b9d06686b3751598bfa263a3ac3 (patch) | |
tree | 31ad607ebf024af39acb6ff1a68947fb6c727f03 | |
parent | 1993b176a8224e371e0732ffada7ab9eb3b0912b (diff) |
locking/atomic: Introduce atomic_fetch_or()
This is deemed to replace the type generic fetch_or() which brings a lot
of issues such as macro induced block variable aliasing and sloppy types.
Not to mention fetch_or() doesn't refer to any namespace, adding even
more confusion.
So lets provide an atomic_t version. Current and next users of fetch_or()
are thus encouraged to use atomic_t.
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1458830281-4255-2-git-send-email-fweisbec@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | include/linux/atomic.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/include/linux/atomic.h b/include/linux/atomic.h index df4f369254c0..3d64c0852164 100644 --- a/include/linux/atomic.h +++ b/include/linux/atomic.h | |||
@@ -559,6 +559,27 @@ static inline int atomic_dec_if_positive(atomic_t *v) | |||
559 | #endif | 559 | #endif |
560 | 560 | ||
561 | /** | 561 | /** |
562 | * atomic_fetch_or - perform *p |= mask and return old value of *p | ||
563 | * @p: pointer to atomic_t | ||
564 | * @mask: mask to OR on the atomic_t | ||
565 | */ | ||
566 | #ifndef atomic_fetch_or | ||
567 | static inline int atomic_fetch_or(atomic_t *p, int mask) | ||
568 | { | ||
569 | int old, val = atomic_read(p); | ||
570 | |||
571 | for (;;) { | ||
572 | old = atomic_cmpxchg(p, val, val | mask); | ||
573 | if (old == val) | ||
574 | break; | ||
575 | val = old; | ||
576 | } | ||
577 | |||
578 | return old; | ||
579 | } | ||
580 | #endif | ||
581 | |||
582 | /** | ||
562 | * fetch_or - perform *ptr |= mask and return old value of *ptr | 583 | * fetch_or - perform *ptr |= mask and return old value of *ptr |
563 | * @ptr: pointer to value | 584 | * @ptr: pointer to value |
564 | * @mask: mask to OR on the value | 585 | * @mask: mask to OR on the value |