Optimize timespec_trunc()
The first thing done by timespec_trunc() is : if (gran <= jiffies_to_usecs(1) * 1000) This should really be a test against a constant known at compile time. Alas, it isnt. jiffies_to_usec() was unilined so C compiler emits a function call and a multiply to compute : a CONSTANT. mov $0x1,%edi mov %rbx,0xffffffffffffffe8(%rbp) mov %r12,0xfffffffffffffff0(%rbp) mov %edx,%ebx mov %rsi,0xffffffffffffffc8(%rbp) mov %rsi,%r12 callq ffffffff80232010 <jiffies_to_usecs> imul $0x3e8,%eax,%eax cmp %ebx,%eax This patch reorders kernel/time.c a bit so that jiffies_to_usecs() is defined before timespec_trunc() so that compiler now generates : cmp $0x3d0900,%edx (HZ=250 on my machine) This gives a better code (timespec_trunc() becoming a leaf function), and shorter kernel size as well. Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@elte.hu> Cc: john stultz <johnstul@us.ibm.com> Cc: Roman Zippel <zippel@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2e17c5508f
commit
753e9c5cd9
|
@ -247,6 +247,36 @@ struct timespec current_fs_time(struct super_block *sb)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(current_fs_time);
|
EXPORT_SYMBOL(current_fs_time);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Convert jiffies to milliseconds and back.
|
||||||
|
*
|
||||||
|
* Avoid unnecessary multiplications/divisions in the
|
||||||
|
* two most common HZ cases:
|
||||||
|
*/
|
||||||
|
unsigned int inline jiffies_to_msecs(const unsigned long j)
|
||||||
|
{
|
||||||
|
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
|
||||||
|
return (MSEC_PER_SEC / HZ) * j;
|
||||||
|
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
|
||||||
|
return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
|
||||||
|
#else
|
||||||
|
return (j * MSEC_PER_SEC) / HZ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(jiffies_to_msecs);
|
||||||
|
|
||||||
|
unsigned int inline jiffies_to_usecs(const unsigned long j)
|
||||||
|
{
|
||||||
|
#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
|
||||||
|
return (USEC_PER_SEC / HZ) * j;
|
||||||
|
#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
|
||||||
|
return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
|
||||||
|
#else
|
||||||
|
return (j * USEC_PER_SEC) / HZ;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(jiffies_to_usecs);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* timespec_trunc - Truncate timespec to a granularity
|
* timespec_trunc - Truncate timespec to a granularity
|
||||||
* @t: Timespec
|
* @t: Timespec
|
||||||
|
@ -472,36 +502,6 @@ struct timeval ns_to_timeval(const s64 nsec)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ns_to_timeval);
|
EXPORT_SYMBOL(ns_to_timeval);
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert jiffies to milliseconds and back.
|
|
||||||
*
|
|
||||||
* Avoid unnecessary multiplications/divisions in the
|
|
||||||
* two most common HZ cases:
|
|
||||||
*/
|
|
||||||
unsigned int jiffies_to_msecs(const unsigned long j)
|
|
||||||
{
|
|
||||||
#if HZ <= MSEC_PER_SEC && !(MSEC_PER_SEC % HZ)
|
|
||||||
return (MSEC_PER_SEC / HZ) * j;
|
|
||||||
#elif HZ > MSEC_PER_SEC && !(HZ % MSEC_PER_SEC)
|
|
||||||
return (j + (HZ / MSEC_PER_SEC) - 1)/(HZ / MSEC_PER_SEC);
|
|
||||||
#else
|
|
||||||
return (j * MSEC_PER_SEC) / HZ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(jiffies_to_msecs);
|
|
||||||
|
|
||||||
unsigned int jiffies_to_usecs(const unsigned long j)
|
|
||||||
{
|
|
||||||
#if HZ <= USEC_PER_SEC && !(USEC_PER_SEC % HZ)
|
|
||||||
return (USEC_PER_SEC / HZ) * j;
|
|
||||||
#elif HZ > USEC_PER_SEC && !(HZ % USEC_PER_SEC)
|
|
||||||
return (j + (HZ / USEC_PER_SEC) - 1)/(HZ / USEC_PER_SEC);
|
|
||||||
#else
|
|
||||||
return (j * USEC_PER_SEC) / HZ;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(jiffies_to_usecs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When we convert to jiffies then we interpret incoming values
|
* When we convert to jiffies then we interpret incoming values
|
||||||
* the following way:
|
* the following way:
|
||||||
|
|
Loading…
Reference in New Issue