--- atoppatch-1.23.orig/debian/NEWS +++ atoppatch-1.23/debian/NEWS @@ -0,0 +1,14 @@ +atoppatch (1:1.14-1) unstable; urgency=low + + After discussion with the upstream author i changed the architecture + from i386 to all. Due to lack of necessary hardware Gerlof can test + the patches only on i386 hardware. No cpu-architecture specific code + should be modified by these patches so they should run fine on non- + i386 CPUs. If you run one or both patches one such a system and have + any problems/issues, Gerlof and me welcome any comments, hints, + patches etc. + If you run these patches successfully on such a system, a short note + about your hardware and the version of atoppatch used is also welcome. + + -- Edelhard Becker Mon, 17 Jan 2005 23:33:59 +0100 + --- atoppatch-1.23.orig/debian/dirs +++ atoppatch-1.23/debian/dirs @@ -0,0 +1,2 @@ +usr/bin +usr/sbin --- atoppatch-1.23.orig/debian/docs +++ atoppatch-1.23/debian/docs @@ -0,0 +1 @@ +README.patch --- atoppatch-1.23.orig/debian/control +++ atoppatch-1.23/debian/control @@ -0,0 +1,39 @@ +Source: atoppatch +Section: admin +Priority: optional +Maintainer: Edelhard Becker +Build-Depends: debhelper (>= 4.0.0), dh-kpatches +Standards-Version: 3.7.3 +Homepage: http://www.atconsultancy.nl/atop/kernpatch.html + +Package: kernel-patch-atopcnt +Architecture: all +Depends: ${kpatch:Depends} +Enhances: atop +Description: additional statistical counters for atop + This patch takes care that statistical counters are added to the + process-administration (task_struct) and that these counters are incremented + per process. The additional counters are shown via the file /proc/pid/stat as + a second line of counters. When this patch is installed, atop automatically + shows another layout for the generic screen (including disk- and + network-transfers for active processes). However for terminated process these + additional counters are not shown, because the conventional layout of the + process-accounting record has not been adapted. + . + Author: Gerlof Langeveld + +Package: kernel-patch-atopacct +Architecture: all +Depends: ${kpatch:Depends}, kernel-patch-atopcnt +Enhances: kernel-patch-atopcnt +Description: save additional statistical counters for atop in the record + This patch takes care that the additional statistical counters are added to + the process-accounting record (yes, this means an incompatible layout of this + record). When this patch is installed, ATOP automatically shows the + additional counters for terminated processes as well. Since the pid of + processes is also stored in the modified process-accounting record, matching + this info with the formerly running process is less time-consuming compared to + the conventional process-accounting record. + . + Author: Gerlof Langeveld + --- atoppatch-1.23.orig/debian/rules +++ atoppatch-1.23/debian/rules @@ -0,0 +1,87 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# GNU copyright 1997 by Joey Hess. +# +# This version is for a hypothetical package that can build a kernel modules +# architecture-dependant package via make-kpkg, as well as an +# architecture-independent module source package, and other packages +# either dep/indep for things like common files or userspace components +# needed for the kernel modules. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +# These are used for cross-compiling and for saving the configure script +# from having to guess our platform (since we know it already) +DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) +DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) +DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH) + +#build-arch: config.status build-arch-stamp +build-arch: build-arch-stamp +build-arch-stamp: + dh_testdir + # nothing to do here + touch build-arch-stamp + +#build-indep: config.status build-indep-stamp +build-indep: build-indep-stamp +build-indep-stamp: + dh_testdir + touch build-indep-stamp + +build: build-arch build-indep + +clean: + dh_testdir + dh_testroot + rm -f build-arch-stamp build-indep-stamp kdist_config-stamp \ + debian/rtai-source.tar.bz2 \ + rtai-core/arch/mipsel rtai-core/arch/powerpc + # Add here commands to clean up after the build process. + dh_clean + +install: DH_OPTIONS= +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + dh_installkpatches + dh_install + +# Build architecture-independent files here. +# Pass -i to all debhelper commands in this target to reduce clutter. +binary-indep: build install + dh_testdir + dh_testroot + dh_installkpatches + dh_installdocs + dh_installchangelogs + dh_link + dh_compress + dh_fixperms + dh_installdeb + dh_gencontrol + dh_md5sums + dh_builddeb + +# Build architecture-dependent files here. +binary-arch: build install + ## nothing to do here, with change to "Architecture: all" moved everything to binary-indep + #dh_testdir -s + #dh_testroot -s + #dh_installkpatches -s + #dh_installdocs -s + #dh_installchangelogs -s + #dh_link -s + #dh_compress -s + #dh_fixperms -s + #dh_installdeb -s + #dh_gencontrol -s + #dh_md5sums -s + #dh_builddeb -s + +binary: binary-indep binary-arch +.PHONY: build clean binary-indep binary-arch binary install binary-modules kdist kdist_config kdist_image kdist_clean --- atoppatch-1.23.orig/debian/watch +++ atoppatch-1.23/debian/watch @@ -0,0 +1,7 @@ +# debian/watch for atoppatch +version=2 + +# This is a variant HTTP format with more possibilities: +# Homepage Pattern [Version [Action]] +http://www.atconsultancy.nl/atop/download.html packages/atoppatch-kernel-([\d\.]*).tar.gz + --- atoppatch-1.23.orig/debian/kernel-patch-atopacct.kpatches +++ atoppatch-1.23/debian/kernel-patch-atopacct.kpatches @@ -0,0 +1,49 @@ +Patch-name: atop process-accounting +Patch-id: atopacct +Depends: atopcnt + +Patch-file: 02patch-2.6.8_atopacct +Kernel-version: 2.6.8 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.13_atopacct +Kernel-version: 2.6.13 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.15_atopacct +Kernel-version: 2.6.15 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.16_atopacct +Kernel-version: 2.6.16 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.17_atopacct +Kernel-version: 2.6.17 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.18_atopacct +Kernel-version: 2.6.18 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.20_atopacct +Kernel-version: 2.6.20 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.21_atopacct +Kernel-version: 2.6.21 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 02patch-2.6.24_atopacct +Kernel-version: 2.6.24 +Architecture: i386 +Path-strip-level: 1 + --- atoppatch-1.23.orig/debian/changelog +++ atoppatch-1.23/debian/changelog @@ -0,0 +1,56 @@ +atoppatch (1:1.23-1) unstable; urgency=low + + * New upstream release + * bump standards to 3.7.3 (no changes) + * moved homepage from description to control field + + -- Edelhard Becker Fri, 07 Mar 2008 22:36:43 +0100 + +atoppatch (1:1.21-1) unstable; urgency=low + + * New upstream release + * updated watch file + + -- Edelhard Becker Sun, 02 Sep 2007 13:52:21 +0200 + +atoppatch (1:1.20-1) unstable; urgency=low + + * New upstream release (Closes: #392654) + * bumped standards to 3.7.2 + + -- Edelhard Becker Wed, 02 May 2007 23:40:48 +0200 + +atoppatch (1:1.15-1) unstable; urgency=low + + * New upstream release + + -- Edelhard Becker Mon, 7 Nov 2005 23:15:38 +0100 + +atoppatch (1:1.14-2) unstable; urgency=low + + * added 2.6.11 to the supported kernel versions (not approved by upstream, + just my test) + + -- Edelhard Becker Mon, 28 Mar 2005 19:30:13 +0200 + +atoppatch (1:1.14-1) unstable; urgency=low + + * New upstream release + * added epoch since upstream decided to change numbering scheme to + correspond with atop instead of kernel version + * adopt the change in archive layout (patches/ subdir is gone) + * added debian/watch file + * changed architecture to all, updated rules accordingly + * added debian/NEWS with a note about the change of architecture to "all" + and the wish for comments about atoppatch on non-i386 cpus + + -- Edelhard Becker Mon, 17 Jan 2005 23:56:13 +0100 + +atoppatch (2.6.8-1) unstable; urgency=low + + * Initial Release. Made two seperate packages from the source archive + because one may use atopcnt without atopacct. + * Initial upload (Closes: #286237, #286238). + + -- Edelhard Becker Sun, 19 Dec 2004 14:37:29 +0100 + --- atoppatch-1.23.orig/debian/compat +++ atoppatch-1.23/debian/compat @@ -0,0 +1 @@ +4 --- atoppatch-1.23.orig/debian/README.Debian +++ atoppatch-1.23/debian/README.Debian @@ -0,0 +1,16 @@ +atoppatch for Debian +-------------------- + +The Debian atoppatch source package provides two packages, + + (1) kernel-patch-atopcnt + (2) kernel-patch-atopacct + +Please see ./README.patch or the homepage for a description of the atoppatch +software. The original source archive consists of two patches, where (1) can be +used without (2), but (2) depends on (1). Using only (1), atop writes the same +raw data format into its log as without any kernel path. + +Homepage: http://www.atconsultancy.nl/atop/home.html + + -- Edelhard Becker , Sat, 18 Dec 2004 14:24:08 +0100 --- atoppatch-1.23.orig/debian/copyright +++ atoppatch-1.23/debian/copyright @@ -0,0 +1,12 @@ +This package was debianized by Edelhard Becker on +Sat, 18 Dec 2004 15:37:59 +0100 + +It was downloaded from http://www.atconsultancy.nl/atop/home.html + +Upstream Author: Gerlof Langeveld + +Copyright: Gerlof Langeveld, AT Computing (gerlof@ATComputing.nl) + +You are free to distribute this software under the terms of the GNU General +Public License. On Debian systems, the complete text of the GNU General Public +License can be found in the file `/usr/share/common-licenses/GPL'. --- atoppatch-1.23.orig/debian/kernel-patch-atopcnt.kpatches +++ atoppatch-1.23/debian/kernel-patch-atopcnt.kpatches @@ -0,0 +1,48 @@ +Patch-name: atop additional statistical counters +Patch-id: atopcnt + +Patch-file: 01patch-2.6.8_atopcnt +Kernel-version: 2.6.8 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.13_atopcnt +Kernel-version: 2.6.13 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.15_atopcnt +Kernel-version: 2.6.15 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.16_atopcnt +Kernel-version: 2.6.16 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.17_atopcnt +Kernel-version: 2.6.17 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.18_atopcnt +Kernel-version: 2.6.18 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.20_atopcnt +Kernel-version: 2.6.20 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.21_atopcnt +Kernel-version: 2.6.21 +Architecture: i386 +Path-strip-level: 1 + +Patch-file: 01patch-2.6.24_atopcnt +Kernel-version: 2.6.24 +Architecture: i386 +Path-strip-level: 1 + --- atoppatch-1.23.orig/01patch-2.6.13_atopcnt +++ atoppatch-1.23/01patch-2.6.13_atopcnt @@ -0,0 +1,169 @@ +--- linux-2.6.13.4-orig/include/linux/sched.h 2005-10-10 20:54:29.000000000 +0200 ++++ linux/include/linux/sched.h 2005-10-28 15:24:13.000000000 +0200 +@@ -770,6 +770,16 @@ + int cpuset_mems_generation; + #endif + atomic_t fs_excl; /* holding fs exclusive resources */ ++ ++ struct { /* ATOP_added */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP_added */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP_added */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP_added */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP_added */ ++ unsigned long udp_snd, udp_rcv; /* ATOP_added */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP_added */ ++ unsigned long raw_snd, raw_rcv; /* ATOP_added */ ++ } stat; /* ATOP_added */ + }; + + static inline pid_t process_group(struct task_struct *tsk) +--- linux-2.6.13.4-orig/kernel/fork.c 2005-10-10 20:54:29.000000000 +0200 ++++ linux/kernel/fork.c 2005-10-28 15:26:51.000000000 +0200 +@@ -455,6 +455,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP_added */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP_added */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP_added */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP_added */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP_added */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP_added */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP_added */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +--- linux-2.6.13.4-orig/drivers/block/ll_rw_blk.c 2005-10-10 20:54:29.000000000 +0200 ++++ linux/drivers/block/ll_rw_blk.c 2005-10-28 15:30:16.000000000 +0200 +@@ -2288,10 +2288,15 @@ + __disk_stat_add(rq->rq_disk, read_sectors, nr_sectors); + if (!new_io) + __disk_stat_inc(rq->rq_disk, read_merges); ++ current->stat.dsk_rio += new_io; /* ATOP_added */ ++ current->stat.dsk_rsz += nr_sectors; /* ATOP_added */ ++ + } else if (rw == WRITE) { + __disk_stat_add(rq->rq_disk, write_sectors, nr_sectors); + if (!new_io) + __disk_stat_inc(rq->rq_disk, write_merges); ++ current->stat.dsk_wio += new_io; /* ATOP_added */ ++ current->stat.dsk_wsz += nr_sectors; /* ATOP_added */ + } + if (new_io) { + disk_round_stats(rq->rq_disk); +--- linux-2.6.13.4-orig/net/socket.c 2005-10-10 20:54:29.000000000 +0200 ++++ linux/net/socket.c 2005-10-28 15:37:18.000000000 +0200 +@@ -530,7 +530,7 @@ + struct msghdr *msg, size_t size) + { + struct sock_iocb *si = kiocb_to_siocb(iocb); +- int err; ++ int err, ret; + + si->sock = sock; + si->scm = NULL; +@@ -541,7 +541,25 @@ + if (err) + return err; + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ ret = sock->ops->sendmsg(iocb, sock, msg, size); ++ ++ if (ret >= 0 && sock->sk) { /* ATOP_added */ ++ switch (sock->sk->sk_family) { /* ATOP_added */ ++ case PF_INET: /* ATOP_added */ ++ case PF_INET6: /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_STREAM) { /* ATOP_added */ ++ current->stat.tcp_snd++; /* ATOP_added */ ++ current->stat.tcp_ssz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_DGRAM) { /* ATOP_added */ ++ current->stat.udp_snd++; /* ATOP_added */ ++ current->stat.udp_ssz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_RAW) /* ATOP_added */ ++ current->stat.raw_snd++; /* ATOP_added */ ++ } /* ATOP_added */ ++ } /* ATOP_added */ ++ return ret; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -579,7 +597,7 @@ + static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, + struct msghdr *msg, size_t size, int flags) + { +- int err; ++ int err, ret; + struct sock_iocb *si = kiocb_to_siocb(iocb); + + si->sock = sock; +@@ -592,7 +610,26 @@ + if (err) + return err; + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ ret = sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ ++ if (ret >= 0 && sock->sk) { /* ATOP_added */ ++ switch (sock->sk->sk_family) { /* ATOP_added */ ++ case PF_INET: /* ATOP_added */ ++ case PF_INET6: /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_STREAM) { /* ATOP_added */ ++ current->stat.tcp_rcv++; /* ATOP_added */ ++ current->stat.tcp_rsz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_DGRAM) { /* ATOP_added */ ++ current->stat.udp_rcv++; /* ATOP_added */ ++ current->stat.udp_rsz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_RAW) /* ATOP_added */ ++ current->stat.raw_rcv++; /* ATOP_added */ ++ } /* ATOP_added */ ++ } /* ATOP_added */ ++ ++ return ret; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, +--- linux-2.6.13.4-orig/fs/proc/array.c 2005-10-10 20:54:29.000000000 +0200 ++++ linux/fs/proc/array.c 2005-10-28 15:39:02.000000000 +0200 +@@ -454,6 +454,25 @@ + task_cpu(task), + task->rt_priority, + task->policy); ++ ++ res += sprintf(buffer+res, /* ATOP_added */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP_added */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP_added */ ++ task->stat.dsk_rio, /* ATOP_added */ ++ task->stat.dsk_rsz, /* ATOP_added */ ++ task->stat.dsk_wio, /* ATOP_added */ ++ task->stat.dsk_wsz, /* ATOP_added */ ++ task->stat.tcp_snd, /* ATOP_added */ ++ task->stat.tcp_ssz, /* ATOP_added */ ++ task->stat.tcp_rcv, /* ATOP_added */ ++ task->stat.tcp_rsz, /* ATOP_added */ ++ task->stat.udp_snd, /* ATOP_added */ ++ task->stat.udp_ssz, /* ATOP_added */ ++ task->stat.udp_rcv, /* ATOP_added */ ++ task->stat.udp_rsz, /* ATOP_added */ ++ task->stat.raw_snd, /* ATOP_added */ ++ task->stat.raw_rcv); /* ATOP_added */ ++ + if(mm) + mmput(mm); + return res; +--- linux-2.6.13.4-orig/kernel/acct.c 2005-10-10 20:54:29.000000000 +0200 ++++ linux/kernel/acct.c 2005-10-28 21:36:45.000000000 +0200 +@@ -478,7 +502,8 @@ + vsize = vsize / 1024; + ac.ac_mem = encode_comp_t(vsize); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP_added */ ++ + ac.ac_minflt = encode_comp_t(current->signal->min_flt + + current->group_leader->min_flt); + ac.ac_majflt = encode_comp_t(current->signal->maj_flt + --- atoppatch-1.23.orig/01patch-2.6.15_atopcnt +++ atoppatch-1.23/01patch-2.6.15_atopcnt @@ -0,0 +1,169 @@ +diff -u --recursive linux-2.6.15-orig/block/ll_rw_blk.c linux/block/ll_rw_blk.c +--- linux-2.6.15-orig/block/ll_rw_blk.c 2006-01-03 04:21:10.000000000 +0100 ++++ linux/block/ll_rw_blk.c 2006-09-15 09:34:14.000000000 +0200 +@@ -2390,6 +2390,17 @@ + disk_round_stats(rq->rq_disk); + rq->rq_disk->in_flight++; + } ++ ++ switch (rw) { /* ATOP */ ++ case READ: /* ATOP */ ++ current->group_leader->stat.dsk_rio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_rsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ case WRITE: /* ATOP */ ++ current->group_leader->stat.dsk_wio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_wsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ + } + + /* +diff -u --recursive linux-2.6.15-orig/fs/proc/array.c linux/fs/proc/array.c +--- linux-2.6.15-orig/fs/proc/array.c 2006-01-03 04:21:10.000000000 +0100 ++++ linux/fs/proc/array.c 2006-09-15 09:34:14.000000000 +0200 +@@ -460,6 +460,25 @@ + task_cpu(task), + task->rt_priority, + task->policy); ++ ++ res += sprintf(buffer+res, /* ATOP */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP */ ++ task->stat.dsk_rio, /* ATOP */ ++ task->stat.dsk_rsz, /* ATOP */ ++ task->stat.dsk_wio, /* ATOP */ ++ task->stat.dsk_wsz, /* ATOP */ ++ task->stat.tcp_snd, /* ATOP */ ++ task->stat.tcp_ssz, /* ATOP */ ++ task->stat.tcp_rcv, /* ATOP */ ++ task->stat.tcp_rsz, /* ATOP */ ++ task->stat.udp_snd, /* ATOP */ ++ task->stat.udp_ssz, /* ATOP */ ++ task->stat.udp_rcv, /* ATOP */ ++ task->stat.udp_rsz, /* ATOP */ ++ task->stat.raw_snd, /* ATOP */ ++ task->stat.raw_rcv); /* ATOP */ ++ + if(mm) + mmput(mm); + return res; +diff -u --recursive linux-2.6.15-orig/include/linux/sched.h linux/include/linux/sched.h +--- linux-2.6.15-orig/include/linux/sched.h 2006-01-03 04:21:10.000000000 +0100 ++++ linux/include/linux/sched.h 2006-09-15 09:35:13.000000000 +0200 +@@ -857,6 +857,16 @@ + int cpuset_mems_generation; + #endif + atomic_t fs_excl; /* holding fs exclusive resources */ ++ ++ struct { /* ATOP */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP */ ++ unsigned long udp_snd, udp_rcv; /* ATOP */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP */ ++ unsigned long raw_snd, raw_rcv; /* ATOP */ ++ } stat; /* ATOP */ + }; + + static inline pid_t process_group(struct task_struct *tsk) +diff -u --recursive linux-2.6.15-orig/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.15-orig/kernel/acct.c 2006-01-03 04:21:10.000000000 +0100 ++++ linux/kernel/acct.c 2006-09-15 09:34:14.000000000 +0200 +@@ -518,7 +518,8 @@ + vsize = vsize / 1024; + ac.ac_mem = encode_comp_t(vsize); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP */ ++ + ac.ac_minflt = encode_comp_t(current->signal->min_flt + + current->group_leader->min_flt); + ac.ac_majflt = encode_comp_t(current->signal->maj_flt + +diff -u --recursive linux-2.6.15-orig/kernel/fork.c linux/kernel/fork.c +--- linux-2.6.15-orig/kernel/fork.c 2006-01-03 04:21:10.000000000 +0100 ++++ linux/kernel/fork.c 2006-09-15 09:34:14.000000000 +0200 +@@ -453,6 +453,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +diff -u --recursive linux-2.6.15-orig/net/socket.c linux/net/socket.c +--- linux-2.6.15-orig/net/socket.c 2006-01-03 04:21:10.000000000 +0100 ++++ linux/net/socket.c 2006-09-15 09:34:14.000000000 +0200 +@@ -544,10 +544,28 @@ + si->size = size; + + err = security_socket_sendmsg(sock, msg, size); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->sendmsg(iocb, sock, msg, size); + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_snd++; /* ATOP */ ++ current->group_leader->stat.tcp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_snd++; /* ATOP */ ++ current->group_leader->stat.udp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_snd++; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -595,10 +613,29 @@ + si->flags = flags; + + err = security_socket_recvmsg(sock, msg, size, flags); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->recvmsg(iocb, sock, msg, size, flags); + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_rcv++; /* ATOP */ ++ current->group_leader->stat.tcp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_rcv++; /* ATOP */ ++ current->group_leader->stat.udp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_rcv++; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, --- atoppatch-1.23.orig/01patch-2.6.16_atopcnt +++ atoppatch-1.23/01patch-2.6.16_atopcnt @@ -0,0 +1,169 @@ +diff -u --recursive linux-2.6.16.1-orig/block/ll_rw_blk.c linux/block/ll_rw_blk.c +--- linux-2.6.16.1-orig/block/ll_rw_blk.c 2006-04-05 11:24:16.000000000 +0200 ++++ linux/block/ll_rw_blk.c 2006-04-06 11:20:51.000000000 +0200 +@@ -2527,6 +2527,17 @@ + disk_round_stats(rq->rq_disk); + rq->rq_disk->in_flight++; + } ++ ++ switch (rw) { /* ATOP */ ++ case READ: /* ATOP */ ++ current->group_leader->stat.dsk_rio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_rsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ case WRITE: /* ATOP */ ++ current->group_leader->stat.dsk_wio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_wsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ + } + + /* +diff -u --recursive linux-2.6.16.1-orig/fs/proc/array.c linux/fs/proc/array.c +--- linux-2.6.16.1-orig/fs/proc/array.c 2006-04-05 11:24:35.000000000 +0200 ++++ linux/fs/proc/array.c 2006-04-06 12:04:07.000000000 +0200 +@@ -460,6 +460,25 @@ + task_cpu(task), + task->rt_priority, + task->policy); ++ ++ res += sprintf(buffer+res, /* ATOP */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP */ ++ task->stat.dsk_rio, /* ATOP */ ++ task->stat.dsk_rsz, /* ATOP */ ++ task->stat.dsk_wio, /* ATOP */ ++ task->stat.dsk_wsz, /* ATOP */ ++ task->stat.tcp_snd, /* ATOP */ ++ task->stat.tcp_ssz, /* ATOP */ ++ task->stat.tcp_rcv, /* ATOP */ ++ task->stat.tcp_rsz, /* ATOP */ ++ task->stat.udp_snd, /* ATOP */ ++ task->stat.udp_ssz, /* ATOP */ ++ task->stat.udp_rcv, /* ATOP */ ++ task->stat.udp_rsz, /* ATOP */ ++ task->stat.raw_snd, /* ATOP */ ++ task->stat.raw_rcv); /* ATOP */ ++ + if(mm) + mmput(mm); + return res; +diff -u --recursive linux-2.6.16.1-orig/include/linux/sched.h linux/include/linux/sched.h +--- linux-2.6.16.1-orig/include/linux/sched.h 2006-04-05 11:25:16.000000000 +0200 ++++ linux/include/linux/sched.h 2006-04-05 00:00:00.000000000 +0200 +@@ -871,6 +871,16 @@ + #endif + atomic_t fs_excl; /* holding fs exclusive resources */ + struct rcu_head rcu; ++ ++ struct { /* ATOP */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP */ ++ unsigned long udp_snd, udp_rcv; /* ATOP */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP */ ++ unsigned long raw_snd, raw_rcv; /* ATOP */ ++ } stat; /* ATOP */ + }; + + static inline pid_t process_group(struct task_struct *tsk) +diff -u --recursive linux-2.6.16.1-orig/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.16.1-orig/kernel/acct.c 2006-04-05 11:25:41.000000000 +0200 ++++ linux/kernel/acct.c 2006-04-06 11:24:00.000000000 +0200 +@@ -520,7 +520,8 @@ + vsize = vsize / 1024; + ac.ac_mem = encode_comp_t(vsize); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP */ ++ + ac.ac_minflt = encode_comp_t(current->signal->min_flt + + current->group_leader->min_flt); + ac.ac_majflt = encode_comp_t(current->signal->maj_flt + +diff -u --recursive linux-2.6.16.1-orig/kernel/fork.c linux/kernel/fork.c +--- linux-2.6.16.1-orig/kernel/fork.c 2006-04-05 11:26:04.000000000 +0200 ++++ linux/kernel/fork.c 2006-04-06 12:03:20.000000000 +0200 +@@ -505,6 +505,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +diff -u --recursive linux-2.6.16.1-orig/net/socket.c linux/net/socket.c +--- linux-2.6.16.1-orig/net/socket.c 2006-04-05 11:26:22.000000000 +0200 ++++ linux/net/socket.c 2006-04-06 12:13:17.000000000 +0200 +@@ -544,10 +544,28 @@ + si->size = size; + + err = security_socket_sendmsg(sock, msg, size); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->sendmsg(iocb, sock, msg, size); + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_snd++; /* ATOP */ ++ current->group_leader->stat.tcp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_snd++; /* ATOP */ ++ current->group_leader->stat.udp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_snd++; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -595,10 +613,29 @@ + si->flags = flags; + + err = security_socket_recvmsg(sock, msg, size, flags); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->recvmsg(iocb, sock, msg, size, flags); + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_rcv++; /* ATOP */ ++ current->group_leader->stat.tcp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_rcv++; /* ATOP */ ++ current->group_leader->stat.udp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_rcv++; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, --- atoppatch-1.23.orig/01patch-2.6.17_atopcnt +++ atoppatch-1.23/01patch-2.6.17_atopcnt @@ -0,0 +1,163 @@ +--- linux-2.6.17.1-orig/block/ll_rw_blk.c 2006-06-20 11:31:55.000000000 +0200 ++++ linux/block/ll_rw_blk.c 2006-06-22 16:12:48.760200000 +0200 +@@ -2584,6 +2584,17 @@ + disk_round_stats(rq->rq_disk); + rq->rq_disk->in_flight++; + } ++ ++ switch (rw) { /* ATOP */ ++ case READ: /* ATOP */ ++ current->group_leader->stat.dsk_rio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_rsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ case WRITE: /* ATOP */ ++ current->group_leader->stat.dsk_wio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_wsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ + } + + /* +--- linux-2.6.17.1-orig/fs/proc/array.c 2006-06-20 11:31:55.000000000 +0200 ++++ linux/fs/proc/array.c 2006-06-22 16:12:48.760200000 +0200 +@@ -457,6 +457,25 @@ + task_cpu(task), + task->rt_priority, + task->policy); ++ ++ res += sprintf(buffer+res, /* ATOP */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP */ ++ task->stat.dsk_rio, /* ATOP */ ++ task->stat.dsk_rsz, /* ATOP */ ++ task->stat.dsk_wio, /* ATOP */ ++ task->stat.dsk_wsz, /* ATOP */ ++ task->stat.tcp_snd, /* ATOP */ ++ task->stat.tcp_ssz, /* ATOP */ ++ task->stat.tcp_rcv, /* ATOP */ ++ task->stat.tcp_rsz, /* ATOP */ ++ task->stat.udp_snd, /* ATOP */ ++ task->stat.udp_ssz, /* ATOP */ ++ task->stat.udp_rcv, /* ATOP */ ++ task->stat.udp_rsz, /* ATOP */ ++ task->stat.raw_snd, /* ATOP */ ++ task->stat.raw_rcv); /* ATOP */ ++ + if(mm) + mmput(mm); + return res; +--- linux-2.6.17.1-orig/include/linux/sched.h 2006-06-20 11:31:55.000000000 +0200 ++++ linux/include/linux/sched.h 2006-06-22 16:15:51.910200000 +0200 +@@ -884,6 +884,16 @@ + atomic_t fs_excl; /* holding fs exclusive resources */ + struct rcu_head rcu; + ++ struct { /* ATOP */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP */ ++ unsigned long udp_snd, udp_rcv; /* ATOP */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP */ ++ unsigned long raw_snd, raw_rcv; /* ATOP */ ++ } stat; /* ATOP */ ++ + /* + * cache last used pipe for splice + */ +--- linux-2.6.17.1-orig/kernel/acct.c 2006-06-20 11:31:55.000000000 +0200 ++++ linux/kernel/acct.c 2006-06-22 16:12:48.760200000 +0200 +@@ -520,7 +520,8 @@ + vsize = vsize / 1024; + ac.ac_mem = encode_comp_t(vsize); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP */ ++ + ac.ac_minflt = encode_comp_t(current->signal->min_flt + + current->min_flt); + ac.ac_majflt = encode_comp_t(current->signal->maj_flt + +--- linux-2.6.17.1-orig/kernel/fork.c 2006-06-20 11:31:55.000000000 +0200 ++++ linux/kernel/fork.c 2006-06-22 16:12:48.760200000 +0200 +@@ -503,6 +503,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +--- linux-2.6.17.1-orig/net/socket.c 2006-06-20 11:31:55.000000000 +0200 ++++ linux/net/socket.c 2006-06-22 16:12:48.760200000 +0200 +@@ -590,10 +590,28 @@ + si->size = size; + + err = security_socket_sendmsg(sock, msg, size); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->sendmsg(iocb, sock, msg, size); + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_snd++; /* ATOP */ ++ current->group_leader->stat.tcp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_snd++; /* ATOP */ ++ current->group_leader->stat.udp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_snd++; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -641,10 +659,29 @@ + si->flags = flags; + + err = security_socket_recvmsg(sock, msg, size, flags); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->recvmsg(iocb, sock, msg, size, flags); + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_rcv++; /* ATOP */ ++ current->group_leader->stat.tcp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_rcv++; /* ATOP */ ++ current->group_leader->stat.udp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_rcv++; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, --- atoppatch-1.23.orig/01patch-2.6.18_atopcnt +++ atoppatch-1.23/01patch-2.6.18_atopcnt @@ -0,0 +1,162 @@ +--- linux-2.6.18-orig/block/ll_rw_blk.c 2006-09-20 05:42:06.000000000 +0200 ++++ linux/block/ll_rw_blk.c 2006-09-26 17:12:11.105417000 +0200 +@@ -2586,6 +2586,17 @@ + disk_round_stats(rq->rq_disk); + rq->rq_disk->in_flight++; + } ++ ++ switch (rw) { /* ATOP */ ++ case READ: /* ATOP */ ++ current->group_leader->stat.dsk_rio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_rsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ case WRITE: /* ATOP */ ++ current->group_leader->stat.dsk_wio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_wsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ + } + + /* +--- linux-2.6.18-orig/fs/proc/array.c 2006-09-20 05:42:06.000000000 +0200 ++++ linux/fs/proc/array.c 2006-09-26 17:17:26.985417000 +0200 +@@ -458,6 +458,25 @@ + task->rt_priority, + task->policy, + (unsigned long long)delayacct_blkio_ticks(task)); ++ ++ res += sprintf(buffer+res, /* ATOP */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP */ ++ task->stat.dsk_rio, /* ATOP */ ++ task->stat.dsk_rsz, /* ATOP */ ++ task->stat.dsk_wio, /* ATOP */ ++ task->stat.dsk_wsz, /* ATOP */ ++ task->stat.tcp_snd, /* ATOP */ ++ task->stat.tcp_ssz, /* ATOP */ ++ task->stat.tcp_rcv, /* ATOP */ ++ task->stat.tcp_rsz, /* ATOP */ ++ task->stat.udp_snd, /* ATOP */ ++ task->stat.udp_ssz, /* ATOP */ ++ task->stat.udp_rcv, /* ATOP */ ++ task->stat.udp_rsz, /* ATOP */ ++ task->stat.raw_snd, /* ATOP */ ++ task->stat.raw_rcv); /* ATOP */ ++ + if(mm) + mmput(mm); + return res; +--- linux-2.6.18-orig/include/linux/sched.h 2006-09-20 05:42:06.000000000 +0200 ++++ linux/include/linux/sched.h 2006-09-26 17:12:11.115417000 +0200 +@@ -989,6 +989,16 @@ + atomic_t fs_excl; /* holding fs exclusive resources */ + struct rcu_head rcu; + ++ struct { /* ATOP */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP */ ++ unsigned long udp_snd, udp_rcv; /* ATOP */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP */ ++ unsigned long raw_snd, raw_rcv; /* ATOP */ ++ } stat; /* ATOP */ ++ + /* + * cache last used pipe for splice + */ +--- linux-2.6.18-orig/kernel/acct.c 2006-09-20 05:42:06.000000000 +0200 ++++ linux/kernel/acct.c 2006-09-26 17:19:20.995417000 +0200 +@@ -498,7 +498,7 @@ + ac.ac_exitcode = pacct->ac_exitcode; + spin_unlock_irq(¤t->sighand->siglock); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP */ + ac.ac_swaps = encode_comp_t(0); + + /* +--- linux-2.6.18-orig/kernel/fork.c 2006-09-20 05:42:06.000000000 +0200 ++++ linux/kernel/fork.c 2006-09-26 17:12:11.115417000 +0200 +@@ -509,6 +509,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +--- linux-2.6.18-orig/net/socket.c 2006-09-20 05:42:06.000000000 +0200 ++++ linux/net/socket.c 2006-09-26 17:12:11.115417000 +0200 +@@ -590,10 +590,28 @@ + si->size = size; + + err = security_socket_sendmsg(sock, msg, size); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->sendmsg(iocb, sock, msg, size); + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_snd++; /* ATOP */ ++ current->group_leader->stat.tcp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_snd++; /* ATOP */ ++ current->group_leader->stat.udp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_snd++; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -641,10 +659,29 @@ + si->flags = flags; + + err = security_socket_recvmsg(sock, msg, size, flags); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->recvmsg(iocb, sock, msg, size, flags); + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_rcv++; /* ATOP */ ++ current->group_leader->stat.tcp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_rcv++; /* ATOP */ ++ current->group_leader->stat.udp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_rcv++; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, --- atoppatch-1.23.orig/01patch-2.6.20_atopcnt +++ atoppatch-1.23/01patch-2.6.20_atopcnt @@ -0,0 +1,168 @@ +diff -u --recursive linux-2.6.20.4/block/ll_rw_blk.c linux/block/ll_rw_blk.c +--- linux-2.6.20.4/block/ll_rw_blk.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/block/ll_rw_blk.c 2007-03-27 08:05:22.000000000 +0200 +@@ -2674,6 +2674,17 @@ + disk_round_stats(rq->rq_disk); + rq->rq_disk->in_flight++; + } ++ ++ switch (rw) { /* ATOP */ ++ case READ: /* ATOP */ ++ current->group_leader->stat.dsk_rio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_rsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ case WRITE: /* ATOP */ ++ current->group_leader->stat.dsk_wio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_wsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ + } + + /* +diff -u --recursive linux-2.6.20.4/fs/proc/array.c linux/fs/proc/array.c +--- linux-2.6.20.4/fs/proc/array.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/fs/proc/array.c 2007-03-27 08:05:22.000000000 +0200 +@@ -458,6 +458,25 @@ + task->rt_priority, + task->policy, + (unsigned long long)delayacct_blkio_ticks(task)); ++ ++ res += sprintf(buffer+res, /* ATOP */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP */ ++ task->stat.dsk_rio, /* ATOP */ ++ task->stat.dsk_rsz, /* ATOP */ ++ task->stat.dsk_wio, /* ATOP */ ++ task->stat.dsk_wsz, /* ATOP */ ++ task->stat.tcp_snd, /* ATOP */ ++ task->stat.tcp_ssz, /* ATOP */ ++ task->stat.tcp_rcv, /* ATOP */ ++ task->stat.tcp_rsz, /* ATOP */ ++ task->stat.udp_snd, /* ATOP */ ++ task->stat.udp_ssz, /* ATOP */ ++ task->stat.udp_rcv, /* ATOP */ ++ task->stat.udp_rsz, /* ATOP */ ++ task->stat.raw_snd, /* ATOP */ ++ task->stat.raw_rcv); /* ATOP */ ++ + if(mm) + mmput(mm); + return res; +diff -u --recursive linux-2.6.20.4/include/linux/sched.h linux/include/linux/sched.h +--- linux-2.6.20.4/include/linux/sched.h 2007-03-23 20:52:51.000000000 +0100 ++++ linux/include/linux/sched.h 2007-03-27 08:05:22.000000000 +0200 +@@ -1041,6 +1041,16 @@ + atomic_t fs_excl; /* holding fs exclusive resources */ + struct rcu_head rcu; + ++ struct { /* ATOP */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP */ ++ unsigned long udp_snd, udp_rcv; /* ATOP */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP */ ++ unsigned long raw_snd, raw_rcv; /* ATOP */ ++ } stat; /* ATOP */ ++ + /* + * cache last used pipe for splice + */ +diff -u --recursive linux-2.6.20.4/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.20.4/kernel/acct.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/kernel/acct.c 2007-03-27 08:05:22.000000000 +0200 +@@ -497,7 +497,7 @@ + ac.ac_exitcode = pacct->ac_exitcode; + spin_unlock_irq(¤t->sighand->siglock); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP */ + ac.ac_swaps = encode_comp_t(0); + + /* +diff -u --recursive linux-2.6.20.4/kernel/fork.c linux/kernel/fork.c +--- linux-2.6.20.4/kernel/fork.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/kernel/fork.c 2007-03-27 08:05:22.000000000 +0200 +@@ -532,6 +532,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +diff -u --recursive linux-2.6.20.4/net/socket.c linux/net/socket.c +--- linux-2.6.20.4/net/socket.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/net/socket.c 2007-03-27 08:05:22.000000000 +0200 +@@ -560,10 +560,28 @@ + si->size = size; + + err = security_socket_sendmsg(sock, msg, size); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->sendmsg(iocb, sock, msg, size); + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_snd++; /* ATOP */ ++ current->group_leader->stat.tcp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_snd++; /* ATOP */ ++ current->group_leader->stat.udp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_snd++; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -611,10 +629,29 @@ + si->flags = flags; + + err = security_socket_recvmsg(sock, msg, size, flags); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->recvmsg(iocb, sock, msg, size, flags); + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_rcv++; /* ATOP */ ++ current->group_leader->stat.tcp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_rcv++; /* ATOP */ ++ current->group_leader->stat.udp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_rcv++; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, --- atoppatch-1.23.orig/01patch-2.6.8_atopcnt +++ atoppatch-1.23/01patch-2.6.8_atopcnt @@ -0,0 +1,168 @@ +--- linux-2.6.8-orig/include/linux/sched.h 2004-11-04 07:52:43.000000000 +0100 ++++ linux/include/linux/sched.h 2004-11-09 11:09:24.000000000 +0100 +@@ -527,6 +527,16 @@ + struct mempolicy *mempolicy; + short il_next; /* could be shared with used_math */ + #endif ++ ++ struct { /* ATOP_added */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP_added */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP_added */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP_added */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP_added */ ++ unsigned long udp_snd, udp_rcv; /* ATOP_added */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP_added */ ++ unsigned long raw_snd, raw_rcv; /* ATOP_added */ ++ } stat; /* ATOP_added */ + }; + + static inline pid_t process_group(struct task_struct *tsk) +--- linux-2.6.8-orig/kernel/fork.c 2004-11-04 07:50:32.000000000 +0100 ++++ linux/kernel/fork.c 2004-11-09 11:10:43.000000000 +0100 +@@ -530,6 +530,14 @@ + tsk->cmin_flt = tsk->cmaj_flt = 0; + tsk->nvcsw = tsk->nivcsw = tsk->cnvcsw = tsk->cnivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP_added */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP_added */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP_added */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP_added */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP_added */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP_added */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP_added */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +--- linux-2.6.8-orig/kernel/acct.c 2004-11-04 07:50:31.000000000 +0100 ++++ linux/kernel/acct.c 2004-11-04 11:04:38.000000000 +0100 +@@ -465,7 +465,7 @@ + vsize = vsize / 1024; + ac.ac_mem = encode_comp_t(vsize); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP_added */ + ac.ac_minflt = encode_comp_t(current->min_flt); + ac.ac_majflt = encode_comp_t(current->maj_flt); + ac.ac_swaps = encode_comp_t(0); +--- linux-2.6.8-orig/drivers/block/ll_rw_blk.c 2004-11-04 07:51:16.000000000 +0100 ++++ linux/drivers/block/ll_rw_blk.c 2004-11-09 11:13:21.000000000 +0100 +@@ -1950,10 +1950,14 @@ + disk_stat_add(rq->rq_disk, read_sectors, nr_sectors); + if (!new_io) + disk_stat_inc(rq->rq_disk, read_merges); ++ current->stat.dsk_rio += new_io; /* ATOP_added */ ++ current->stat.dsk_rsz += nr_sectors; /* ATOP_added */ + } else if (rw == WRITE) { + disk_stat_add(rq->rq_disk, write_sectors, nr_sectors); + if (!new_io) + disk_stat_inc(rq->rq_disk, write_merges); ++ current->stat.dsk_wio += new_io; /* ATOP_added */ ++ current->stat.dsk_wsz += nr_sectors; /* ATOP_added */ + } + if (new_io) { + disk_round_stats(rq->rq_disk); +--- linux-2.6.8-orig/net/socket.c 2004-11-04 07:50:35.000000000 +0100 ++++ linux/net/socket.c 2004-11-09 11:17:10.000000000 +0100 +@@ -531,7 +531,7 @@ + struct msghdr *msg, size_t size) + { + struct sock_iocb *si = kiocb_to_siocb(iocb); +- int err; ++ int err, ret; + + si->sock = sock; + si->scm = NULL; +@@ -542,7 +542,26 @@ + if (err) + return err; + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ ret = sock->ops->sendmsg(iocb, sock, msg, size); ++ ++ if (ret >= 0 && sock->sk) { /* ATOP_added */ ++ switch (sock->sk->sk_family) { /* ATOP_added */ ++ case PF_INET: /* ATOP_added */ ++ case PF_INET6: /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_STREAM) { /* ATOP_added */ ++ current->stat.tcp_snd++; /* ATOP_added */ ++ current->stat.tcp_ssz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_DGRAM) { /* ATOP_added */ ++ current->stat.udp_snd++; /* ATOP_added */ ++ current->stat.udp_ssz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_RAW) /* ATOP_added */ ++ current->stat.raw_snd++; /* ATOP_added */ ++ } /* ATOP_added */ ++ } /* ATOP_added */ ++ ++ return ret; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -580,7 +599,7 @@ + static inline int __sock_recvmsg(struct kiocb *iocb, struct socket *sock, + struct msghdr *msg, size_t size, int flags) + { +- int err; ++ int err, ret; + struct sock_iocb *si = kiocb_to_siocb(iocb); + + si->sock = sock; +@@ -593,7 +612,26 @@ + if (err) + return err; + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ ret = sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ ++ if (ret >= 0 && sock->sk) { /* ATOP_added */ ++ switch (sock->sk->sk_family) { /* ATOP_added */ ++ case PF_INET: /* ATOP_added */ ++ case PF_INET6: /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_STREAM) { /* ATOP_added */ ++ current->stat.tcp_rcv++; /* ATOP_added */ ++ current->stat.tcp_rsz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_DGRAM) { /* ATOP_added */ ++ current->stat.udp_rcv++; /* ATOP_added */ ++ current->stat.udp_rsz += size; /* ATOP_added */ ++ } /* ATOP_added */ ++ if (sock->sk->sk_type == SOCK_RAW) /* ATOP_added */ ++ current->stat.raw_rcv++; /* ATOP_added */ ++ } /* ATOP_added */ ++ } /* ATOP_added */ ++ ++ return ret; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, +--- linux-2.6.8-orig/fs/proc/array.c 2004-11-04 07:50:57.000000000 +0100 ++++ linux/fs/proc/array.c 2004-11-09 11:21:23.000000000 +0100 +@@ -406,6 +406,25 @@ + task_cpu(task), + task->rt_priority, + task->policy); ++ ++ res += sprintf(buffer+res, /* ATOP_added */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP_added */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP_added */ ++ task->stat.dsk_rio, /* ATOP_added */ ++ task->stat.dsk_rsz, /* ATOP_added */ ++ task->stat.dsk_wio, /* ATOP_added */ ++ task->stat.dsk_wsz, /* ATOP_added */ ++ task->stat.tcp_snd, /* ATOP_added */ ++ task->stat.tcp_ssz, /* ATOP_added */ ++ task->stat.tcp_rcv, /* ATOP_added */ ++ task->stat.tcp_rsz, /* ATOP_added */ ++ task->stat.udp_snd, /* ATOP_added */ ++ task->stat.udp_ssz, /* ATOP_added */ ++ task->stat.udp_rcv, /* ATOP_added */ ++ task->stat.udp_rsz, /* ATOP_added */ ++ task->stat.raw_snd, /* ATOP_added */ ++ task->stat.raw_rcv); /* ATOP_added */ ++ + if(mm) + mmput(mm); + return res; --- atoppatch-1.23.orig/02patch-2.6.13_atopacct +++ atoppatch-1.23/02patch-2.6.13_atopacct @@ -0,0 +1,122 @@ +--- linux-2.6.13.4-orig/include/linux/acct.h 2005-10-10 20:54:29.000000000 +0200 ++++ linux/include/linux/acct.h 2005-10-28 21:30:44.000000000 +0200 +@@ -96,6 +96,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -139,7 +187,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -153,6 +207,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +--- linux-2.6.13.4-orig/kernel/acct.c 2005-10-10 20:54:29.000000000 +0200 ++++ linux/kernel/acct.c 2005-10-28 21:36:45.000000000 +0200 +@@ -303,7 +303,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -448,6 +448,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP_ADDED */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(current->mm->_rss<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + read_lock(&tasklist_lock); /* pin current->signal */ + ac.ac_tty = current->signal->tty ? --- atoppatch-1.23.orig/02patch-2.6.15_atopacct +++ atoppatch-1.23/02patch-2.6.15_atopacct @@ -0,0 +1,124 @@ +diff -u --recursive linux-2.6.15-orig/include/linux/acct.h linux/include/linux/acct.h +--- linux-2.6.15-orig/include/linux/acct.h 2006-01-03 04:21:10.000000000 +0100 ++++ linux/include/linux/acct.h 2006-09-15 09:52:32.000000000 +0200 +@@ -98,6 +98,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -144,7 +192,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -158,6 +212,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +diff -u --recursive linux-2.6.15-orig/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.15-orig/kernel/acct.c 2006-09-15 09:55:08.000000000 +0200 ++++ linux/kernel/acct.c 2006-09-15 09:52:32.000000000 +0200 +@@ -343,7 +343,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -488,6 +488,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(get_mm_rss(current->mm)<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + read_lock(&tasklist_lock); /* pin current->signal */ + ac.ac_tty = current->signal->tty ? --- atoppatch-1.23.orig/02patch-2.6.16_atopacct +++ atoppatch-1.23/02patch-2.6.16_atopacct @@ -0,0 +1,124 @@ +diff -u --recursive linux-2.6.16.1-orig/include/linux/acct.h linux/include/linux/acct.h +--- linux-2.6.16.1-orig/include/linux/acct.h 2006-04-05 11:25:08.000000000 +0200 ++++ linux/include/linux/acct.h 2006-04-06 12:35:25.000000000 +0200 +@@ -98,6 +98,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -144,7 +192,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -158,6 +212,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +diff -u --recursive linux-2.6.16.1-orig/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.16.1-orig/kernel/acct.c 2006-04-06 13:14:01.000000000 +0200 ++++ linux/kernel/acct.c 2006-04-06 12:40:46.000000000 +0200 +@@ -344,7 +344,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -490,6 +490,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(get_mm_rss(current->mm)<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + read_lock(&tasklist_lock); /* pin current->signal */ + ac.ac_tty = current->signal->tty ? --- atoppatch-1.23.orig/02patch-2.6.17_atopacct +++ atoppatch-1.23/02patch-2.6.17_atopacct @@ -0,0 +1,122 @@ +--- linux-2.6.17.1-orig/include/linux/acct.h 2006-06-20 11:31:55.000000000 +0200 ++++ linux/include/linux/acct.h 2006-06-22 13:04:45.930200000 +0200 +@@ -98,6 +98,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -144,7 +192,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -158,6 +212,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +--- linux-2.6.17.1-orig/kernel/acct.c 2006-06-20 11:31:55.000000000 +0200 ++++ linux/kernel/acct.c 2006-06-22 13:04:45.930200000 +0200 +@@ -344,7 +344,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -490,6 +490,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(get_mm_rss(current->mm)<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + read_lock(&tasklist_lock); /* pin current->signal */ + ac.ac_tty = current->signal->tty ? --- atoppatch-1.23.orig/02patch-2.6.18_atopacct +++ atoppatch-1.23/02patch-2.6.18_atopacct @@ -0,0 +1,122 @@ +--- linux-2.6.18-orig/include/linux/acct.h 2006-09-20 05:42:06.000000000 +0200 ++++ linux/include/linux/acct.h 2006-09-26 17:07:33.085417000 +0200 +@@ -97,6 +97,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -146,7 +194,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -160,6 +214,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +--- linux-2.6.18-orig/kernel/acct.c 2006-09-20 05:42:06.000000000 +0200 ++++ linux/kernel/acct.c 2006-09-26 17:07:33.085417000 +0200 +@@ -343,7 +343,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -482,6 +482,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(get_mm_rss(current->mm)<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + read_lock(&tasklist_lock); /* pin current->signal */ + ac.ac_tty = current->signal->tty ? --- atoppatch-1.23.orig/02patch-2.6.20_atopacct +++ atoppatch-1.23/02patch-2.6.20_atopacct @@ -0,0 +1,124 @@ +diff -u --recursive linux-2.6.20.4/include/linux/acct.h linux/include/linux/acct.h +--- linux-2.6.20.4/include/linux/acct.h 2007-03-23 20:52:51.000000000 +0100 ++++ linux/include/linux/acct.h 2007-03-27 10:12:54.000000000 +0200 +@@ -97,6 +97,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -143,7 +191,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -157,6 +211,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +diff -u --recursive linux-2.6.20.4/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.20.4/kernel/acct.c 2007-03-27 13:30:52.000000000 +0200 ++++ linux/kernel/acct.c 2007-03-27 10:12:54.000000000 +0200 +@@ -344,7 +344,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -484,6 +484,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(get_mm_rss(current->mm)<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + spin_lock_irq(¤t->sighand->siglock); + tty = current->signal->tty; --- atoppatch-1.23.orig/02patch-2.6.8_atopacct +++ atoppatch-1.23/02patch-2.6.8_atopacct @@ -0,0 +1,134 @@ +diff -u --recursive linux-2.6.8-cnt/include/linux/acct.h linux/include/linux/acct.h +--- linux-2.6.8-cnt/include/linux/acct.h 2004-08-14 07:36:32.000000000 +0200 ++++ linux/include/linux/acct.h 2004-11-26 08:08:50.000000000 +0100 +@@ -96,6 +96,52 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ + /* + * accounting flags + */ +@@ -135,7 +181,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ ++#define CONFIG_PROCESS_ACCT_ATOP + ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -149,10 +201,12 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 + #define AHZ (HZ) ++ + #endif /* __KERNEL */ + + #ifdef __KERNEL__ +diff -u --recursive linux-2.6.8-cnt/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.8-cnt/kernel/acct.c 2004-11-04 11:04:38.000000000 +0100 ++++ linux/kernel/acct.c 2004-11-26 08:12:27.000000000 +0100 +@@ -42,7 +42,6 @@ + * ->mmap_sem to walk the vma list of current->mm. Nasty, since it leaks + * a struct file opened for write. Fixed. 2/6/2000, AV. + */ +- + #include + #include + #include +@@ -302,7 +301,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -435,6 +434,30 @@ + ac.ac_pid = current->pid; + ac.ac_ppid = current->parent->pid; + #endif ++#if ACCT_VERSION==6 /* ATOP_ADDED */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(current->mm->rss<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + read_lock(&tasklist_lock); /* pin current->signal */ + ac.ac_tty = current->signal->tty ? --- atoppatch-1.23.orig/01patch-2.6.21_atopcnt +++ atoppatch-1.23/01patch-2.6.21_atopcnt @@ -0,0 +1,168 @@ +diff -u --recursive linux-2.6.20.4/block/ll_rw_blk.c linux/block/ll_rw_blk.c +--- linux-2.6.20.4/block/ll_rw_blk.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/block/ll_rw_blk.c 2007-03-27 08:05:22.000000000 +0200 +@@ -2674,6 +2674,17 @@ + disk_round_stats(rq->rq_disk); + rq->rq_disk->in_flight++; + } ++ ++ switch (rw) { /* ATOP */ ++ case READ: /* ATOP */ ++ current->group_leader->stat.dsk_rio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_rsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ case WRITE: /* ATOP */ ++ current->group_leader->stat.dsk_wio += new_io; /* ATOP */ ++ current->group_leader->stat.dsk_wsz += nr_sectors; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ + } + + /* +diff -u --recursive linux-2.6.20.4/fs/proc/array.c linux/fs/proc/array.c +--- linux-2.6.20.4/fs/proc/array.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/fs/proc/array.c 2007-03-27 08:05:22.000000000 +0200 +@@ -458,6 +458,25 @@ + task->rt_priority, + task->policy, + (unsigned long long)delayacct_blkio_ticks(task)); ++ ++ res += sprintf(buffer+res, /* ATOP */ ++ "%lu %llu %lu %llu %lu %llu %lu " /* ATOP */ ++ "%llu %lu %llu %lu %llu %lu %lu\n", /* ATOP */ ++ task->stat.dsk_rio, /* ATOP */ ++ task->stat.dsk_rsz, /* ATOP */ ++ task->stat.dsk_wio, /* ATOP */ ++ task->stat.dsk_wsz, /* ATOP */ ++ task->stat.tcp_snd, /* ATOP */ ++ task->stat.tcp_ssz, /* ATOP */ ++ task->stat.tcp_rcv, /* ATOP */ ++ task->stat.tcp_rsz, /* ATOP */ ++ task->stat.udp_snd, /* ATOP */ ++ task->stat.udp_ssz, /* ATOP */ ++ task->stat.udp_rcv, /* ATOP */ ++ task->stat.udp_rsz, /* ATOP */ ++ task->stat.raw_snd, /* ATOP */ ++ task->stat.raw_rcv); /* ATOP */ ++ + if(mm) + mmput(mm); + return res; +diff -u --recursive linux-2.6.20.4/include/linux/sched.h linux/include/linux/sched.h +--- linux-2.6.20.4/include/linux/sched.h 2007-03-23 20:52:51.000000000 +0100 ++++ linux/include/linux/sched.h 2007-03-27 08:05:22.000000000 +0200 +@@ -1042,6 +1042,16 @@ + atomic_t fs_excl; /* holding fs exclusive resources */ + struct rcu_head rcu; + ++ struct { /* ATOP */ ++ unsigned long dsk_rio, dsk_wio; /* ATOP */ ++ unsigned long long dsk_rsz, dsk_wsz; /* ATOP */ ++ unsigned long tcp_snd, tcp_rcv; /* ATOP */ ++ unsigned long long tcp_ssz, tcp_rsz; /* ATOP */ ++ unsigned long udp_snd, udp_rcv; /* ATOP */ ++ unsigned long long udp_ssz, udp_rsz; /* ATOP */ ++ unsigned long raw_snd, raw_rcv; /* ATOP */ ++ } stat; /* ATOP */ ++ + /* + * cache last used pipe for splice + */ +diff -u --recursive linux-2.6.20.4/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.20.4/kernel/acct.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/kernel/acct.c 2007-03-27 08:05:22.000000000 +0200 +@@ -497,7 +497,7 @@ + ac.ac_exitcode = pacct->ac_exitcode; + spin_unlock_irq(¤t->sighand->siglock); + ac.ac_io = encode_comp_t(0 /* current->io_usage */); /* %% */ +- ac.ac_rw = encode_comp_t(ac.ac_io / 1024); ++ ac.ac_rw = encode_comp_t(current->stat.dsk_rio + current->stat.dsk_wio); /* ATOP */ + ac.ac_swaps = encode_comp_t(0); + + /* +diff -u --recursive linux-2.6.20.4/kernel/fork.c linux/kernel/fork.c +--- linux-2.6.20.4/kernel/fork.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/kernel/fork.c 2007-03-27 08:05:22.000000000 +0200 +@@ -532,6 +532,14 @@ + tsk->min_flt = tsk->maj_flt = 0; + tsk->nvcsw = tsk->nivcsw = 0; + ++ tsk->stat.dsk_rio = tsk->stat.dsk_wio = 0; /* ATOP */ ++ tsk->stat.dsk_rsz = tsk->stat.dsk_wsz = 0; /* ATOP */ ++ tsk->stat.tcp_snd = tsk->stat.tcp_rcv = 0; /* ATOP */ ++ tsk->stat.tcp_ssz = tsk->stat.tcp_rsz = 0; /* ATOP */ ++ tsk->stat.udp_snd = tsk->stat.udp_rcv = 0; /* ATOP */ ++ tsk->stat.udp_ssz = tsk->stat.udp_rsz = 0; /* ATOP */ ++ tsk->stat.raw_snd = tsk->stat.raw_rcv = 0; /* ATOP */ ++ + tsk->mm = NULL; + tsk->active_mm = NULL; + +diff -u --recursive linux-2.6.20.4/net/socket.c linux/net/socket.c +--- linux-2.6.20.4/net/socket.c 2007-03-23 20:52:51.000000000 +0100 ++++ linux/net/socket.c 2007-03-27 08:05:22.000000000 +0200 +@@ -547,10 +560,28 @@ + si->size = size; + + err = security_socket_sendmsg(sock, msg, size); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->sendmsg(iocb, sock, msg, size); + +- return sock->ops->sendmsg(iocb, sock, msg, size); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_snd++; /* ATOP */ ++ current->group_leader->stat.tcp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_snd++; /* ATOP */ ++ current->group_leader->stat.udp_ssz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_snd++; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) +@@ -598,10 +629,29 @@ + si->flags = flags; + + err = security_socket_recvmsg(sock, msg, size, flags); +- if (err) +- return err; ++ if (!err) ++ err = sock->ops->recvmsg(iocb, sock, msg, size, flags); + +- return sock->ops->recvmsg(iocb, sock, msg, size, flags); ++ if (err >= 0 && sock->sk) { /* ATOP */ ++ switch (sock->sk->sk_family) { /* ATOP */ ++ case PF_INET: /* ATOP */ ++ case PF_INET6: /* ATOP */ ++ switch (sock->sk->sk_type) { /* ATOP */ ++ case SOCK_STREAM: /* ATOP */ ++ current->group_leader->stat.tcp_rcv++; /* ATOP */ ++ current->group_leader->stat.tcp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_DGRAM: /* ATOP */ ++ current->group_leader->stat.udp_rcv++; /* ATOP */ ++ current->group_leader->stat.udp_rsz+=size;/* ATOP */ ++ break; /* ATOP */ ++ case SOCK_RAW: /* ATOP */ ++ current->group_leader->stat.raw_rcv++; /* ATOP */ ++ break; /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ } /* ATOP */ ++ return err; + } + + int sock_recvmsg(struct socket *sock, struct msghdr *msg, --- atoppatch-1.23.orig/02patch-2.6.21_atopacct +++ atoppatch-1.23/02patch-2.6.21_atopacct @@ -0,0 +1,124 @@ +diff -u --recursive linux-2.6.20.4/include/linux/acct.h linux/include/linux/acct.h +--- linux-2.6.20.4/include/linux/acct.h 2007-03-23 20:52:51.000000000 +0100 ++++ linux/include/linux/acct.h 2007-03-27 10:12:54.000000000 +0200 +@@ -97,6 +97,54 @@ + char ac_comm[ACCT_COMM]; /* Command Name */ + }; + ++struct acct_atop ++{ ++ char ac_flag; /* Flags */ ++ char ac_version; /* Always set to ACCT_VERSION */ ++ __u32 ac_pid; /* Process ID */ ++ __u32 ac_ppid; /* Parent Process ID */ ++ __u16 ac_uid16; /* LSB of Real User ID */ ++ __u16 ac_gid16; /* LSB of Real Group ID */ ++ __u16 ac_tty; /* Control Terminal */ ++ __u32 ac_btime; /* Process Creation Time */ ++ comp_t ac_utime; /* User Time */ ++ comp_t ac_stime; /* System Time */ ++ comp_t ac_etime; /* Elapsed Time */ ++ comp_t ac_mem; /* Virtual Memory */ ++ comp_t ac_rss; /* Resident Memory */ ++ comp_t ac_io; /* Chars Transferred */ ++ comp_t ac_rw; /* Blocks Read or Written */ ++ comp_t ac_bread; /* Blocks Read */ ++ comp_t ac_bwrite; /* Blocks Written */ ++ comp2_t ac_dskrsz; /* Cum. blocks read */ ++ comp2_t ac_dskwsz; /* Cum. blocks written */ ++ comp_t ac_tcpsnd; /* TCP send requests */ ++ comp_t ac_tcprcv; /* TCP recv requests */ ++ comp2_t ac_tcpssz; /* TCP cum. length */ ++ comp2_t ac_tcprsz; /* TCP cum. length */ ++ comp_t ac_udpsnd; /* UDP send requests */ ++ comp_t ac_udprcv; /* UDP recv requests */ ++ comp2_t ac_udpssz; /* UDP cum. length */ ++ comp2_t ac_udprsz; /* UDP cum. length */ ++ comp_t ac_rawsnd; /* RAW send requests */ ++ comp_t ac_rawrcv; /* RAW recv requests */ ++ comp_t ac_minflt; /* Minor Pagefaults */ ++ comp_t ac_majflt; /* Major Pagefaults */ ++ comp_t ac_swaps; /* Number of Swaps */ ++/* m68k had no padding here. */ ++#if !defined(CONFIG_M68K) || !defined(__KERNEL__) ++ __u16 ac_ahz; /* AHZ */ ++#endif ++ __u32 ac_exitcode; /* Exitcode */ ++ char ac_comm[ACCT_COMM + 1]; /* Command Name */ ++ __u8 ac_etime_hi; /* Elapsed Time MSB */ ++ __u16 ac_etime_lo; /* Elapsed Time LSB */ ++ __u32 ac_uid; /* Real User ID */ ++ __u32 ac_gid; /* Real Group ID */ ++}; ++ ++ ++ + /* + * accounting flags + */ +@@ -143,7 +191,13 @@ + * 5: new binary incompatible format (128 bytes, second half) + * + */ +- ++#define CONFIG_PROCESS_ACCT_ATOP ++ ++#ifdef CONFIG_PROCESS_ACCT_ATOP ++#define ACCT_VERSION 6 ++#define AHZ (USER_HZ) ++typedef struct acct_atop acct_t; ++#else + #ifdef CONFIG_BSD_PROCESS_ACCT_V3 + #define ACCT_VERSION 3 + #define AHZ 100 +@@ -157,6 +211,7 @@ + #define AHZ (USER_HZ) + typedef struct acct acct_t; + #endif ++#endif + + #else + #define ACCT_VERSION 2 +diff -u --recursive linux-2.6.20.4/kernel/acct.c linux/kernel/acct.c +--- linux-2.6.20.4/kernel/acct.c 2007-03-27 13:30:52.000000000 +0200 ++++ linux/kernel/acct.c 2007-03-27 10:12:54.000000000 +0200 +@@ -344,7 +344,7 @@ + return exp; + } + +-#if ACCT_VERSION==1 || ACCT_VERSION==2 ++#if ACCT_VERSION==1 || ACCT_VERSION==2 || ACCT_VERSION==6 + /* + * encode an u64 into a comp2_t (24 bits) + * +@@ -484,6 +484,30 @@ + ac.ac_pid = current->tgid; + ac.ac_ppid = current->parent->tgid; + #endif ++#if ACCT_VERSION==6 /* ATOP */ ++ ac.ac_pid = current->pid; ++ ac.ac_ppid = current->parent->pid; ++ ac.ac_uid16 = current->uid; ++ ac.ac_gid16 = current->gid; ++ ac.ac_ahz = AHZ; ++ ac.ac_bread = encode_comp_t(current->stat.dsk_rio); ++ ac.ac_bwrite = encode_comp_t(current->stat.dsk_wio); ++ ac.ac_dskrsz = encode_comp2_t(current->stat.dsk_rsz); ++ ac.ac_dskwsz = encode_comp2_t(current->stat.dsk_wsz); ++ ac.ac_tcpsnd = encode_comp_t(current->stat.tcp_snd); ++ ac.ac_tcprcv = encode_comp_t(current->stat.tcp_rcv); ++ ac.ac_tcpssz = encode_comp2_t(current->stat.tcp_ssz); ++ ac.ac_tcprsz = encode_comp2_t(current->stat.tcp_rsz); ++ ac.ac_udpsnd = encode_comp_t(current->stat.udp_snd); ++ ac.ac_udprcv = encode_comp_t(current->stat.udp_rcv); ++ ac.ac_udpssz = encode_comp2_t(current->stat.udp_ssz); ++ ac.ac_udprsz = encode_comp2_t(current->stat.udp_rsz); ++ ac.ac_rawsnd = encode_comp_t(current->stat.raw_snd); ++ ac.ac_rawrcv = encode_comp_t(current->stat.raw_rcv); ++ ac.ac_rss = current->mm ? ++ encode_comp_t(get_mm_rss(current->mm)<<(PAGE_SHIFT-10)) : ++ encode_comp_t(0); ++#endif + + spin_lock_irq(¤t->sighand->siglock); + tty = current->signal->tty;