Messages in this thread Patch in this message | | | From | Frederic Weisbecker <> | Subject | [PATCH 2/9] timer: Add comments about calc_index() ceiling work | Date | Tue, 7 Jul 2020 03:32:46 +0200 |
| |
calc_index() adds 1 unit of the level granularity to the expiry passed in parameter to ensure that the timer doesn't expire too early. Add a comment to explain that and the resulting layout in the wheel.
Signed-off-by: Frederic Weisbecker <frederic@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Anna-Maria Gleixner <anna-maria@linutronix.de> Cc: Juri Lelli <juri.lelli@redhat.com> --- kernel/time/timer.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/kernel/time/timer.c b/kernel/time/timer.c index 4c977df3610b..ae1259f67486 100644 --- a/kernel/time/timer.c +++ b/kernel/time/timer.c @@ -156,7 +156,8 @@ EXPORT_SYMBOL(jiffies_64); /* * The time start value for each level to select the bucket at enqueue - * time. + * time. We start from the last possible delta of the previous level + * so that we can later add an extra LVL_GRAN(n) to n (see calc_index()). */ #define LVL_START(n) ((LVL_SIZE - 1) << (((n) - 1) * LVL_CLK_SHIFT)) @@ -489,6 +490,13 @@ static inline void timer_set_idx(struct timer_list *timer, unsigned int idx) */ static inline unsigned calc_index(unsigned expires, unsigned lvl) { + /* + * Time may have past since the clock last reached an index of + * this @lvl. And that time, below LVL_GRAN(@lvl), is going to + * be substracted from the delta until we reach @expires. To + * fix that we must add one level granularity unit to make sure + * we rather expire late than early. Prefer ceil over floor. + */ expires = (expires + LVL_GRAN(lvl)) >> LVL_SHIFT(lvl); return LVL_OFFS(lvl) + (expires & LVL_MASK); } -- 2.26.2
| |