It seemed like a syscall could read the values from a task currently
running on another CPU. If not, great.
Indeed it can. And yes, there is no locking against updates for this. For
sched_time on 32-bit platforms, there is the possibility it could be read
during an update and give a bogus value if the high half is updated before
the low half. Since there are no guarantees about accuracy, period, I
decided not to worry about such an anomaly. Perhaps it would be better to
do something about this, but AFAIK nothing perfect can be done without
adding more words to task_struct (e.g. seqcount). I don't know if the
nature of SMP cache behavior makes something like:
do {
sample = p->sched_time;
} while (p->sched_time != sample);
sufficient. That would certainly be easy to do.