* 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: posix_timer: Fix error path in timer_create hrtimer: Avoid double seqlock timers: Move local variable into else section timers: Fix slack calculation really
Showing the changes to kernel (3 of 3 files). Show all
Unified · Split
| @@ -89,7 +89,7 @@ static void hrtimer_get_softirq_time(struct hrtimer_cpu_base *base) · 88 unmodified lines | ||
| 89 | 89 | |
| 90 | 90 | do { |
| 91 | 91 | seq = read_seqbegin(&xtime_lock); |
| 92 | − xts = current_kernel_time(); | |
| 92 | + xts = __current_kernel_time(); | |
| 93 | 93 | tom = wall_to_monotonic; |
| 94 | 94 | } while (read_seqretry(&xtime_lock, seq)); |
| 95 | 95 | |
| @@ -559,14 +559,7 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, · 558 unmodified lines | ||
| 559 | 559 | new_timer->it_id = (timer_t) new_timer_id; |
| 560 | 560 | new_timer->it_clock = which_clock; |
| 561 | 561 | new_timer->it_overrun = -1; |
| 562 | − error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); | |
| 563 | − if (error) | |
| 564 | − goto out; | |
| 565 | 562 | |
| 566 | − /* | |
| 567 | − * return the timer_id now. The next step is hard to | |
| 568 | − * back out if there is an error. | |
| 569 | − */ | |
| 570 | 563 | if (copy_to_user(created_timer_id, |
| 571 | 564 | &new_timer_id, sizeof (new_timer_id))) { |
| 572 | 565 | error = -EFAULT; |
| @@ -597,6 +590,10 @@ SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock, · 24 unmodified lines | ||
| 597 | 590 | new_timer->sigq->info.si_tid = new_timer->it_id; |
| 598 | 591 | new_timer->sigq->info.si_code = SI_TIMER; |
| 599 | 592 | |
| 593 | + error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); | |
| 594 | + if (error) | |
| 595 | + goto out; | |
| 596 | + | |
| 600 | 597 | spin_lock_irq(¤t->sighand->siglock); |
| 601 | 598 | new_timer->it_signal = current->signal; |
| 602 | 599 | list_add(&new_timer->list, ¤t->signal->posix_timers); |
| @@ -752,11 +752,15 @@ unsigned long apply_slack(struct timer_list *timer, unsigned long expires) · 751 unmodified lines | ||
| 752 | 752 | |
| 753 | 753 | expires_limit = expires; |
| 754 | 754 | |
| 755 | − if (timer->slack > -1) | |
| 755 | + if (timer->slack >= 0) { | |
| 756 | 756 | expires_limit = expires + timer->slack; |
| 757 | − else if (time_after(expires, jiffies)) /* auto slack: use 0.4% */ | |
| 758 | − expires_limit = expires + (expires - jiffies)/256; | |
| 757 | + } else { | |
| 758 | + unsigned long now = jiffies; | |
| 759 | 759 | |
| 760 | + /* No slack, if already expired else auto slack 0.4% */ | |
| 761 | + if (time_after(expires, now)) | |
| 762 | + expires_limit = expires + (expires - now)/256; | |
| 763 | + } | |
| 760 | 764 | mask = expires ^ expires_limit; |
| 761 | 765 | if (mask == 0) |
| 762 | 766 | return expires; |