Whamcloud - gitweb
LU-618 llite: IO accounting of page read 36/1636/11
authorHongchao Zhang <hongchao.zhang@intel.com>
Thu, 30 Nov 2017 10:10:52 +0000 (18:10 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 17 Dec 2017 06:19:06 +0000 (06:19 +0000)
When CONFIG_TASK_IO_ACCOUNTING is used with Lustre, writes are
accounted for but not read.

The accounting is normally done in the kernel for page writeback
and readahead functionlity, Therefore, as Lustre implements its
own readahead, it must also maintain its own accounting on read
(but not for write)

Change-Id: I19f330be65324a8da002f9d61cb9262345ecb012
Signed-off-by: Hongchao Zhang <hongchao.zhang@intel.com>
Reviewed-on: https://review.whamcloud.com/1636
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
lustre/llite/rw.c
lustre/tests/sanity.sh

index 69b6208..b493fa4 100644 (file)
@@ -50,6 +50,7 @@
 #include <linux/pagemap.h>
 /* current_is_kswapd() */
 #include <linux/swap.h>
+#include <linux/task_io_accounting_ops.h>
 
 #define DEBUG_SUBSYSTEM S_LLITE
 
@@ -1129,8 +1130,12 @@ static int ll_io_read_page(const struct lu_env *env, struct cl_io *io,
                       PFID(ll_inode2fid(inode)), rc2, vvp_index(vpg));
        }
 
-       if (queue->c2_qin.pl_nr > 0)
+       if (queue->c2_qin.pl_nr > 0) {
+               int count = queue->c2_qin.pl_nr;
                rc = cl_io_submit_rw(env, io, CRT_READ, queue);
+               if (rc == 0)
+                       task_io_account_read(PAGE_SIZE * count);
+       }
 
        if (anchor != NULL && !cl_page_is_owned(page, io)) { /* have sent */
                rc = cl_sync_io_wait(env, anchor, 0);
index 46f9e8c..91167df 100755 (executable)
@@ -16701,6 +16701,24 @@ test_314() {
 }
 run_test 314 "OSP shouldn't fail after last_rcvd update failure"
 
+test_315() { # LU-618
+       local file=$DIR/$tfile
+       rm -f $file
+
+       $MULTIOP $file oO_CREAT:O_DIRECT:O_RDWR:w4096000c
+       $MULTIOP $file oO_RDONLY:r4096000_c &
+       PID=$!
+
+       sleep 2
+
+       local rbytes=$(awk '/read_bytes/ { print $2 }' /proc/$PID/io)
+       kill -USR1 $PID
+
+       [ $rbytes -gt 4000000 ] || error "read is not accounted ($rbytes)"
+       rm -f $file
+}
+run_test 315 "read should be accounted"
+
 test_fake_rw() {
        local read_write=$1
        if [ "$read_write" = "write" ]; then