diff options
author | Frederic Weisbecker <fweisbec@gmail.com> | 2016-03-24 10:38:01 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-03-29 05:52:11 -0400 |
commit | 5529578a27288d11d4d15635c258c6dde0f0fb10 (patch) | |
tree | 5cbd7b8d522cd07c0afc0f57b34d77fa7e12516a | |
parent | f009a7a767e792d5ab0b46c08d46236ea5271dd9 (diff) |
locking/atomic, sched: Unexport fetch_or()
This patch functionally reverts:
5fd7a09cfb8c ("atomic: Export fetch_or()")
During the merge Linus observed that the generic version of fetch_or()
was messy:
" This makes the ugly "fetch_or()" macro that the scheduler used
internally a new generic helper, and does a bad job at it. "
e23604edac2a Merge branch 'timers-nohz-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Now that we have introduced atomic_fetch_or(), fetch_or() is only used
by the scheduler in order to deal with thread_info flags which type
can vary across architectures.
Lets confine fetch_or() back to the scheduler so that we encourage
future users to use the more robust and well typed atomic_t version
instead.
While at it, fetch_or() gets robustified, pasting improvements from a
previous patch by Ingo Molnar that avoids needless expression
re-evaluations in the loop.
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/1458830281-4255-4-git-send-email-fweisbec@gmail.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | include/linux/atomic.h | 21 | ||||
-rw-r--r-- | kernel/sched/core.c | 18 |
2 files changed, 18 insertions, 21 deletions
diff --git a/include/linux/atomic.h b/include/linux/atomic.h index 3d64c0852164..506c3531832e 100644 --- a/include/linux/atomic.h +++ b/include/linux/atomic.h | |||
@@ -579,27 +579,6 @@ static inline int atomic_fetch_or(atomic_t *p, int mask) | |||
579 | } | 579 | } |
580 | #endif | 580 | #endif |
581 | 581 | ||
582 | /** | ||
583 | * fetch_or - perform *ptr |= mask and return old value of *ptr | ||
584 | * @ptr: pointer to value | ||
585 | * @mask: mask to OR on the value | ||
586 | * | ||
587 | * cmpxchg based fetch_or, macro so it works for different integer types | ||
588 | */ | ||
589 | #ifndef fetch_or | ||
590 | #define fetch_or(ptr, mask) \ | ||
591 | ({ typeof(*(ptr)) __old, __val = *(ptr); \ | ||
592 | for (;;) { \ | ||
593 | __old = cmpxchg((ptr), __val, __val | (mask)); \ | ||
594 | if (__old == __val) \ | ||
595 | break; \ | ||
596 | __val = __old; \ | ||
597 | } \ | ||
598 | __old; \ | ||
599 | }) | ||
600 | #endif | ||
601 | |||
602 | |||
603 | #ifdef CONFIG_GENERIC_ATOMIC64 | 582 | #ifdef CONFIG_GENERIC_ATOMIC64 |
604 | #include <asm-generic/atomic64.h> | 583 | #include <asm-generic/atomic64.h> |
605 | #endif | 584 | #endif |
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index d8465eeab8b3..8b489fcac37b 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
@@ -321,6 +321,24 @@ static inline void init_hrtick(void) | |||
321 | } | 321 | } |
322 | #endif /* CONFIG_SCHED_HRTICK */ | 322 | #endif /* CONFIG_SCHED_HRTICK */ |
323 | 323 | ||
324 | /* | ||
325 | * cmpxchg based fetch_or, macro so it works for different integer types | ||
326 | */ | ||
327 | #define fetch_or(ptr, mask) \ | ||
328 | ({ \ | ||
329 | typeof(ptr) _ptr = (ptr); \ | ||
330 | typeof(mask) _mask = (mask); \ | ||
331 | typeof(*_ptr) _old, _val = *_ptr; \ | ||
332 | \ | ||
333 | for (;;) { \ | ||
334 | _old = cmpxchg(_ptr, _val, _val | _mask); \ | ||
335 | if (_old == _val) \ | ||
336 | break; \ | ||
337 | _val = _old; \ | ||
338 | } \ | ||
339 | _old; \ | ||
340 | }) | ||
341 | |||
324 | #if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) | 342 | #if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) |
325 | /* | 343 | /* |
326 | * Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG, | 344 | * Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG, |