2.6.23.rc5: Problem with procfs -- schedstat

From: Ph. Marek
Date: Wed Sep 05 2007 - 01:17:37 EST


Hello everybody,

I found a problem in /proc/self/schedstat: a simple "cat" can give "wrong"
results.

ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ91117 26027 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ90691 27872 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ995483 15675 3

ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ478050 124422 3
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ87912 21539 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ81382 19722 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ87999 119699 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ87192 25990 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ80114 15113 2
ÂÂÂÂÂÂÂÂ3
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ93064 28817 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ90834 22816 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ87806 37581 2
ÂÂÂÂÂÂÂÂ/proc# cat self/schedstat
ÂÂÂÂÂÂÂÂ80187 20283 2
ÂÂÂÂÂÂÂÂ3
ÂÂÂÂÂÂÂÂ/proc#

Please note the extra newline and possible other digits.

A strace reveals that cat does
ÂÂÂÂÂÂÂÂopen("self/schedstat", O_RDONLY|O_LARGEFILE) = 3
ÂÂÂÂÂÂÂÂfstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
ÂÂÂÂÂÂÂÂread(3, "946533 98256 64\n", 4096) Â Â Â= 16
ÂÂÂÂÂÂÂÂwrite(1, "946533 98256 64\n", 16) Â Â Â = 16
ÂÂÂÂÂÂÂÂread(3, "8\n", 4096) Â Â Â Â Â Â Â Â Â Â= 2
ÂÂÂÂÂÂÂÂwrite(1, "8\n", 2) Â Â Â Â Â Â Â Â Â Â Â= 2
ÂÂÂÂÂÂÂÂread(3, "", 4096) Â Â Â Â Â Â Â Â Â Â Â = 0
ÂÂÂÂÂÂÂÂclose(3) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â= 0
ÂÂÂÂÂÂÂÂclose(1) Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â= 0
ÂÂÂÂÂÂÂÂexit_group(0) Â Â Â Â Â Â Â Â Â Â Â Â Â = ?

The simple fix would be to change the format in proc_pid_schedstat(), so
that it always returns the same number of bytes.

Or proc_info_read() gets changed - if less bytes than wanted (by userspace)
were returned, mark that file for returning EOF next time. But I fear that
that might break other entries that rely on getting repeatedly called.


Regards,

Phil


--
Versioning your /etc, /home or even your whole installation?
Try fsvs (fsvs.tigris.org)!
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/