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 #include #include +#include #include #include @@ -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);