@@ -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