Thread (11 messages) 11 messages, 5 authors, 2016-06-29

Re: [PATCH v2] cpuidle: Fix last_residency division

flat view

From: Arnd Bergmann <arnd@arndb.de>
Date: 2016-06-24 10:08:57
Also in: linux-pm

On Friday, June 24, 2016 9:00:48 AM CEST David Laight wrote:
The intent of the >> 10 was probably to avoid an expensive 64bit divide.
So maybe something like:
        diff = time_end - time_start;
        if (diff >= INT_MAX/2)
                diff_32 = INT_MAX/2/1000;
        else
                diff_32 = diff;
                diff_32 += diff_32 >> 6;
                diff_32 >>= 10;
        }

Adding an extra 1/32 makes the division by be something slightly below 1000.
Why not change the definition of the time to nanoseconds and update
the users accordingly?

I see that cpuidle_enter_state() writes to the last_residency value,
and it is read in three places: ladder_select_state(), menu_update()
and show_state_time() (for sysfs).

If those functions are called less often than cpuidle_enter_state(),
we could just move the division there. Since the divisor is constant,
do_div() can convert it into a multiply and shift, or we could use
your the code you suggest above, or use a 32-bit division most of
the time:

	if (diff <= UINT_MAX)
		diff_32 = (u32)diff / NSECS_PER_USEC;
	else
		diff_32 = div_u64(diff, NSECS_PER_USEC;

which gcc itself will turn into a multiplication or series of
shifts on CPUs on which that is faster.

	Arnd
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help