lkml.org 
[lkml]   [2009]   [Feb]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH] timers: fix TIMER_ABSTIME for process wide cpu timers
    From
    Date
    While going through the man-pages Michael prepared for the posix timer
    interface I realized that posix timers do expose the absolute time value
    through the use of TIMER_ABSTIME.

    ---
    Subject: timers: fix TIMER_ABSTIME for process wide cpu timers
    From: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Date: Wed Feb 11 11:30:27 CET 2009

    The POSIX timer interface allows for absolute time expiry values through the
    TIMER_ABSTIME flag, therefore we have to synchronize the timer to the clock
    every time we start it.

    Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    ---
    include/linux/sched.h | 13 +------------
    kernel/posix-cpu-timers.c | 34 ++++++++++++++++++++++++++++++++++
    2 files changed, 35 insertions(+), 12 deletions(-)

    Index: linux-2.6/include/linux/sched.h
    ===================================================================
    --- linux-2.6.orig/include/linux/sched.h
    +++ linux-2.6/include/linux/sched.h
    @@ -2229,18 +2229,7 @@ static inline int spin_needbreak(spinloc
    * Thread group CPU time accounting.
    */
    void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times);
    -
    -static inline
    -void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)
    -{
    - struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
    - unsigned long flags;
    -
    - spin_lock_irqsave(&cputimer->lock, flags);
    - cputimer->running = 1;
    - *times = cputimer->cputime;
    - spin_unlock_irqrestore(&cputimer->lock, flags);
    -}
    +void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times);

    static inline void thread_group_cputime_init(struct signal_struct *sig)
    {
    Index: linux-2.6/kernel/posix-cpu-timers.c
    ===================================================================
    --- linux-2.6.orig/kernel/posix-cpu-timers.c
    +++ linux-2.6/kernel/posix-cpu-timers.c
    @@ -261,6 +261,40 @@ out:
    rcu_read_unlock();
    }

    +static void update_gt_cputime(struct task_cputime *a, struct task_cputime *b)
    +{
    + if (cputime_gt(b->utime, a->utime))
    + a->utime = b->utime;
    +
    + if (cputime_gt(b->stime, a->stime))
    + a->stime = b->stime;
    +
    + if (b->sum_exec_runtime > a->sum_exelt rec_runtime)
    + a->sum_exec_runtime = b->sum_exec_runtime;
    +}
    +
    +void thread_group_cputimer(struct task_struct *tsk, struct task_cputime *times)
    +{
    + struct thread_group_cputimer *cputimer = &tsk->signal->cputimer;
    + struct task_cputime sum;
    + unsigned long flags;
    +
    + spin_lock_irqsave(&cputimer->lock, flags);
    + if (!cputimer->running) {
    + cputimer->running = 1;
    + /*
    + * The POSIX timer interface allows for absolute time expiry
    + * values through the TIMER_ABSTIME flag, therefore we have
    + * to synchronize the timer to the clock every time we start
    + * it.
    + */
    + thread_group_cputime(tsk, &sum);
    + update_gt_cputime(&cputimer->cputime, &sum);
    + }
    + *times = cputimer->cputime;
    + spin_unlock_irqrestore(&cputimer->lock, flags);
    +}
    +
    /*
    * Sample a process (thread group) clock for the given group_leader task.
    * Must be called with tasklist_lock held for reading.


    \
     
     \ /
      Last update: 2009-02-11 11:55    [W:0.024 / U:88.748 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site