This adds a way to boost read performance by giving fadvise. Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> --- tools/f2fs_io/f2fs_io.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-)
diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c index 8fbad3c8e563..5b67a92e0947 100644 --- a/tools/f2fs_io/f2fs_io.c +++ b/tools/f2fs_io/f2fs_io.c @@ -833,12 +833,15 @@ static void do_write_advice(int argc, char **argv, const struct cmd_desc *cmd) #define read_desc "read data from file" #define read_help \ -"f2fs_io read [chunk_size in 4kb] [offset in chunk_size] [count] [IO] [print_nbytes] [file_path]\n\n" \ +"f2fs_io read [chunk_size in 4kb] [offset in chunk_size] [count] [IO] [advice] [print_nbytes] [file_path]\n\n" \ "Read data in file_path and print nbytes\n" \ "IO can be\n" \ " buffered : buffered IO\n" \ " dio : direct IO\n" \ " mmap : mmap IO\n" \ +"advice can be\n" \ +" 1 : set sequential|willneed\n" \ +" 0 : none\n" \ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) { @@ -851,9 +854,9 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) u64 total_time = 0; int flags = 0; int do_mmap = 0; - int fd; + int fd, advice; - if (argc != 7) { + if (argc != 8) { fputs("Excess arguments\n\n", stderr); fputs(cmd->cmd_help, stderr); exit(1); @@ -876,13 +879,22 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) else if (strcmp(argv[4], "buffered")) die("Wrong IO type"); - print_bytes = atoi(argv[5]); + print_bytes = atoi(argv[6]); if (print_bytes > buf_size) die("Print_nbytes should be less then chunk_size in kb"); print_buf = xmalloc(print_bytes); - fd = xopen(argv[6], O_RDONLY | flags, 0); + fd = xopen(argv[7], O_RDONLY | flags, 0); + + advice = atoi(argv[5]); + if (advice) { + if (posix_fadvise(fd, 0, 4096, POSIX_FADV_SEQUENTIAL) != 0) + die_errno("fadvise failed"); + if (posix_fadvise(fd, 0, 4096, POSIX_FADV_WILLNEED) != 0) + die_errno("fadvise failed"); + printf("fadvise SEQUENTIAL|WILLNEED to a file: %s\n", argv[7]); + } total_time = get_current_us(); if (do_mmap) { @@ -912,8 +924,9 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) read_cnt = count * buf_size; memcpy(print_buf, data, print_bytes); } - printf("Read %"PRIu64" bytes total_time = %"PRIu64" us, print %u bytes:\n", - read_cnt, get_current_us() - total_time, print_bytes); + printf("Read %"PRIu64" bytes total_time = %"PRIu64" us, BW = %.Lf MB/s print %u bytes:\n", + read_cnt, get_current_us() - total_time, + ((long double)read_cnt / (get_current_us() - total_time) * 1000/1024 * 1000/1024 ), print_bytes); printf("%08"PRIx64" : ", offset); for (i = 1; i <= print_bytes; i++) { printf("%02x", print_buf[i - 1]); -- 2.47.0.rc1.288.g06298d1525-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel