Signed-off-by: Jaegeuk Kim <jaeg...@kernel.org> --- tools/f2fs_io/f2fs_io.c | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-)
diff --git a/tools/f2fs_io/f2fs_io.c b/tools/f2fs_io/f2fs_io.c index b9bf9bc5f797..2d64eda81706 100644 --- a/tools/f2fs_io/f2fs_io.c +++ b/tools/f2fs_io/f2fs_io.c @@ -931,6 +931,7 @@ static void do_write_advice(int argc, char **argv, const struct cmd_desc *cmd) " buffered : buffered IO\n" \ " dio : direct IO\n" \ " mmap : mmap IO\n" \ +" mlock : mmap + mlock\n" \ "advice can be\n" \ " 1 : set sequential|willneed\n" \ " 0 : none\n" \ @@ -946,6 +947,7 @@ 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 do_mlock = 0; int fd, advice; if (argc != 8) { @@ -968,6 +970,8 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) flags |= O_DIRECT; else if (!strcmp(argv[4], "mmap")) do_mmap = 1; + else if (!strcmp(argv[4], "mlock")) + do_mlock = 1; else if (strcmp(argv[4], "buffered")) die("Wrong IO type"); @@ -993,11 +997,24 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) total_time = get_current_us(); if (do_mmap) { data = mmap(NULL, count * buf_size, PROT_READ, - MAP_SHARED | MAP_POPULATE, fd, offset); + MAP_SHARED | MAP_POPULATE, fd, offset); if (data == MAP_FAILED) die("Mmap failed"); - } - if (!do_mmap) { + + read_cnt = count * buf_size; + memcpy(print_buf, data, print_bytes); + } else if (do_mlock) { + data = mmap(NULL, count * buf_size, PROT_READ, + MAP_SHARED, fd, offset); + if (data == MAP_FAILED) + die("Mmap failed"); + if (posix_fadvise(fd, offset, count * buf_size, + POSIX_FADV_WILLNEED) != 0) + die_errno("fadvise failed"); + if (mlock(data, count * buf_size)) + die_errno("mlock failed"); + read_cnt = count * buf_size; + } else { for (i = 0; i < count; i++) { ret = pread(fd, buf, buf_size, offset + buf_size * i); if (ret != buf_size) { @@ -1014,9 +1031,6 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) if (i == 0) memcpy(print_buf, buf, print_bytes); } - } else { - read_cnt = count * buf_size; - memcpy(print_buf, data, 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, @@ -1029,6 +1043,12 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd) else if (i % 2 == 0) printf(" "); } + if (do_mmap) { + munmap(data, count * buf_size); + } else if (do_mlock) { + munlock(data, count * buf_size); + munmap(data, count * buf_size); + } printf("\n"); exit(0); } -- 2.51.0.470.ga7dc726c21-goog _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel