Re: [PATCH v2 3/3] process cputimer is moving faster than its corresponding clock

2013-04-29 Thread Olivier Langlois
On Mon, 2013-04-29 at 02:25 -0400, KOSAKI Motohiro wrote:
> (4/27/13 12:41 AM), Olivier Langlois wrote:
> > 
> > 
> > Add thread group delta to cpu timer sample when computing a timer 
> > expiration.
> > 
> > This is mandatory to make sure that the posix cpu timer does not fire too
> > soon relative to the process cpu clock which do include the task group 
> > delta.
> > 
> > test case to validate the patch is glibc-2.17/rt/tst-cputimer1.c
> 
> First, I could reproduce this issue. thanks. Second, actually, this issue is 
> not
> cause by race. This just occur by timer initialization mistake. I'll show you
> the smallest fix.
> 
> 
Great!
> 
> > @@ -697,7 +755,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, 
> > int flags,
> > if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
> > cpu_clock_sample(timer->it_clock, p, );
> > } else {
> > -   cpu_timer_sample_group(timer->it_clock, p, );
> > +   cpu_timer_sample_group(timer->it_clock, p, ,
> > +  CPUTIMER_NEED_DELTA);
> 
> POSIX says, 
> 
> http://pubs.opengroup.org/onlinepubs/7908799/xsh/timer_gettime.html
> > If the argument ovalue is not NULL, the function timer_settime() stores, 
> > in the location referenced by ovalue, a value representing the previous 
> > amount of time before the timer would have expired or zero if the timer 
> > was disarmed, together with the previous timer reload value. The members 
> > of ovalue are subject to the resolution of the timer, and they are the 
> > same values that would be returned by a timer_gettime() call at that point 
> > in time.
>   
> ^^
> 
> 
> but your posix_cpu_timer_set() and posix_cpu_timer_get() are not consistent. 
> I'm worry
> about this.
> 
> 
> > }
> >  
> > if (old) {
> > @@ -845,7 +904,8 @@ static void posix_cpu_timer_get(struct k_itimer *timer, 
> > struct itimerspec *itp)
> > read_unlock(_lock);
> > goto dead;
> > } else {
> > -   cpu_timer_sample_group(timer->it_clock, p, );
> > +   cpu_timer_sample_group(timer->it_clock, p, ,
> > +  CPUTIMER_NO_DELTA);
> >
> > clear_dead = (unlikely(p->exit_state) &&
> >   thread_group_empty(p));
> > }
> 
> --
I have tried to minimize rq locks contention to strict minimum. If to
remain POSIX compliant, it is required to also use CPUTIMER_NEED_DELTA,
so be it. I have no objections.



--
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/


Re: [PATCH v2 3/3] process cputimer is moving faster than its corresponding clock

2013-04-29 Thread KOSAKI Motohiro
(4/27/13 12:41 AM), Olivier Langlois wrote:
> 
> 
> Add thread group delta to cpu timer sample when computing a timer expiration.
> 
> This is mandatory to make sure that the posix cpu timer does not fire too
> soon relative to the process cpu clock which do include the task group delta.
> 
> test case to validate the patch is glibc-2.17/rt/tst-cputimer1.c

First, I could reproduce this issue. thanks. Second, actually, this issue is not
cause by race. This just occur by timer initialization mistake. I'll show you
the smallest fix.



> @@ -697,7 +755,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, 
> int flags,
> if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
> cpu_clock_sample(timer->it_clock, p, );
> } else {
> -   cpu_timer_sample_group(timer->it_clock, p, );
> +   cpu_timer_sample_group(timer->it_clock, p, ,
> +  CPUTIMER_NEED_DELTA);

POSIX says, 

http://pubs.opengroup.org/onlinepubs/7908799/xsh/timer_gettime.html
> If the argument ovalue is not NULL, the function timer_settime() stores, 
> in the location referenced by ovalue, a value representing the previous 
> amount of time before the timer would have expired or zero if the timer 
> was disarmed, together with the previous timer reload value. The members 
> of ovalue are subject to the resolution of the timer, and they are the 
> same values that would be returned by a timer_gettime() call at that point in 
> time.
  
^^


but your posix_cpu_timer_set() and posix_cpu_timer_get() are not consistent. 
I'm worry
about this.


> }
>  
> if (old) {
> @@ -845,7 +904,8 @@ static void posix_cpu_timer_get(struct k_itimer *timer, 
> struct itimerspec *itp)
> read_unlock(_lock);
> goto dead;
> } else {
> -   cpu_timer_sample_group(timer->it_clock, p, );
> +   cpu_timer_sample_group(timer->it_clock, p, ,
> +  CPUTIMER_NO_DELTA);
>
> clear_dead = (unlikely(p->exit_state) &&
>   thread_group_empty(p));
> }

--
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/


Re: [PATCH v2 3/3] process cputimer is moving faster than its corresponding clock

2013-04-29 Thread KOSAKI Motohiro
(4/27/13 12:41 AM), Olivier Langlois wrote:
 
 
 Add thread group delta to cpu timer sample when computing a timer expiration.
 
 This is mandatory to make sure that the posix cpu timer does not fire too
 soon relative to the process cpu clock which do include the task group delta.
 
 test case to validate the patch is glibc-2.17/rt/tst-cputimer1.c

First, I could reproduce this issue. thanks. Second, actually, this issue is not
cause by race. This just occur by timer initialization mistake. I'll show you
the smallest fix.



 @@ -697,7 +755,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, 
 int flags,
 if (CPUCLOCK_PERTHREAD(timer-it_clock)) {
 cpu_clock_sample(timer-it_clock, p, val);
 } else {
 -   cpu_timer_sample_group(timer-it_clock, p, val);
 +   cpu_timer_sample_group(timer-it_clock, p, val,
 +  CPUTIMER_NEED_DELTA);

POSIX says, 

http://pubs.opengroup.org/onlinepubs/7908799/xsh/timer_gettime.html
 If the argument ovalue is not NULL, the function timer_settime() stores, 
 in the location referenced by ovalue, a value representing the previous 
 amount of time before the timer would have expired or zero if the timer 
 was disarmed, together with the previous timer reload value. The members 
 of ovalue are subject to the resolution of the timer, and they are the 
 same values that would be returned by a timer_gettime() call at that point in 
 time.
  
^^


but your posix_cpu_timer_set() and posix_cpu_timer_get() are not consistent. 
I'm worry
about this.


 }
  
 if (old) {
 @@ -845,7 +904,8 @@ static void posix_cpu_timer_get(struct k_itimer *timer, 
 struct itimerspec *itp)
 read_unlock(tasklist_lock);
 goto dead;
 } else {
 -   cpu_timer_sample_group(timer-it_clock, p, now);
 +   cpu_timer_sample_group(timer-it_clock, p, now,
 +  CPUTIMER_NO_DELTA);

 clear_dead = (unlikely(p-exit_state) 
   thread_group_empty(p));
 }

--
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/


Re: [PATCH v2 3/3] process cputimer is moving faster than its corresponding clock

2013-04-29 Thread Olivier Langlois
On Mon, 2013-04-29 at 02:25 -0400, KOSAKI Motohiro wrote:
 (4/27/13 12:41 AM), Olivier Langlois wrote:
  
  
  Add thread group delta to cpu timer sample when computing a timer 
  expiration.
  
  This is mandatory to make sure that the posix cpu timer does not fire too
  soon relative to the process cpu clock which do include the task group 
  delta.
  
  test case to validate the patch is glibc-2.17/rt/tst-cputimer1.c
 
 First, I could reproduce this issue. thanks. Second, actually, this issue is 
 not
 cause by race. This just occur by timer initialization mistake. I'll show you
 the smallest fix.
 
 
Great!
 
  @@ -697,7 +755,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, 
  int flags,
  if (CPUCLOCK_PERTHREAD(timer-it_clock)) {
  cpu_clock_sample(timer-it_clock, p, val);
  } else {
  -   cpu_timer_sample_group(timer-it_clock, p, val);
  +   cpu_timer_sample_group(timer-it_clock, p, val,
  +  CPUTIMER_NEED_DELTA);
 
 POSIX says, 
 
 http://pubs.opengroup.org/onlinepubs/7908799/xsh/timer_gettime.html
  If the argument ovalue is not NULL, the function timer_settime() stores, 
  in the location referenced by ovalue, a value representing the previous 
  amount of time before the timer would have expired or zero if the timer 
  was disarmed, together with the previous timer reload value. The members 
  of ovalue are subject to the resolution of the timer, and they are the 
  same values that would be returned by a timer_gettime() call at that point 
  in time.
   
 ^^
 
 
 but your posix_cpu_timer_set() and posix_cpu_timer_get() are not consistent. 
 I'm worry
 about this.
 
 
  }
   
  if (old) {
  @@ -845,7 +904,8 @@ static void posix_cpu_timer_get(struct k_itimer *timer, 
  struct itimerspec *itp)
  read_unlock(tasklist_lock);
  goto dead;
  } else {
  -   cpu_timer_sample_group(timer-it_clock, p, now);
  +   cpu_timer_sample_group(timer-it_clock, p, now,
  +  CPUTIMER_NO_DELTA);
 
  clear_dead = (unlikely(p-exit_state) 
thread_group_empty(p));
  }
 
 --
I have tried to minimize rq locks contention to strict minimum. If to
remain POSIX compliant, it is required to also use CPUTIMER_NEED_DELTA,
so be it. I have no objections.



--
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/