So there I am looking at the sysinfo from a particular machine and I look at the content of the procs field. It looked to be a bit out. Went hunting through the kernel source and noticed that the procs field is filled with the value of the number of threads in the system. This is a little bit odd, as I’m used to separating my threads from my processes.
Turns out that there is an nr_processes() call, which returns the number of processes in the system, rather than the number of threads. A little bit of a change, rebuild and testing now gives me the correct number of processes from the proc field, and I also have a separate result for the number of threads.
There we go, much more sensible š
diff -Naur linux-2.6.25.18/include/linux/kernel.h linux-2.6.25.18.new/include/linux/kernel.h
— linux-2.6.25.18/include/linux/kernel.h 2008-10-09 03:58:32.000000000 +0100
+++ linux-2.6.25.18.new/include/linux/kernel.h 2009-03-16 16:23:39.000000000 +0000
@@ -415,7 +415,8 @@
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
– char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
+ unsigned int threads; /* Number of current threads */
+ char _f[20-2*sizeof(long)-2*sizeof(int)]; /* Padding: libc5 uses this.. */
};
/* Force a compilation error if condition is true */
diff -Naur linux-2.6.25.18/kernel/compat.c linux-2.6.25.18.new/kernel/compat.c
— linux-2.6.25.18/kernel/compat.c 2008-10-09 03:58:32.000000000 +0100
+++ linux-2.6.25.18.new/kernel/compat.c 2009-03-16 16:43:31.000000000 +0000
@@ -1031,7 +1031,8 @@
u32 totalhigh;
u32 freehigh;
u32 mem_unit;
– char _f[20-2*sizeof(u32)-sizeof(int)];
+ u32 threads;
+ char _f[20-2*sizeof(u32)-2*sizeof(int)];
};
asmlinkage long
@@ -1076,7 +1077,8 @@
__put_user (s.procs, &info->procs) ||
__put_user (s.totalhigh, &info->totalhigh) ||
__put_user (s.freehigh, &info->freehigh) ||
– __put_user (s.mem_unit, &info->mem_unit))
+ __put_user (s.mem_unit, &info->mem_unit) ||
+ __put_user (s.threads, &info->threads))
return -EFAULT;
return 0;
diff -Naur linux-2.6.25.18/kernel/timer.c linux-2.6.25.18.new/kernel/timer.c
— linux-2.6.25.18/kernel/timer.c 2008-10-09 03:58:32.000000000 +0100
+++ linux-2.6.25.18.new/kernel/timer.c 2009-03-16 16:20:02.000000000 +0000
@@ -37,6 +37,7 @@
#include <linux/delay.h>
#include <linux/tick.h>
#include <linux/kallsyms.h>
+#include <linux/sched.h>
#include <asm/uaccess.h>
#include <asm/unistd.h>
@@ -1166,7 +1167,8 @@
info->loads[1] = avenrun[1] << (SI_LOAD_SHIFT – FSHIFT);
info->loads[2] = avenrun[2] << (SI_LOAD_SHIFT – FSHIFT);
– info->procs = nr_threads;
+ info->procs = nr_processes();
+ info->threads = nr_threads;
} while (read_seqretry(&xtime_lock, seq));
si_meminfo(info);
The Full patch.