diff options
Diffstat (limited to 'kernel/timer.c')
| -rw-r--r-- | kernel/timer.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 67eaf0f54096..9e49deed468c 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
| @@ -541,6 +541,22 @@ found: | |||
| 541 | } | 541 | } |
| 542 | spin_unlock(&base->lock); | 542 | spin_unlock(&base->lock); |
| 543 | 543 | ||
| 544 | /* | ||
| 545 | * It can happen that other CPUs service timer IRQs and increment | ||
| 546 | * jiffies, but we have not yet got a local timer tick to process | ||
| 547 | * the timer wheels. In that case, the expiry time can be before | ||
| 548 | * jiffies, but since the high-resolution timer here is relative to | ||
| 549 | * jiffies, the default expression when high-resolution timers are | ||
| 550 | * not active, | ||
| 551 | * | ||
| 552 | * time_before(MAX_JIFFY_OFFSET + jiffies, expires) | ||
| 553 | * | ||
| 554 | * would falsely evaluate to true. If that is the case, just | ||
| 555 | * return jiffies so that we can immediately fire the local timer | ||
| 556 | */ | ||
| 557 | if (time_before(expires, jiffies)) | ||
| 558 | return jiffies; | ||
| 559 | |||
| 544 | if (time_before(hr_expires, expires)) | 560 | if (time_before(hr_expires, expires)) |
| 545 | return hr_expires; | 561 | return hr_expires; |
| 546 | 562 | ||
