From: Guillaume Thouvenin <guillaume.thouvenin@bull.net>
To: linux-kernel@vger.kernel.org
Cc: Jay Lan <jlan@engr.sgi.com>
Subject: [patch 2.6.8.1] BSD accounting: update chars transferred value
Date: Wed, 8 Sep 2004 11:06:57 +0200 [thread overview]
Message-ID: <20040908090657.GA9879@frec.bull.fr> (raw)
Hello,
The goal of this patch is to improve BSD accounting by using what
is done in the CSA into BSD accounting. The final goal is to have a
uniform accounting structure.
This patch updates information given by BSD accounting concerning
bytes read and written. A field is already present in the BSD accounting
structure but it is never updated. We don't add information about blocks
read and written because, as it was discussed in previous email, the
information is inaccurate. Most writes which are flushed delayed would
get accounted to pdflushd. Thus, one solution to get this kind of
information is to add counters when the write back is performed. The
problem is that we don't know how to get information about the IID at
the page level (ie from struct page). So we remove this information for
the moment and it will be provided in another patch.
Changelog:
- Adds two counters in the task_struct (rchar, wchar)
- Init fields during the creation of the process (during the fork)
- File I/O operations are done through sys_read(), sys_write(),
sys_readv(), sys_writev() and sys_sendfile(). Thus we increment
counters into those functions except with sys_sendfile(). For the
latter, the incrementation is done in the do_sendfile() because this
routine be directly called from the return of sys_sendfile().
Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@bull.net>
diff -uprN -X dontdiff linux-2.6.8.1-vanilla/fs/read_write.c linux-2.6.8.1-char_IO_acct/fs/read_write.c
--- linux-2.6.8.1-vanilla/fs/read_write.c 2004-08-14 12:55:35.000000000 +0200
+++ linux-2.6.8.1-char_IO_acct/fs/read_write.c 2004-09-08 08:32:29.043438000 +0200
@@ -294,6 +294,9 @@ asmlinkage ssize_t sys_read(unsigned int
fput_light(file, fput_needed);
}
+ if (ret > 0)
+ current->rchar += ret;
+
return ret;
}
EXPORT_SYMBOL_GPL(sys_read);
@@ -312,6 +315,9 @@ asmlinkage ssize_t sys_write(unsigned in
fput_light(file, fput_needed);
}
+ if (ret > 0)
+ current->wchar += ret;
+
return ret;
}
@@ -540,6 +546,9 @@ sys_readv(unsigned long fd, const struct
fput_light(file, fput_needed);
}
+ if (ret > 0)
+ current->rchar += ret;
+
return ret;
}
@@ -558,6 +567,9 @@ sys_writev(unsigned long fd, const struc
fput_light(file, fput_needed);
}
+ if (ret > 0)
+ current->wchar += ret;
+
return ret;
}
@@ -639,6 +651,11 @@ static ssize_t do_sendfile(int out_fd, i
if (*ppos > max)
retval = -EOVERFLOW;
+ if (retval > 0) {
+ current->rchar += retval;
+ current->wchar += retval;
+ }
+
fput_out:
fput_light(out_file, fput_needed_out);
fput_in:
diff -uprN -X dontdiff linux-2.6.8.1-vanilla/include/linux/sched.h linux-2.6.8.1-char_IO_acct/include/linux/sched.h
--- linux-2.6.8.1-vanilla/include/linux/sched.h 2004-08-14 12:54:49.000000000 +0200
+++ linux-2.6.8.1-char_IO_acct/include/linux/sched.h 2004-09-08 08:08:47.565535488 +0200
@@ -523,6 +523,9 @@ struct task_struct {
unsigned long ptrace_message;
siginfo_t *last_siginfo; /* For ptrace use. */
+/* IO counters: bytes read, bytes written */
+ unsigned long rchar, wchar;
+
#ifdef CONFIG_NUMA
struct mempolicy *mempolicy;
short il_next; /* could be shared with used_math */
diff -uprN -X dontdiff linux-2.6.8.1-vanilla/kernel/acct.c linux-2.6.8.1-char_IO_acct/kernel/acct.c
--- linux-2.6.8.1-vanilla/kernel/acct.c 2004-08-14 12:55:33.000000000 +0200
+++ linux-2.6.8.1-char_IO_acct/kernel/acct.c 2004-09-08 08:10:04.758800328 +0200
@@ -464,8 +464,8 @@ static void do_acct_process(long exitcod
}
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_io = encode_comp_t(current->rchar + current->wchar);
+ ac.ac_rw = encode_comp_t(0 /* ac.ac_io / 1024 */); /* %% */
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);
diff -uprN -X dontdiff linux-2.6.8.1-vanilla/kernel/fork.c linux-2.6.8.1-char_IO_acct/kernel/fork.c
--- linux-2.6.8.1-vanilla/kernel/fork.c 2004-08-14 12:54:49.000000000 +0200
+++ linux-2.6.8.1-char_IO_acct/kernel/fork.c 2004-09-08 08:11:24.308706904 +0200
@@ -965,6 +965,7 @@ struct task_struct *copy_process(unsigne
p->security = NULL;
p->io_context = NULL;
p->audit_context = NULL;
+ p->rchar = p->wchar = 0;
#ifdef CONFIG_NUMA
p->mempolicy = mpol_copy(p->mempolicy);
if (IS_ERR(p->mempolicy)) {
next reply other threads:[~2004-09-08 9:08 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-09-08 9:06 Guillaume Thouvenin [this message]
2004-09-08 9:17 ` [patch 2.6.8.1] BSD accounting: update chars transferred value Christoph Hellwig
2004-09-08 11:02 ` Guillaume Thouvenin
-- strict thread matches above, loose matches on Subject: below --
2004-09-08 11:29 Guillaume Thouvenin
2004-09-10 23:10 ` Jay Lan
2004-09-13 6:34 ` Guillaume Thouvenin
2004-09-14 0:00 ` Jay Lan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040908090657.GA9879@frec.bull.fr \
--to=guillaume.thouvenin@bull.net \
--cc=jlan@engr.sgi.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox