diff options
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 29511943871a..2e2e469a7fec 100644 --- a/kernel/time.c +++ b/kernel/time.c | |||
| @@ -370,13 +370,20 @@ EXPORT_SYMBOL(mktime); | |||
| 370 | * 0 <= tv_nsec < NSEC_PER_SEC | 370 | * 0 <= tv_nsec < NSEC_PER_SEC |
| 371 | * For negative values only the tv_sec field is negative ! | 371 | * For negative values only the tv_sec field is negative ! |
| 372 | */ | 372 | */ |
| 373 | void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec) | 373 | void set_normalized_timespec(struct timespec *ts, time_t sec, s64 nsec) |
| 374 | { | 374 | { |
| 375 | while (nsec >= NSEC_PER_SEC) { | 375 | while (nsec >= NSEC_PER_SEC) { |
| 376 | /* | ||
| 377 | * The following asm() prevents the compiler from | ||
| 378 | * optimising this loop into a modulo operation. See | ||
| 379 | * also __iter_div_u64_rem() in include/linux/time.h | ||
| 380 | */ | ||
| 381 | asm("" : "+rm"(nsec)); | ||
| 376 | nsec -= NSEC_PER_SEC; | 382 | nsec -= NSEC_PER_SEC; |
| 377 | ++sec; | 383 | ++sec; |
| 378 | } | 384 | } |
| 379 | while (nsec < 0) { | 385 | while (nsec < 0) { |
| 386 | asm("" : "+rm"(nsec)); | ||
| 380 | nsec += NSEC_PER_SEC; | 387 | nsec += NSEC_PER_SEC; |
| 381 | --sec; | 388 | --sec; |
| 382 | } | 389 | } |
