Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'timers-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* '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

+12 -11
+1 -1
kernel/hrtimer.c
··· 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
+4 -7
kernel/posix-timers.c
··· 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; ··· 589 596 new_timer->sigq->info.si_value = event.sigev_value; 590 597 new_timer->sigq->info.si_tid = new_timer->it_id; 591 598 new_timer->sigq->info.si_code = SI_TIMER; 599 + 600 + error = CLOCK_DISPATCH(which_clock, timer_create, (new_timer)); 601 + if (error) 602 + goto out; 592 603 593 604 spin_lock_irq(&current->sighand->siglock); 594 605 new_timer->it_signal = current->signal;
+7 -3
kernel/timer.c
··· 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;