Skip to content

Commit 956e9d4

Browse files
author
Jaegeuk Kim
committed
f2fs_io: add mlock to measure the read speed
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
1 parent c05d420 commit 956e9d4

1 file changed

Lines changed: 26 additions & 6 deletions

File tree

tools/f2fs_io/f2fs_io.c

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,7 @@ static void do_write_advice(int argc, char **argv, const struct cmd_desc *cmd)
931931
" buffered : buffered IO\n" \
932932
" dio : direct IO\n" \
933933
" mmap : mmap IO\n" \
934+
" mlock : mmap + mlock\n" \
934935
"advice can be\n" \
935936
" 1 : set sequential|willneed\n" \
936937
" 0 : none\n" \
@@ -946,6 +947,7 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd)
946947
u64 total_time = 0;
947948
int flags = 0;
948949
int do_mmap = 0;
950+
int do_mlock = 0;
949951
int fd, advice;
950952

951953
if (argc != 8) {
@@ -968,6 +970,8 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd)
968970
flags |= O_DIRECT;
969971
else if (!strcmp(argv[4], "mmap"))
970972
do_mmap = 1;
973+
else if (!strcmp(argv[4], "mlock"))
974+
do_mlock = 1;
971975
else if (strcmp(argv[4], "buffered"))
972976
die("Wrong IO type");
973977

@@ -993,11 +997,24 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd)
993997
total_time = get_current_us();
994998
if (do_mmap) {
995999
data = mmap(NULL, count * buf_size, PROT_READ,
996-
MAP_SHARED | MAP_POPULATE, fd, offset);
1000+
MAP_SHARED | MAP_POPULATE, fd, offset);
9971001
if (data == MAP_FAILED)
9981002
die("Mmap failed");
999-
}
1000-
if (!do_mmap) {
1003+
1004+
read_cnt = count * buf_size;
1005+
memcpy(print_buf, data, print_bytes);
1006+
} else if (do_mlock) {
1007+
data = mmap(NULL, count * buf_size, PROT_READ,
1008+
MAP_SHARED, fd, offset);
1009+
if (data == MAP_FAILED)
1010+
die("Mmap failed");
1011+
if (posix_fadvise(fd, offset, count * buf_size,
1012+
POSIX_FADV_WILLNEED) != 0)
1013+
die_errno("fadvise failed");
1014+
if (mlock(data, count * buf_size))
1015+
die_errno("mlock failed");
1016+
read_cnt = count * buf_size;
1017+
} else {
10011018
for (i = 0; i < count; i++) {
10021019
ret = pread(fd, buf, buf_size, offset + buf_size * i);
10031020
if (ret != buf_size) {
@@ -1014,9 +1031,6 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd)
10141031
if (i == 0)
10151032
memcpy(print_buf, buf, print_bytes);
10161033
}
1017-
} else {
1018-
read_cnt = count * buf_size;
1019-
memcpy(print_buf, data, print_bytes);
10201034
}
10211035
printf("Read %"PRIu64" bytes total_time = %"PRIu64" us, BW = %.Lf MB/s print %u bytes:\n",
10221036
read_cnt, get_current_us() - total_time,
@@ -1029,6 +1043,12 @@ static void do_read(int argc, char **argv, const struct cmd_desc *cmd)
10291043
else if (i % 2 == 0)
10301044
printf(" ");
10311045
}
1046+
if (do_mmap) {
1047+
munmap(data, count * buf_size);
1048+
} else if (do_mlock) {
1049+
munlock(data, count * buf_size);
1050+
munmap(data, count * buf_size);
1051+
}
10321052
printf("\n");
10331053
exit(0);
10341054
}

0 commit comments

Comments
 (0)