2424#include <sys/ioctl.h>
2525#include <string.h>
2626#include <stdbool.h>
27+ #include "../kselftest.h"
2728#include "vm_util.h"
2829
2930#define DEFAULT_LENGTH_MB 10UL
3435
3536static void check_bytes (char * addr )
3637{
37- printf ("First hex is %x\n" , * ((unsigned int * )addr ));
38+ ksft_print_msg ("First hex is %x\n" , * ((unsigned int * )addr ));
3839}
3940
4041static void write_bytes (char * addr , size_t len )
@@ -52,7 +53,7 @@ static int read_bytes(char *addr, size_t len)
5253 check_bytes (addr );
5354 for (i = 0 ; i < len ; i ++ )
5455 if (* (addr + i ) != (char )i ) {
55- printf ("Mismatch at %lu\n" , i );
56+ ksft_print_msg ("Mismatch at %lu\n" , i );
5657 return 1 ;
5758 }
5859 return 0 ;
@@ -66,17 +67,13 @@ static void register_region_with_uffd(char *addr, size_t len)
6667 /* Create and enable userfaultfd object. */
6768
6869 uffd = syscall (__NR_userfaultfd , O_CLOEXEC | O_NONBLOCK );
69- if (uffd == -1 ) {
70- perror ("userfaultfd" );
71- exit (1 );
72- }
70+ if (uffd == -1 )
71+ ksft_exit_fail_msg ("userfaultfd: %s\n" , strerror (errno ));
7372
7473 uffdio_api .api = UFFD_API ;
7574 uffdio_api .features = 0 ;
76- if (ioctl (uffd , UFFDIO_API , & uffdio_api ) == -1 ) {
77- perror ("ioctl-UFFDIO_API" );
78- exit (1 );
79- }
75+ if (ioctl (uffd , UFFDIO_API , & uffdio_api ) == -1 )
76+ ksft_exit_fail_msg ("ioctl-UFFDIO_API: %s\n" , strerror (errno ));
8077
8178 /* Create a private anonymous mapping. The memory will be
8279 * demand-zero paged--that is, not yet allocated. When we
@@ -86,32 +83,29 @@ static void register_region_with_uffd(char *addr, size_t len)
8683
8784 addr = mmap (NULL , len , PROT_READ | PROT_WRITE ,
8885 MAP_PRIVATE | MAP_ANONYMOUS , -1 , 0 );
89- if (addr == MAP_FAILED ) {
90- perror ("mmap" );
91- exit (1 );
92- }
86+ if (addr == MAP_FAILED )
87+ ksft_exit_fail_msg ("mmap: %s\n" , strerror (errno ));
9388
94- printf ("Address returned by mmap() = %p\n" , addr );
89+ ksft_print_msg ("Address returned by mmap() = %p\n" , addr );
9590
9691 /* Register the memory range of the mapping we just created for
9792 * handling by the userfaultfd object. In mode, we request to track
9893 * missing pages (i.e., pages that have not yet been faulted in).
9994 */
100- if (uffd_register (uffd , addr , len , true, false, false)) {
101- perror ("ioctl-UFFDIO_REGISTER" );
102- exit (1 );
103- }
95+ if (uffd_register (uffd , addr , len , true, false, false))
96+ ksft_exit_fail_msg ("ioctl-UFFDIO_REGISTER: %s\n" , strerror (errno ));
10497}
10598
10699int main (int argc , char * argv [])
107100{
108101 size_t length = 0 ;
109102 int ret = 0 , fd ;
110103
111- if (argc >= 2 && !strcmp (argv [1 ], "-h" )) {
112- printf ("Usage: %s [length_in_MB]\n" , argv [0 ]);
113- exit (1 );
114- }
104+ ksft_print_header ();
105+ ksft_set_plan (1 );
106+
107+ if (argc >= 2 && !strcmp (argv [1 ], "-h" ))
108+ ksft_exit_fail_msg ("Usage: %s [length_in_MB]\n" , argv [0 ]);
115109
116110 /* Read memory length as the first arg if valid, otherwise fallback to
117111 * the default length.
@@ -123,63 +117,52 @@ int main(int argc, char *argv[])
123117
124118 length = MB_TO_BYTES (length );
125119 fd = memfd_create (argv [0 ], MFD_HUGETLB );
126- if (fd < 0 ) {
127- perror ("Open failed" );
128- exit (1 );
129- }
120+ if (fd < 0 )
121+ ksft_exit_fail_msg ("Open failed: %s\n" , strerror (errno ));
130122
131123 /* mmap to a PUD aligned address to hopefully trigger pmd sharing. */
132124 unsigned long suggested_addr = 0x7eaa40000000 ;
133125 void * haddr = mmap ((void * )suggested_addr , length , PROTECTION ,
134126 MAP_HUGETLB | MAP_SHARED | MAP_POPULATE , fd , 0 );
135- printf ("Map haddr: Returned address is %p\n" , haddr );
136- if (haddr == MAP_FAILED ) {
137- perror ("mmap1" );
138- exit (1 );
139- }
127+ ksft_print_msg ("Map haddr: Returned address is %p\n" , haddr );
128+ if (haddr == MAP_FAILED )
129+ ksft_exit_fail_msg ("mmap1: %s\n" , strerror (errno ));
140130
141131 /* mmap again to a dummy address to hopefully trigger pmd sharing. */
142132 suggested_addr = 0x7daa40000000 ;
143133 void * daddr = mmap ((void * )suggested_addr , length , PROTECTION ,
144134 MAP_HUGETLB | MAP_SHARED | MAP_POPULATE , fd , 0 );
145- printf ("Map daddr: Returned address is %p\n" , daddr );
146- if (daddr == MAP_FAILED ) {
147- perror ("mmap3" );
148- exit (1 );
149- }
135+ ksft_print_msg ("Map daddr: Returned address is %p\n" , daddr );
136+ if (daddr == MAP_FAILED )
137+ ksft_exit_fail_msg ("mmap3: %s\n" , strerror (errno ));
150138
151139 suggested_addr = 0x7faa40000000 ;
152140 void * vaddr =
153141 mmap ((void * )suggested_addr , length , PROTECTION , FLAGS , -1 , 0 );
154- printf ("Map vaddr: Returned address is %p\n" , vaddr );
155- if (vaddr == MAP_FAILED ) {
156- perror ("mmap2" );
157- exit (1 );
158- }
142+ ksft_print_msg ("Map vaddr: Returned address is %p\n" , vaddr );
143+ if (vaddr == MAP_FAILED )
144+ ksft_exit_fail_msg ("mmap2: %s\n" , strerror (errno ));
159145
160146 register_region_with_uffd (haddr , length );
161147
162148 void * addr = mremap (haddr , length , length ,
163149 MREMAP_MAYMOVE | MREMAP_FIXED , vaddr );
164- if (addr == MAP_FAILED ) {
165- perror ("mremap" );
166- exit (1 );
167- }
150+ if (addr == MAP_FAILED )
151+ ksft_exit_fail_msg ("mremap: %s\n" , strerror (errno ));
168152
169- printf ("Mremap: Returned address is %p\n" , addr );
153+ ksft_print_msg ("Mremap: Returned address is %p\n" , addr );
170154 check_bytes (addr );
171155 write_bytes (addr , length );
172156 ret = read_bytes (addr , length );
173157
174158 munmap (addr , length );
175159
176160 addr = mremap (addr , length , length , 0 );
177- if (addr != MAP_FAILED ) {
178- printf ("mremap: Expected failure, but call succeeded\n" );
179- exit (1 );
180- }
161+ if (addr != MAP_FAILED )
162+ ksft_exit_fail_msg ("mremap: Expected failure, but call succeeded\n" );
181163
182164 close (fd );
183165
184- return ret ;
166+ ksft_test_result (!ret , "Read same data\n" );
167+ ksft_exit (!ret );
185168}
0 commit comments