Skip to contentSkip to conversation

NFS: account direct-io into task io accounting

PATCH Superseded Konstantin Khlebnikov 3 participants 4 messages Feb 21, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 NFS: account direct-io into task io accounting

Account complete NFS direct-io reads and writes into Task I/O Accounting.

NFS have unusual direct-io implementation,
thus accounting in generic code does not work.

---
 fs/nfs/direct.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
fs/nfs/direct.c +7 -2
index 9943a75..bab4185 100644
@@ -45,6 +45,7 @@
 #include <linux/pagemap.h>
 #include <linux/kref.h>
 #include <linux/slab.h>
+#include <linux/task_io_accounting_ops.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_page.h>
@@ -939,8 +940,10 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
 		goto out;
 
 	retval = nfs_direct_read(iocb, iov, nr_segs, pos);
-	if (retval > 0)
+	if (retval > 0) {
 		iocb->ki_pos = pos + retval;
+		task_io_account_read(retval);
+	}
 
 out:
 	return retval;
@@ -1001,8 +1004,10 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
 
 	retval = nfs_direct_write(iocb, iov, nr_segs, pos, count);
 
-	if (retval > 0)
+	if (retval > 0) {
 		iocb->ki_pos = pos + retval;
+		task_io_account_write(retval);
+	}
 
 out:
 	return retval;
#1 lore raw
Quoted 35 lines · Konstantin Khlebnikov

Account complete NFS direct-io reads and writes into Task I/O Accounting.

NFS have unusual direct-io implementation,
thus accounting in generic code does not work.

---
fs/nfs/direct.c | 9 +++++++--

1 files changed, 7 insertions(+), 2 deletions(-)
fs/nfs/direct.c +4 -1
index 9943a75..bab4185 100644
@@ -45,6 +45,7 @@
 #include <linux/pagemap.h>
 #include <linux/kref.h>
 #include <linux/slab.h>
+#include <linux/task_io_accounting_ops.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_page.h>
@@ -939,8 +940,10 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
 		goto out;
 
 	retval = nfs_direct_read(iocb, iov, nr_segs, pos);
-	if (retval > 0)
+	if (retval > 0) {
 		iocb->ki_pos = pos + retval;
+		task_io_account_read(retval);
+	}
 

out:

	return retval;

fs/nfs/direct.c ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov, · line 1010

Quoted 8 lines
fs/nfs/direct.c +3 -1
@@ -1001,8 +1004,10 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
 
 	retval = nfs_direct_write(iocb, iov, nr_segs, pos, count);
 
-	if (retval > 0)
+	if (retval > 0) {
 		iocb->ki_pos = pos + retval;
+		task_io_account_write(retval);
+	}

The async path always returns -EIOCBQUEUED. How are those bytes accounted for?

Quoted 3 lines

out:

	return retval;

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com

#2 lore raw
Quoted 41 lines · Chuck Lever
Quoted 38 lines · Konstantin Khlebnikov

Account complete NFS direct-io reads and writes into Task I/O Accounting.

NFS have unusual direct-io implementation,
thus accounting in generic code does not work.

---
fs/nfs/direct.c | 9 +++++++--

1 files changed, 7 insertions(+), 2 deletions(-)
fs/nfs/direct.c +4 -1
index 9943a75..bab4185 100644
@@ -45,6 +45,7 @@
 #include<linux/pagemap.h>
 #include<linux/kref.h>
 #include<linux/slab.h>
+#include<linux/task_io_accounting_ops.h>
 
 #include<linux/nfs_fs.h>
 #include<linux/nfs_page.h>
@@ -939,8 +940,10 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
 		goto out;
 
 	retval = nfs_direct_read(iocb, iov, nr_segs, pos);
-	if (retval>  0)
+	if (retval>  0) {
 		iocb->ki_pos = pos + retval;
+		task_io_account_read(retval);
+	}
 

out:

	return retval;
fs/nfs/direct.c +0 -0
@@ -1001,8 +1004,10 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
 
 	retval = nfs_direct_write(iocb, iov, nr_segs, pos, count);
 
Quoted 8 lines

fs/nfs/direct.c ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov, · line 1010

Quoted 5 lines
fs/nfs/direct.c +3 -1
-	if (retval>  0)
+	if (retval>  0) {
 		iocb->ki_pos = pos + retval;
+		task_io_account_write(retval);
+	}

The async path always returns -EIOCBQUEUED. How are those bytes accounted for?

Oh, thanks. I forget about aio.
So, there only one option -- always account whole requiest before completion.

Quoted 10 lines
Quoted 3 lines

out:

	return retval;

--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com

#3 lore raw

PATCH v2 1/1 NFS: account direct-io into task io accounting

In reply to Konstantin Khlebnikov

Account NFS direct-io reads and writes into Task I/O Accounting. Do it before complition to handle aio.

NFS have unusual direct-io implementation,
thus accounting in generic code does not work.

---
 fs/nfs/direct.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
fs/nfs/direct.c +5 -0
index 9943a75..bd2cb5d 100644
@@ -45,6 +45,7 @@
 #include <linux/pagemap.h>
 #include <linux/kref.h>
 #include <linux/slab.h>
+#include <linux/task_io_accounting_ops.h>
 
 #include <linux/nfs_fs.h>
 #include <linux/nfs_page.h>
@@ -938,6 +939,8 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
 	if (retval)
 		goto out;
 
+	task_io_account_read(count);
+
 	retval = nfs_direct_read(iocb, iov, nr_segs, pos);
 	if (retval > 0)
 		iocb->ki_pos = pos + retval;
@@ -999,6 +1002,8 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
 	if (retval)
 		goto out;
 
+	task_io_account_write(count);
+
 	retval = nfs_direct_write(iocb, iov, nr_segs, pos, count);
 
 	if (retval > 0)