On Sun, May 26, 2013 at 05:35:44PM -0400, [email protected] wrote: > From: KOSAKI Motohiro <[email protected]> > > Currently glibc's rt/tst-cputimer1 testcase sporadically fails because > a timer created by timer_create() may fire earlier than specified. > > posix_cpu_timer_set() uses "val" as current time for three purpose. 1) > initialize sig->cputimer. 2) calculation "old" val. 3) calculations an > expires. > > (1) and (2) should only use committed time (i.e. without delta_exec) > because run_posix_cpu_timers() don't care of delta_exec and we need > consistency, but (3) need exact current time (aka cpu clock time) because > an expires should be "now + timeout" by definition. > > This patch distinguishes between two kinds of "now". > > Cc: Olivier Langlois <[email protected]> > Cc: Thomas Gleixner <[email protected]> > Cc: Frederic Weisbecker <[email protected]> > Cc: Ingo Molnar <[email protected]> > Acked-by: Peter Zijlstra <[email protected]> > Signed-off-by: KOSAKI Motohiro <[email protected]> > --- > include/linux/kernel_stat.h | 5 ----- > kernel/posix-cpu-timers.c | 14 ++++++++++++-- > kernel/sched/core.c | 13 ------------- > 3 files changed, 12 insertions(+), 20 deletions(-) > > diff --git a/include/linux/kernel_stat.h b/include/linux/kernel_stat.h > index ed5f6ed..f5d4fdf 100644 > --- a/include/linux/kernel_stat.h > +++ b/include/linux/kernel_stat.h > @@ -117,11 +117,6 @@ static inline unsigned int kstat_cpu_irqs_sum(unsigned > int cpu) > return kstat_cpu(cpu).irqs_sum; > } > > -/* > - * Lock/unlock the current runqueue - to extract task statistics: > - */ > -extern unsigned long long task_delta_exec(struct task_struct *); > - > extern void account_user_time(struct task_struct *, cputime_t, cputime_t); > extern void account_system_time(struct task_struct *, int, cputime_t, > cputime_t); > extern void account_steal_time(cputime_t); > diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c > index 25447c5..d068808 100644 > --- a/kernel/posix-cpu-timers.c > +++ b/kernel/posix-cpu-timers.c > @@ -652,7 +652,7 @@ static int cpu_timer_sample_group(const clockid_t > which_clock, > cpu->cpu = cputime.utime; > break; > case CPUCLOCK_SCHED: > - cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p); > + cpu->sched = cputime.sum_exec_runtime;
Are you sure that all callers of cpu_timer_sample_group() are fine with that change? Looking at set_process_cpu_timer() it seems we want the committed time as well to be added on newval. For the same reasons we use cpu_clock_sample_group() in (3) here. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

