X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=kernel%2Ftimer.c;h=9e49deed468cd8b2e63f2033d2971d961edeb110;hb=6f065f70c0c1bfb0b8212438cee21e68aa155887;hp=67eaf0f54096f87162a96daad0b50df11fe5653f;hpb=58f8236bed448273cd7f9ae02c09467853303484;p=powerpc.git diff --git a/kernel/timer.c b/kernel/timer.c index 67eaf0f540..9e49deed46 100644 --- a/kernel/timer.c +++ b/kernel/timer.c @@ -541,6 +541,22 @@ found: } spin_unlock(&base->lock); + /* + * It can happen that other CPUs service timer IRQs and increment + * jiffies, but we have not yet got a local timer tick to process + * the timer wheels. In that case, the expiry time can be before + * jiffies, but since the high-resolution timer here is relative to + * jiffies, the default expression when high-resolution timers are + * not active, + * + * time_before(MAX_JIFFY_OFFSET + jiffies, expires) + * + * would falsely evaluate to true. If that is the case, just + * return jiffies so that we can immediately fire the local timer + */ + if (time_before(expires, jiffies)) + return jiffies; + if (time_before(hr_expires, expires)) return hr_expires;