| From ae6683d815895c2be1e60e1942630fa99488055b Mon Sep 17 00:00:00 2001 |
| From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Date: Fri, 26 Jul 2019 20:30:51 +0200 |
| Subject: [PATCH] hrtimer: Introduce HARD expiry mode |
| |
| commit ae6683d815895c2be1e60e1942630fa99488055b upstream. |
| |
| On PREEMPT_RT not all hrtimers can be expired in hard interrupt context |
| even if that is perfectly fine on a PREEMPT_RT=n kernel, e.g. because they |
| take regular spinlocks. Also for latency reasons PREEMPT_RT tries to defer |
| most hrtimers' expiry into soft interrupt context. |
| |
| But there are hrtimers which must be expired in hard interrupt context even |
| when PREEMPT_RT is enabled: |
| |
| - hrtimers which must expiry in hard interrupt context, e.g. scheduler, |
| perf, watchdog related hrtimers |
| |
| - latency critical hrtimers, e.g. nanosleep, ..., kvm lapic timer |
| |
| Add a new mode flag HRTIMER_MODE_HARD which allows to mark these timers so |
| PREEMPT_RT will not move them into softirq expiry mode. |
| |
| [ tglx: Split out of a larger combo patch. Added changelog ] |
| |
| Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Link: https://lkml.kernel.org/r/20190726185752.981398465@linutronix.de |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/include/linux/hrtimer.h b/include/linux/hrtimer.h |
| index 24072a0942c0..15c2ba6b6316 100644 |
| --- a/include/linux/hrtimer.h |
| +++ b/include/linux/hrtimer.h |
| @@ -38,6 +38,7 @@ enum hrtimer_mode { |
| HRTIMER_MODE_REL = 0x01, |
| HRTIMER_MODE_PINNED = 0x02, |
| HRTIMER_MODE_SOFT = 0x04, |
| + HRTIMER_MODE_HARD = 0x08, |
| |
| HRTIMER_MODE_ABS_PINNED = HRTIMER_MODE_ABS | HRTIMER_MODE_PINNED, |
| HRTIMER_MODE_REL_PINNED = HRTIMER_MODE_REL | HRTIMER_MODE_PINNED, |
| @@ -48,6 +49,11 @@ enum hrtimer_mode { |
| HRTIMER_MODE_ABS_PINNED_SOFT = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_SOFT, |
| HRTIMER_MODE_REL_PINNED_SOFT = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_SOFT, |
| |
| + HRTIMER_MODE_ABS_HARD = HRTIMER_MODE_ABS | HRTIMER_MODE_HARD, |
| + HRTIMER_MODE_REL_HARD = HRTIMER_MODE_REL | HRTIMER_MODE_HARD, |
| + |
| + HRTIMER_MODE_ABS_PINNED_HARD = HRTIMER_MODE_ABS_PINNED | HRTIMER_MODE_HARD, |
| + HRTIMER_MODE_REL_PINNED_HARD = HRTIMER_MODE_REL_PINNED | HRTIMER_MODE_HARD, |
| }; |
| |
| /* |
| -- |
| 2.7.4 |
| |