@@ -93,33 +93,48 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
93
93
__fsword_t fs_type = get_fs_type (fd );
94
94
bool should_work ;
95
95
char * mem ;
96
+ int result = KSFT_PASS ;
96
97
int ret ;
97
98
99
+ if (fd < 0 ) {
100
+ result = KSFT_FAIL ;
101
+ goto report ;
102
+ }
103
+
98
104
if (ftruncate (fd , size )) {
99
105
if (errno == ENOENT ) {
100
106
skip_test_dodgy_fs ("ftruncate()" );
101
107
} else {
102
- ksft_test_result_fail ("ftruncate() failed (%s)\n" , strerror (errno ));
108
+ ksft_print_msg ("ftruncate() failed (%s)\n" ,
109
+ strerror (errno ));
110
+ result = KSFT_FAIL ;
111
+ goto report ;
103
112
}
104
113
return ;
105
114
}
106
115
107
116
if (fallocate (fd , 0 , 0 , size )) {
108
- if (size == pagesize )
109
- ksft_test_result_fail ("fallocate() failed (%s)\n" , strerror (errno ));
110
- else
111
- ksft_test_result_skip ("need more free huge pages\n" );
112
- return ;
117
+ if (size == pagesize ) {
118
+ ksft_print_msg ("fallocate() failed (%s)\n" , strerror (errno ));
119
+ result = KSFT_FAIL ;
120
+ } else {
121
+ ksft_print_msg ("need more free huge pages\n" );
122
+ result = KSFT_SKIP ;
123
+ }
124
+ goto report ;
113
125
}
114
126
115
127
mem = mmap (NULL , size , PROT_READ | PROT_WRITE ,
116
128
shared ? MAP_SHARED : MAP_PRIVATE , fd , 0 );
117
129
if (mem == MAP_FAILED ) {
118
- if (size == pagesize || shared )
119
- ksft_test_result_fail ("mmap() failed (%s)\n" , strerror (errno ));
120
- else
121
- ksft_test_result_skip ("need more free huge pages\n" );
122
- return ;
130
+ if (size == pagesize || shared ) {
131
+ ksft_print_msg ("mmap() failed (%s)\n" , strerror (errno ));
132
+ result = KSFT_FAIL ;
133
+ } else {
134
+ ksft_print_msg ("need more free huge pages\n" );
135
+ result = KSFT_SKIP ;
136
+ }
137
+ goto report ;
123
138
}
124
139
125
140
/* Fault in the page such that GUP-fast can pin it directly. */
@@ -134,7 +149,8 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
134
149
*/
135
150
ret = mprotect (mem , size , PROT_READ );
136
151
if (ret ) {
137
- ksft_test_result_fail ("mprotect() failed (%s)\n" , strerror (errno ));
152
+ ksft_print_msg ("mprotect() failed (%s)\n" , strerror (errno ));
153
+ result = KSFT_FAIL ;
138
154
goto munmap ;
139
155
}
140
156
/* FALLTHROUGH */
@@ -147,12 +163,14 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
147
163
type == TEST_TYPE_RW_FAST ;
148
164
149
165
if (gup_fd < 0 ) {
150
- ksft_test_result_skip ("gup_test not available\n" );
166
+ ksft_print_msg ("gup_test not available\n" );
167
+ result = KSFT_SKIP ;
151
168
break ;
152
169
}
153
170
154
171
if (rw && shared && fs_is_unknown (fs_type )) {
155
- ksft_test_result_skip ("Unknown filesystem\n" );
172
+ ksft_print_msg ("Unknown filesystem\n" );
173
+ result = KSFT_SKIP ;
156
174
return ;
157
175
}
158
176
/*
@@ -169,14 +187,19 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
169
187
args .flags |= rw ? PIN_LONGTERM_TEST_FLAG_USE_WRITE : 0 ;
170
188
ret = ioctl (gup_fd , PIN_LONGTERM_TEST_START , & args );
171
189
if (ret && errno == EINVAL ) {
172
- ksft_test_result_skip ("PIN_LONGTERM_TEST_START failed (EINVAL)n" );
190
+ ksft_print_msg ("PIN_LONGTERM_TEST_START failed (EINVAL)n" );
191
+ result = KSFT_SKIP ;
173
192
break ;
174
193
} else if (ret && errno == EFAULT ) {
175
- ksft_test_result (!should_work , "Should have failed\n" );
194
+ if (should_work )
195
+ result = KSFT_FAIL ;
196
+ else
197
+ result = KSFT_PASS ;
176
198
break ;
177
199
} else if (ret ) {
178
- ksft_test_result_fail ("PIN_LONGTERM_TEST_START failed (%s)\n" ,
179
- strerror (errno ));
200
+ ksft_print_msg ("PIN_LONGTERM_TEST_START failed (%s)\n" ,
201
+ strerror (errno ));
202
+ result = KSFT_FAIL ;
180
203
break ;
181
204
}
182
205
@@ -189,7 +212,10 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
189
212
* some previously unsupported filesystems, we might want to
190
213
* perform some additional tests for possible data corruptions.
191
214
*/
192
- ksft_test_result (should_work , "Should have worked\n" );
215
+ if (should_work )
216
+ result = KSFT_PASS ;
217
+ else
218
+ result = KSFT_FAIL ;
193
219
break ;
194
220
}
195
221
#ifdef LOCAL_CONFIG_HAVE_LIBURING
@@ -199,17 +225,19 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
199
225
200
226
/* io_uring always pins pages writable. */
201
227
if (shared && fs_is_unknown (fs_type )) {
202
- ksft_test_result_skip ("Unknown filesystem\n" );
203
- return ;
228
+ ksft_print_msg ("Unknown filesystem\n" );
229
+ result = KSFT_SKIP ;
230
+ goto report ;
204
231
}
205
232
should_work = !shared ||
206
233
fs_supports_writable_longterm_pinning (fs_type );
207
234
208
235
/* Skip on errors, as we might just lack kernel support. */
209
236
ret = io_uring_queue_init (1 , & ring , 0 );
210
237
if (ret < 0 ) {
211
- ksft_test_result_skip ("io_uring_queue_init() failed (%s)\n" ,
212
- strerror (- ret ));
238
+ ksft_print_msg ("io_uring_queue_init() failed (%s)\n" ,
239
+ strerror (- ret ));
240
+ result = KSFT_SKIP ;
213
241
break ;
214
242
}
215
243
/*
@@ -222,17 +250,28 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
222
250
/* Only new kernels return EFAULT. */
223
251
if (ret && (errno == ENOSPC || errno == EOPNOTSUPP ||
224
252
errno == EFAULT )) {
225
- ksft_test_result (!should_work , "Should have failed (%s)\n" ,
226
- strerror (errno ));
253
+ if (should_work ) {
254
+ ksft_print_msg ("Should have failed (%s)\n" ,
255
+ strerror (errno ));
256
+ result = KSFT_FAIL ;
257
+ } else {
258
+ result = KSFT_PASS ;
259
+ }
227
260
} else if (ret ) {
228
261
/*
229
262
* We might just lack support or have insufficient
230
263
* MEMLOCK limits.
231
264
*/
232
- ksft_test_result_skip ("io_uring_register_buffers() failed (%s)\n" ,
233
- strerror (- ret ));
265
+ ksft_print_msg ("io_uring_register_buffers() failed (%s)\n" ,
266
+ strerror (- ret ));
267
+ result = KSFT_SKIP ;
234
268
} else {
235
- ksft_test_result (should_work , "Should have worked\n" );
269
+ if (should_work ) {
270
+ result = KSFT_PASS ;
271
+ } else {
272
+ ksft_print_msg ("Should have worked\n" );
273
+ result = KSFT_FAIL ;
274
+ }
236
275
io_uring_unregister_buffers (& ring );
237
276
}
238
277
@@ -246,6 +285,8 @@ static void do_test(int fd, size_t size, enum test_type type, bool shared)
246
285
247
286
munmap :
248
287
munmap (mem , size );
288
+ report :
289
+ log_test_result (result );
249
290
}
250
291
251
292
typedef void (* test_fn )(int fd , size_t size );
@@ -254,13 +295,11 @@ static void run_with_memfd(test_fn fn, const char *desc)
254
295
{
255
296
int fd ;
256
297
257
- ksft_print_msg ( "[RUN] %s ... with memfd\n " , desc );
298
+ log_test_start ( " %s ... with memfd" , desc );
258
299
259
300
fd = memfd_create ("test" , 0 );
260
- if (fd < 0 ) {
261
- ksft_test_result_fail ("memfd_create() failed (%s)\n" , strerror (errno ));
262
- return ;
263
- }
301
+ if (fd < 0 )
302
+ ksft_print_msg ("memfd_create() failed (%s)\n" , strerror (errno ));
264
303
265
304
fn (fd , pagesize );
266
305
close (fd );
@@ -271,46 +310,46 @@ static void run_with_tmpfile(test_fn fn, const char *desc)
271
310
FILE * file ;
272
311
int fd ;
273
312
274
- ksft_print_msg ( "[RUN] %s ... with tmpfile\n " , desc );
313
+ log_test_start ( " %s ... with tmpfile" , desc );
275
314
276
315
file = tmpfile ();
277
316
if (!file ) {
278
- ksft_test_result_fail ("tmpfile() failed (%s)\n" , strerror (errno ));
279
- return ;
280
- }
281
-
282
- fd = fileno (file );
283
- if (fd < 0 ) {
284
- ksft_test_result_fail ("fileno() failed (%s)\n" , strerror (errno ));
285
- goto close ;
317
+ ksft_print_msg ("tmpfile() failed (%s)\n" , strerror (errno ));
318
+ fd = -1 ;
319
+ } else {
320
+ fd = fileno (file );
321
+ if (fd < 0 ) {
322
+ ksft_print_msg ("fileno() failed (%s)\n" , strerror (errno ));
323
+ }
286
324
}
287
325
288
326
fn (fd , pagesize );
289
- close :
290
- fclose (file );
327
+
328
+ if (file )
329
+ fclose (file );
291
330
}
292
331
293
332
static void run_with_local_tmpfile (test_fn fn , const char * desc )
294
333
{
295
334
char filename [] = __FILE__ "_tmpfile_XXXXXX" ;
296
335
int fd ;
297
336
298
- ksft_print_msg ( "[RUN] %s ... with local tmpfile\n " , desc );
337
+ log_test_start ( " %s ... with local tmpfile" , desc );
299
338
300
339
fd = mkstemp (filename );
301
- if (fd < 0 ) {
302
- ksft_test_result_fail ("mkstemp() failed (%s)\n" , strerror (errno ));
303
- return ;
304
- }
340
+ if (fd < 0 )
341
+ ksft_print_msg ("mkstemp() failed (%s)\n" , strerror (errno ));
305
342
306
343
if (unlink (filename )) {
307
- ksft_test_result_fail ("unlink() failed (%s)\n" , strerror (errno ));
308
- goto close ;
344
+ ksft_print_msg ("unlink() failed (%s)\n" , strerror (errno ));
345
+ close (fd );
346
+ fd = -1 ;
309
347
}
310
348
311
349
fn (fd , pagesize );
312
- close :
313
- close (fd );
350
+
351
+ if (fd >= 0 )
352
+ close (fd );
314
353
}
315
354
316
355
static void run_with_memfd_hugetlb (test_fn fn , const char * desc ,
@@ -319,15 +358,14 @@ static void run_with_memfd_hugetlb(test_fn fn, const char *desc,
319
358
int flags = MFD_HUGETLB ;
320
359
int fd ;
321
360
322
- ksft_print_msg ( "[RUN] %s ... with memfd hugetlb (%zu kB)\n " , desc ,
361
+ log_test_start ( " %s ... with memfd hugetlb (%zu kB)" , desc ,
323
362
hugetlbsize / 1024 );
324
363
325
364
flags |= __builtin_ctzll (hugetlbsize ) << MFD_HUGE_SHIFT ;
326
365
327
366
fd = memfd_create ("test" , flags );
328
367
if (fd < 0 ) {
329
- ksft_test_result_skip ("memfd_create() failed (%s)\n" , strerror (errno ));
330
- return ;
368
+ ksft_print_msg ("memfd_create() failed (%s)\n" , strerror (errno ));
331
369
}
332
370
333
371
fn (fd , hugetlbsize );
0 commit comments