Re: [patch 10/39] hrtimer: Use cpu_base->active_base for hotpath iterators

From: Preeti U Murthy
Date: Mon Apr 20 2015 - 07:17:15 EST


On 04/15/2015 02:38 AM, Thomas Gleixner wrote:
>>Now that we have the active_bases field in sync we can use it for

This sentence appears a bit ambiguous. I am guessing you are referring
to what the first patch in this series did, in which case wouldn't it be
better if it is stated a bit more elaborately like 'Now that it is
guaranteed that active_bases field will be in sync with the timerqueue
on the corresponding clock base' ? It took me a while to figure out what
the statement was referring to.

>>iterating over the clock bases. This allows to break out early if no
>>more active clock bases are available and avoids touching the cache
>>lines of inactive clock bases.
>>
>>Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx>
>>---

Regards
Preeti U Murthy

>> kernel/time/hrtimer.c | 17 ++++++++---------
>> 1 file changed, 8 insertions(+), 9 deletions(-)
>>
>>Index: tip/kernel/time/hrtimer.c
>>===================================================================
>>--- tip.orig/kernel/time/hrtimer.c
>>+++ tip/kernel/time/hrtimer.c
>>@@ -419,16 +419,16 @@ static ktime_t __hrtimer_get_next_event(
>> {
>> struct hrtimer_clock_base *base = cpu_base->clock_base;
>> ktime_t expires, expires_next = { .tv64 = KTIME_MAX };
>>- int i;
>>+ unsigned int active = cpu_base->active_bases;
>>
>>- for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++, base++) {
>>+ for (; active; base++, active >>= 1) {
>> struct timerqueue_node *next;
>> struct hrtimer *timer;
>>
>>- next = timerqueue_getnext(&base->active);
>>- if (!next)
>>+ if (!(active & 0x01))
>> continue;
>>
>>+ next = timerqueue_getnext(&base->active);
>> timer = container_of(next, struct hrtimer, node);
>> expires = ktime_sub(hrtimer_get_expires(timer),
>>base->offset);
>> if (expires.tv64 < expires_next.tv64)
>>@@ -1206,17 +1206,16 @@ static void __run_hrtimer(struct hrtimer
>>
>> static void __hrtimer_run_queues(struct hrtimer_cpu_base *cpu_base,
ktime_t
>>now)
>> {
>>- int i;
>>+ struct hrtimer_clock_base *base = cpu_base->clock_base;
>>+ unsigned int active = cpu_base->active_bases;
>>
>>- for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++) {
>>- struct hrtimer_clock_base *base;
>>+ for (; active; base++, active >>= 1) {
>> struct timerqueue_node *node;
>> ktime_t basenow;
>>
>>- if (!(cpu_base->active_bases & (1 << i)))
>>+ if (!(active & 0x01))
>> continue;
>>
>>- base = cpu_base->clock_base + i;
>> basenow = ktime_add(now, base->offset);
>>
>> while ((node = timerqueue_getnext(&base->active))) {
>>

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/