NFS: account direct-io into task io accounting
Subsystems (2)
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
@@ -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;
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.Signed-off-by Konstantin Khlebnikov <[email protected]>---
fs/nfs/direct.c| 9 +++++++--1 files changed, 7 insertions(+), 2 deletions(-)fs/nfs/direct.c +4
-1@@ -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
PATCH v2 1/1 NFS: account direct-io into task io accounting
In reply to Konstantin KhlebnikovAccount 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
@@ -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 )
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.Signed-off-by Konstantin Khlebnikov<[email protected]>---
fs/nfs/direct.c| 9 +++++++--1 files changed, 7 insertions(+), 2 deletions(-)fs/nfs/direct.c +4
-1@@ -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