From 48de9b195d71cb57ee50636d75c59d78ee068cee Mon Sep 17 00:00:00 2001 From: Hongchao Zhang Date: Thu, 30 Nov 2017 18:10:52 +0800 Subject: [PATCH] LU-618 llite: IO accounting of page read 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 Reviewed-on: https://review.whamcloud.com/1636 Reviewed-by: Fan Yong Reviewed-by: Andreas Dilger Tested-by: Jenkins Tested-by: Maloo --- lustre/llite/rw.c | 7 ++++++- lustre/tests/sanity.sh | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index 69b6208..b493fa4 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -50,6 +50,7 @@ #include /* current_is_kswapd() */ #include +#include #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); diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 46f9e8c..91167df 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -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 -- 1.8.3.1