On Wed, Aug 21, 2019 at 09:09:15PM +0200, Thomas Gleixner wrote:
>  /**
> - * task_cputimers_expired - Compare two task_cputime entities.
> + * task_cputimers_expired - Check whether posix CPU timers are expired
>   *
>   * @samples: Array of current samples for the CPUCLOCK clocks
> - * @expiries:        Array of expiry values for the CPUCLOCK clocks
> + * @pct:     Pointer to a posix_cputimers container
>   *
> - * Returns true if any mmember of @samples is greater than the corresponding
> - * member of @expiries if that member is non zero. False otherwise
> + * Returns true if any member of @samples is greater than the corresponding
> + * member of @pct->bases[CLK].nextevt. False otherwise
>   */
> -static inline bool task_cputimers_expired(const u64 *sample, const u64 
> *expiries)
> +static inline bool
> +task_cputimers_expired(const u64 *sample, struct posix_cputimers *pct)
>  {
>       int i;
>  
>       for (i = 0; i < CPUCLOCK_MAX; i++) {
> -             if (expiries[i] && sample[i] >= expiries[i])
> +             if (sample[i] >= pct->bases[i].nextevt)

You may have false positive here if you don't check if pct->bases[i].nextevt
is 0. Probably no big deal by the end of the series since you change that 0
for KTIME_MAX later but right now it might hurt bisection with performance
issues (locking sighand at every tick...).

[...]

> @@ -1176,7 +1182,7 @@ void run_posix_cpu_timers(void)
>  void set_process_cpu_timer(struct task_struct *tsk, unsigned int clkid,
>                          u64 *newval, u64 *oldval)
>  {
> -     u64 now, *expiry = tsk->signal->posix_cputimers.expiries + clkid;
> +     u64 now, *nextevt = &tsk->signal->posix_cputimers.bases[clkid].nextevt;

You're dereferencing the pointer before checking clkid sanity below.

>  
>       if (WARN_ON_ONCE(clkid >= CPUCLOCK_SCHED))
>               return;
> @@ -1207,8 +1213,8 @@ void set_process_cpu_timer(struct task_s
>        * Update expiration cache if this is the earliest timer. CPUCLOCK_PROF
>        * expiry cache is also used by RLIMIT_CPU!.
>        */
> -     if (expires_gt(*expiry, *newval))
> -             *expiry = *newval;
> +     if (expires_gt(*nextevt, *newval))
> +             *nextevt = *newval;
>  
>       tick_dep_set_signal(tsk->signal, TICK_DEP_BIT_POSIX_TIMER);
>  }
> 
> 

Reply via email to