lkml.org 
[lkml]   [2010]   [Mar]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [RFC,PATCH 1/2] cputimers/proc: do_task_stat()->task_times() can race with getrusage()
    On 03/29, Stanislaw Gruszka wrote:
    >
    > On Fri, Mar 26, 2010 at 10:49:06PM +0100, Oleg Nesterov wrote:
    > > As for do_task_stat()->thread_group_times(), I think we can make it
    > > rc-safe without breaking /bin/top.
    > >
    > > 1. add spin_lock_irqsave(&sig->cputimer.lock) around
    > > sig->prev_Xtime = max(...)
    > The easiest way to avoid that races is move all calls to task_times()
    > and thread_group_times() inside ->siglock, but that's a bit crappy.

    Yes, and we should avoid overloading ->siglock if possible.

    > There is also another impossible race here. On 32-bit machines
    > reading/writing sum_exec_runtime is not atomic,

    Sure,

    > IIRC ->siglock
    > protect about that as well.

    I don't think so. update_curr/etc updates t->se.sum_exec_runtime without
    ->siglock, it can't help to read u64 values atomically.

    > > 2. Add a couple of barriers into thread_group_cputime()
    > > and __exit_signal() so that without ->siglock we can
    > > never overestimate utime/stime if we race with exit.
    > >
    > > If we underestimate these values, this should be fine:
    > >
    > > - the error can't be "systematic", the next read from
    > > /prod/pid/stat will see the updated values
    > >
    > > - the prev_Xtime logic in thread_group_times() ensures
    > > the reported time can never go back.
    > >
    > > IOW: at worse, cat /proc/pid/stat can miss the time
    > > which the exited thread spent on CPU after the previous
    > > read of /proc/pid/stat. This looks absolutely harmless,
    > > the next read will see this time.
    > >
    > > Probably we can even detect this case if we look at
    > > sig->nr_threads and retry.
    > Races with __exit_signal() can lead to count Xtime values twice,
    > first: in tsk->Xtime, second: after task exits, in sig->Xtime.

    Please see above. This is what should be avoided.

    > > I'll try to make patches unless someone has a better idea.
    > >
    > > I just can't accept the fact that we are doing while_each_thread()
    > > under ->siglock here ;)
    > Problem is not only in do_task_stat(). We have couple other places
    > where we iterate over all threads with ->siglock taken.

    Yes sure. I dislike the do_task_stat() case because we always do this,
    even if this info is not needed, say, for /bin/ps.

    Oleg.



    \
     
     \ /
      Last update: 2010-03-29 14:59    [W:0.022 / U:150.216 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site