On Sun, May 26, 2013 at 05:35:44PM -0400, kosaki.motoh...@gmail.com wrote: > From: KOSAKI Motohiro <kosaki.motoh...@jp.fujitsu.com> > > 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 <oliv...@trillion01.com> > Cc: Thomas Gleixner <t...@linutronix.de> > Cc: Frederic Weisbecker <fweis...@gmail.com> > Cc: Ingo Molnar <mi...@kernel.org> > Acked-by: Peter Zijlstra <pet...@infradead.org> > Signed-off-by: KOSAKI Motohiro <kosaki.motoh...@jp.fujitsu.com> > --- > 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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/