diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-10-06 16:01:27 +0100 |
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-10-06 16:01:27 +0100 |
| commit | 907bc6c7fc7071b00083fc11e510e47dd93df45d (patch) | |
| tree | 0697a608561522c00da9e1814974a2eb051bb96d /kernel/time.c | |
| parent | d2b247a8be57647d1745535acd58169fbcbe431a (diff) | |
| parent | 2a0f5cb32772e9a9560209e241a80bfbbc31dbc3 (diff) | |
Merge branch 'for-2.6.32' into for-2.6.33
Diffstat (limited to 'kernel/time.c')
| -rw-r--r-- | kernel/time.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/kernel/time.c b/kernel/time.c index 29511943871..2e2e469a7fe 100644 --- a/kernel/time.c +++ b/kernel/time.c @@ -370,13 +370,20 @@ EXPORT_SYMBOL(mktime); * 0 <= tv_nsec < NSEC_PER_SEC * For negative values only the tv_sec field is negative ! */ -void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec) +void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec) { while (nsec >= NSEC_PER_SEC) { + /* + * The following asm() prevents the compiler from + * optimising this loop into a modulo operation. See + * also __iter_div_u64_rem() in include/linux/time.h + */ + asm("" : "+rm"(nsec)); nsec -= NSEC_PER_SEC; ++sec; } while (nsec < 0) { + asm("" : "+rm"(nsec)); nsec += NSEC_PER_SEC; --sec; } |
