All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [bug report] readahead02: readahead hardcoded bytes limit
@ 2015-12-11 13:53 Lorenzo Pieralisi
  2015-12-11 15:07 ` Roman Gushchin
  2015-12-21 13:21 ` [LTP] [PATCH] syscalls/readahead02: fix error check Roman Gushchin
  0 siblings, 2 replies; 4+ messages in thread
From: Lorenzo Pieralisi @ 2015-12-11 13:53 UTC (permalink / raw)
  To: ltp

Hi,

following kernel commit:

commit 600e19afc5f8a6 ("mm: use only per-device readahead limit")

LTP readahead02 test produces warnings such as:

readahead02    0  TINFO  :  creating test file of size: 67108864#
readahead02 (1698): drop_caches: 1#
readahead02    0  TINFO  :  read_testfile(0)#
readahead02 (1698): drop_caches: 1#
readahead02    0  TINFO  :  read_testfile(1)#
readahead02    1  TPASS  :  expected ret success - returned value = 0#
readahead02    2  TPASS  :  offset is still at 0 as expected#
readahead02    0  TINFO  :  read_testfile(0) took: 125319 usec#
readahead02    0  TINFO  :  read_testfile(1) took: 119364 usec#
readahead02    0  TINFO  :  read_testfile(0) read: 67357696 bytes#
readahead02    0  TINFO  :  read_testfile(1) read: 63098880 bytes#
readahead02    3  TPASS  :  readahead saved some I/O#
readahead02    0  TINFO  :  cache can hold at least: 67372 kB#
readahead02    0  TINFO  :  read_testfile(0) used cache: 65420 kB#
readahead02    0  TINFO  :  read_testfile(1) used cache: 4120 kB#
readahead02    0  TWARN  :  readahead02.c:323: using less cache than expected

It is caused by the hardcoded 2MB readahead02 limit used to issue
the readahead syscall, the kernel now caps the number of pages
using the per-device readahead limit, so the readahead count parameter
should be updated accordingly.

There are multiple ways to fix it, simplest is reading the bdi backing
the testfile and use its readahead limit as readahead syscall count
parameter.

Please consider updating the test.

Thanks,
Lorenzo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [LTP] [bug report] readahead02: readahead hardcoded bytes limit
  2015-12-11 13:53 [LTP] [bug report] readahead02: readahead hardcoded bytes limit Lorenzo Pieralisi
@ 2015-12-11 15:07 ` Roman Gushchin
  2015-12-21 13:21 ` [LTP] [PATCH] syscalls/readahead02: fix error check Roman Gushchin
  1 sibling, 0 replies; 4+ messages in thread
From: Roman Gushchin @ 2015-12-11 15:07 UTC (permalink / raw)
  To: ltp

Hi Lorenzo!

Thank you! I'll prepare a patch during next week.

--
Roman


11.12.2015, 16:52, "Lorenzo Pieralisi" <lorenzo.pieralisi@arm.com>:
> Hi,
>
> following kernel commit:
>
> commit 600e19afc5f8a6 ("mm: use only per-device readahead limit")
>
> LTP readahead02 test produces warnings such as:
>
> readahead02 0 TINFO : creating test file of size: 67108864#
> readahead02 (1698): drop_caches: 1#
> readahead02 0 TINFO : read_testfile(0)#
> readahead02 (1698): drop_caches: 1#
> readahead02 0 TINFO : read_testfile(1)#
> readahead02 1 TPASS : expected ret success - returned value = 0#
> readahead02 2 TPASS : offset is still at 0 as expected#
> readahead02 0 TINFO : read_testfile(0) took: 125319 usec#
> readahead02 0 TINFO : read_testfile(1) took: 119364 usec#
> readahead02 0 TINFO : read_testfile(0) read: 67357696 bytes#
> readahead02 0 TINFO : read_testfile(1) read: 63098880 bytes#
> readahead02 3 TPASS : readahead saved some I/O#
> readahead02 0 TINFO : cache can hold at least: 67372 kB#
> readahead02 0 TINFO : read_testfile(0) used cache: 65420 kB#
> readahead02 0 TINFO : read_testfile(1) used cache: 4120 kB#
> readahead02 0 TWARN : readahead02.c:323: using less cache than expected
>
> It is caused by the hardcoded 2MB readahead02 limit used to issue
> the readahead syscall, the kernel now caps the number of pages
> using the per-device readahead limit, so the readahead count parameter
> should be updated accordingly.
>
> There are multiple ways to fix it, simplest is reading the bdi backing
> the testfile and use its readahead limit as readahead syscall count
> parameter.
>
> Please consider updating the test.
>
> Thanks,
> Lorenzo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [LTP] [PATCH] syscalls/readahead02: fix error check
  2015-12-11 13:53 [LTP] [bug report] readahead02: readahead hardcoded bytes limit Lorenzo Pieralisi
  2015-12-11 15:07 ` Roman Gushchin
@ 2015-12-21 13:21 ` Roman Gushchin
  2016-01-04  9:41   ` Jan Stancek
  1 sibling, 1 reply; 4+ messages in thread
From: Roman Gushchin @ 2015-12-21 13:21 UTC (permalink / raw)
  To: ltp

After commit 600e19afc5f8a6 ("mm: use only per-device readahead limit")
readahead size is not limited anymore by 2 megabytes. Instead,
the per-bdi limit is used.

Signed-off-by: Roman Gushchin <klamm@yandex-team.ru>
---
 testcases/kernel/syscalls/readahead/readahead02.c | 34 +++++++++++++++++++++--
 1 file changed, 31 insertions(+), 3 deletions(-)

diff --git a/testcases/kernel/syscalls/readahead/readahead02.c b/testcases/kernel/syscalls/readahead/readahead02.c
index fe0b8a0..b5a7789 100644
--- a/testcases/kernel/syscalls/readahead/readahead02.c
+++ b/testcases/kernel/syscalls/readahead/readahead02.c
@@ -184,6 +184,30 @@ static void create_testfile(void)
 	free(tmp);
 }
 
+static long get_device_readahead(const char *fname)
+{
+	FILE *f;
+	struct stat st;
+	unsigned long ra_kb = 0;
+	char buf[256];
+
+	if (stat(fname, &st) == -1)
+		return -1;
+	snprintf(buf, sizeof(buf), "/sys/dev/block/%d:%d/queue/read_ahead_kb",
+		 major(st.st_dev), minor(st.st_dev));
+	f = fopen(buf, "r");
+	if (!f)
+		return -1;
+
+	if (fscanf(f, "%lu", &ra_kb) != 1) {
+		fclose(f);
+		return -1;
+	}
+
+	fclose(f);
+	return ra_kb * 1024;
+}
+
 /* read_testfile - mmap testfile and read every page.
  * This functions measures how many I/O and time it takes to fully
  * read contents of test file.
@@ -206,16 +230,20 @@ static void read_testfile(int do_readahead, const char *fname, size_t fsize,
 	unsigned long time_start_usec, time_end_usec;
 	off_t offset;
 	struct timeval now;
+	long readahead_size;
+
+	readahead_size = get_device_readahead(fname);
+	if (readahead_size == -1)
+		tst_brkm(TBROK, cleanup, "Failed to get readahead size");
 
 	fd = open(fname, O_RDONLY);
 	if (fd < 0)
 		tst_brkm(TBROK | TERRNO, cleanup, "Failed to open %s", fname);
 
 	if (do_readahead) {
-		/* read ahead in chunks, 2MB is maximum since 3.15-rc1 */
-		for (i = 0; i < fsize; i += 2*1024*1024) {
+		for (i = 0; i < fsize; i += readahead_size) {
 			TEST(ltp_syscall(__NR_readahead, fd,
-				(off64_t) i, 2*1024*1024));
+				(off64_t) i, readahead_size));
 			if (TEST_RETURN != 0)
 				break;
 		}
-- 
2.5.0


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [LTP] [PATCH] syscalls/readahead02: fix error check
  2015-12-21 13:21 ` [LTP] [PATCH] syscalls/readahead02: fix error check Roman Gushchin
@ 2016-01-04  9:41   ` Jan Stancek
  0 siblings, 0 replies; 4+ messages in thread
From: Jan Stancek @ 2016-01-04  9:41 UTC (permalink / raw)
  To: ltp



----- Original Message -----
> From: "Roman Gushchin" <klamm@yandex-team.ru>
> To: "lorenzo pieralisi" <lorenzo.pieralisi@arm.com>
> Cc: "Roman Gushchin" <klamm@yandex-team.ru>, ltp@lists.linux.it
> Sent: Monday, 21 December, 2015 2:21:10 PM
> Subject: [LTP] [PATCH] syscalls/readahead02: fix error check
> 
> After commit 600e19afc5f8a6 ("mm: use only per-device readahead limit")
> readahead size is not limited anymore by 2 megabytes. Instead,
> the per-bdi limit is used.
> 
> Signed-off-by: Roman Gushchin <klamm@yandex-team.ru>
> ---
>  testcases/kernel/syscalls/readahead/readahead02.c | 34
>  +++++++++++++++++++++--
>  1 file changed, 31 insertions(+), 3 deletions(-)
> 
> diff --git a/testcases/kernel/syscalls/readahead/readahead02.c
> b/testcases/kernel/syscalls/readahead/readahead02.c
> index fe0b8a0..b5a7789 100644
> --- a/testcases/kernel/syscalls/readahead/readahead02.c
> +++ b/testcases/kernel/syscalls/readahead/readahead02.c
> @@ -184,6 +184,30 @@ static void create_testfile(void)
>  	free(tmp);
>  }
>  

Hi,

approach looks OK to me, but as it is now, it will break on older kernels.

> +static long get_device_readahead(const char *fname)
> +{
> +	FILE *f;
> +	struct stat st;
> +	unsigned long ra_kb = 0;
> +	char buf[256];
> +
> +	if (stat(fname, &st) == -1)
> +		return -1;

kernels < 4.5 will still impose 2M limit. So if your bdi limit is something
larger (say 4M) the test is going to fail. How about we keep the 2M default
for kernels prior to 600e19afc5f8a6?

if ((tst_kvercmp(4, 5, 0)) < 0)
    return 2 * 1024 * 1024;


> +	snprintf(buf, sizeof(buf), "/sys/dev/block/%d:%d/queue/read_ahead_kb",
> +		 major(st.st_dev), minor(st.st_dev));
> +	f = fopen(buf, "r");
> +	if (!f)
> +		return -1;

This sysfs file may not exist on older kernels, test now fails with TBROK.

Regards,
Jan

> +
> +	if (fscanf(f, "%lu", &ra_kb) != 1) {
> +		fclose(f);
> +		return -1;
> +	}
> +
> +	fclose(f);
> +	return ra_kb * 1024;
> +}
> +
>  /* read_testfile - mmap testfile and read every page.
>   * This functions measures how many I/O and time it takes to fully
>   * read contents of test file.
> @@ -206,16 +230,20 @@ static void read_testfile(int do_readahead, const char
> *fname, size_t fsize,
>  	unsigned long time_start_usec, time_end_usec;
>  	off_t offset;
>  	struct timeval now;
> +	long readahead_size;
> +
> +	readahead_size = get_device_readahead(fname);
> +	if (readahead_size == -1)
> +		tst_brkm(TBROK, cleanup, "Failed to get readahead size");
>  
>  	fd = open(fname, O_RDONLY);
>  	if (fd < 0)
>  		tst_brkm(TBROK | TERRNO, cleanup, "Failed to open %s", fname);
>  
>  	if (do_readahead) {
> -		/* read ahead in chunks, 2MB is maximum since 3.15-rc1 */
> -		for (i = 0; i < fsize; i += 2*1024*1024) {
> +		for (i = 0; i < fsize; i += readahead_size) {
>  			TEST(ltp_syscall(__NR_readahead, fd,
> -				(off64_t) i, 2*1024*1024));
> +				(off64_t) i, readahead_size));
>  			if (TEST_RETURN != 0)
>  				break;
>  		}
> --
> 2.5.0
> 
> 
> --
> Mailing list info: http://lists.linux.it/listinfo/ltp
> 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-01-04  9:41 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-12-11 13:53 [LTP] [bug report] readahead02: readahead hardcoded bytes limit Lorenzo Pieralisi
2015-12-11 15:07 ` Roman Gushchin
2015-12-21 13:21 ` [LTP] [PATCH] syscalls/readahead02: fix error check Roman Gushchin
2016-01-04  9:41   ` Jan Stancek

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.