diff options
Diffstat (limited to 'kernel/sched/core.c')
-rw-r--r-- | kernel/sched/core.c | 18 |
1 files changed, 18 insertions, 0 deletions
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, |