All of lore.kernel.org
 help / color / mirror / Atom feed
From: Zhao Gongyi <zhaogongyi@huawei.com>
To: <linux-kselftest@vger.kernel.org>, <linux-kernel@vger.kernel.org>
Cc: <keescook@chromium.org>, <luto@amacapital.net>,
	<wad@chromium.org>, <shuah@kernel.org>, <zhaogongyi@huawei.com>,
	<cristian.marussi@arm.com>
Subject: [PATCH -next 2/2] selftests/mincore: Optimize TEST(check_file_mmap) accoring to filemap read around
Date: Fri, 21 Oct 2022 15:10:52 +0800	[thread overview]
Message-ID: <20221021071052.143393-2-zhaogongyi@huawei.com> (raw)
In-Reply-To: <20221021071052.143393-1-zhaogongyi@huawei.com>

TEST(check_file_mmap) will fail when we set the ra_pages through
blockdev like:
  /sbin/blockdev --setra 8196 /dev/sda

And, for file mmap, kernel will read 'ra_pages/2' pages of the address
on the left hand or right hand. So, add a checking of ra_pages according
to the ra_pages setting of the block dev.

I have tested it on my system like:
  i=0
  while [ $i -lt 9000 ]
  do
        /sbin/blockdev --setra $i /dev/openeuler/*
        ./mincore_selftest  || { echo "$i test failed"; exit 1; }
        let i=$i+1
  done

Signed-off-by: Zhao Gongyi <zhaogongyi@huawei.com>
---
 tools/testing/selftests/kselftest_harness.h   |  2 +
 .../selftests/mincore/mincore_selftest.c      | 74 +++++++++++++++----
 2 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/kselftest_harness.h b/tools/testing/selftests/kselftest_harness.h
index 25f4d54067c0..fa40c85a1099 100644
--- a/tools/testing/selftests/kselftest_harness.h
+++ b/tools/testing/selftests/kselftest_harness.h
@@ -781,6 +781,8 @@
 	} \
 }

+#define MIN(a, b)       ((a) < (b) ? (a) : (b))
+
 struct __test_results {
 	char reason[1024];	/* Reason for test result */
 };
diff --git a/tools/testing/selftests/mincore/mincore_selftest.c b/tools/testing/selftests/mincore/mincore_selftest.c
index 287351a599a2..5eace1750fef 100644
--- a/tools/testing/selftests/mincore/mincore_selftest.c
+++ b/tools/testing/selftests/mincore/mincore_selftest.c
@@ -17,6 +17,7 @@
 #include <mntent.h>
 #include <sys/stat.h>
 #include <linux/fs.h>
+#include <sys/ioctl.h>

 #include "../kselftest.h"
 #include "../kselftest_harness.h"
@@ -218,11 +219,7 @@ static struct mntent* find_mount_point(const char *name)
  * Test mincore() behavior on a file-backed page.
  * No pages should be loaded into memory right after the mapping. Then,
  * accessing any address in the mapping range should load the page
- * containing the address and a number of subsequent pages (readahead).
- *
- * The actual readahead settings depend on the test environment, so we
- * can't make a lot of assumptions about that. This test covers the most
- * general cases.
+ * containing the address and a number of around pages (read around).
  */
 TEST(check_file_mmap)
 {
@@ -236,6 +233,10 @@ TEST(check_file_mmap)
 	int ra_pages = 0;
 	struct stat s;
 	struct mntent *mount_entry;
+	int ra_size;
+	int exp_ra_pages;
+	int odd = 0;
+	int dev_ra_pages;

 	mount_entry = find_mount_point(".");
 	ASSERT_NE(NULL, mount_entry) {
@@ -248,11 +249,29 @@ TEST(check_file_mmap)
 			"test is not supported");
 	}

+	errno = 0;
+	fd = open(mount_entry->mnt_fsname, O_RDONLY);
+	ASSERT_LT(0, fd) {
+		TH_LOG("Open %s failed: %s",
+			mount_entry->mnt_fsname, strerror(errno));
+	}
+
+	errno = 0;
+	retval = ioctl(fd, BLKRAGET, &ra_size);
+	ASSERT_EQ(0, retval) {
+		TH_LOG("Get block readahead size failed: %s", strerror(errno));
+	}
+
 	page_size = sysconf(_SC_PAGESIZE);
 	vec_size = FILE_SIZE / page_size;
 	if (FILE_SIZE % page_size)
 		vec_size++;

+	dev_ra_pages = (ra_size * 512) / page_size;
+	exp_ra_pages = MIN(vec_size / 2, dev_ra_pages / 2);
+	if (dev_ra_pages <= vec_size)
+		odd = dev_ra_pages % 2;
+
 	vec = calloc(vec_size, sizeof(unsigned char));
 	ASSERT_NE(NULL, vec) {
 		TH_LOG("Can't allocate array");
@@ -296,7 +315,7 @@ TEST(check_file_mmap)

 	/*
 	 * Touch a page in the middle of the mapping. We expect the next
-	 * few pages (the readahead window) to be populated too.
+	 * few pages (the read around window) to be populated too.
 	 */
 	addr[FILE_SIZE / 2] = 1;
 	retval = mincore(addr, FILE_SIZE, vec);
@@ -310,22 +329,49 @@ TEST(check_file_mmap)
 		ra_pages++;
 		i++;
 	}
-	EXPECT_GT(ra_pages, 0) {
-		TH_LOG("No read-ahead pages found in memory");
-	}

-	EXPECT_LT(i, vec_size) {
-		TH_LOG("Read-ahead pages reached the end of the file");
+	if (!exp_ra_pages) {
+		EXPECT_EQ(ra_pages, exp_ra_pages) {
+			TH_LOG("Check read-around pages failed");
+		}
+	} else {
+		EXPECT_EQ(ra_pages + (odd ? 0 : 1), exp_ra_pages) {
+			TH_LOG("Check read-around pages failed");
+		}
 	}
+
 	/*
-	 * End of the readahead window. The rest of the pages shouldn't
-	 * be in memory.
+	 * End of the read around window. The rest of the pages shouldn't
+	 * be in memory for the right hand.
 	 */
 	if (i < vec_size) {
 		while (i < vec_size && !vec[i])
 			i++;
 		EXPECT_EQ(vec_size, i) {
-			TH_LOG("Unexpected page in memory beyond readahead window");
+			TH_LOG("Unexpected page in memory beyond read around window");
+		}
+	}
+
+	i = FILE_SIZE / 2 / page_size - 1;
+	ra_pages = 0;
+	while (i >= 0 && vec[i]) {
+		ra_pages++;
+		i--;
+	}
+
+	EXPECT_EQ(ra_pages, exp_ra_pages) {
+		TH_LOG("Check read-around pages failed");
+	}
+
+	/*
+	 * End of the read around window. The rest of the pages shouldn't
+	 * be in memory for the left hand.
+	 */
+	if (i >= 0) {
+		while (i >= 0 && !vec[i])
+			i--;
+		EXPECT_EQ(-1, i) {
+			TH_LOG("Unexpected page in memory beyond read around window");
 		}
 	}

--
2.17.1


  reply	other threads:[~2022-10-21  7:14 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-21  7:10 [PATCH -next 1/2] selftests/mincore: Add checking of block dev for TEST(check_file_mmap) Zhao Gongyi
2022-10-21  7:10 ` Zhao Gongyi [this message]
2022-10-31  7:22 [PATCH -next 2/2] selftests/mincore: Optimize TEST(check_file_mmap) accoring to filemap read around zhaogongyi
2022-10-31 10:27 ` Matthew Wilcox
2022-10-31 12:13 zhaogongyi
2022-11-16  9:25 zhaogongyi

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=20221021071052.143393-2-zhaogongyi@huawei.com \
    --to=zhaogongyi@huawei.com \
    --cc=cristian.marussi@arm.com \
    --cc=keescook@chromium.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=shuah@kernel.org \
    --cc=wad@chromium.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.