38
38
#define MFD_DEF_SIZE 8192
39
39
#define STACK_SIZE 65536
40
40
41
+ static size_t mfd_def_size = MFD_DEF_SIZE ;
42
+
41
43
static int mfd_assert_new (const char * name , loff_t sz , unsigned int flags )
42
44
{
43
45
int r , fd ;
@@ -123,7 +125,7 @@ static void *mfd_assert_mmap_shared(int fd)
123
125
void * p ;
124
126
125
127
p = mmap (NULL ,
126
- MFD_DEF_SIZE ,
128
+ mfd_def_size ,
127
129
PROT_READ | PROT_WRITE ,
128
130
MAP_SHARED ,
129
131
fd ,
@@ -141,7 +143,7 @@ static void *mfd_assert_mmap_private(int fd)
141
143
void * p ;
142
144
143
145
p = mmap (NULL ,
144
- MFD_DEF_SIZE ,
146
+ mfd_def_size ,
145
147
PROT_READ | PROT_WRITE ,
146
148
MAP_PRIVATE ,
147
149
fd ,
@@ -174,7 +176,7 @@ static int sealing_thread_fn(void *arg)
174
176
usleep (200000 );
175
177
176
178
/* unmount mapping before sealing to avoid i_mmap_writable failures */
177
- munmap (global_p , MFD_DEF_SIZE );
179
+ munmap (global_p , mfd_def_size );
178
180
179
181
/* Try sealing the global file; expect EBUSY or success. Current
180
182
* kernels will never succeed, but in the future, kernels might
@@ -224,7 +226,7 @@ static void join_sealing_thread(pid_t pid)
224
226
225
227
int main (int argc , char * * argv )
226
228
{
227
- static const char zero [ MFD_DEF_SIZE ] ;
229
+ char * zero ;
228
230
int fd , mfd , r ;
229
231
void * p ;
230
232
int was_sealed ;
@@ -235,6 +237,25 @@ int main(int argc, char **argv)
235
237
abort ();
236
238
}
237
239
240
+ if (argc >= 3 ) {
241
+ if (!strcmp (argv [2 ], "hugetlbfs" )) {
242
+ unsigned long hpage_size = default_huge_page_size ();
243
+
244
+ if (!hpage_size ) {
245
+ printf ("Unable to determine huge page size\n" );
246
+ abort ();
247
+ }
248
+
249
+ hugetlbfs_test = 1 ;
250
+ mfd_def_size = hpage_size * 2 ;
251
+ } else {
252
+ printf ("Unknown option: %s\n" , argv [2 ]);
253
+ abort ();
254
+ }
255
+ }
256
+
257
+ zero = calloc (sizeof (* zero ), mfd_def_size );
258
+
238
259
/* open FUSE memfd file for GUP testing */
239
260
printf ("opening: %s\n" , argv [1 ]);
240
261
fd = open (argv [1 ], O_RDONLY | O_CLOEXEC );
@@ -245,7 +266,7 @@ int main(int argc, char **argv)
245
266
246
267
/* create new memfd-object */
247
268
mfd = mfd_assert_new ("kern_memfd_fuse" ,
248
- MFD_DEF_SIZE ,
269
+ mfd_def_size ,
249
270
MFD_CLOEXEC | MFD_ALLOW_SEALING );
250
271
251
272
/* mmap memfd-object for writing */
@@ -264,7 +285,7 @@ int main(int argc, char **argv)
264
285
* This guarantees that the receive-buffer is pinned for 1s until the
265
286
* data is written into it. The racing ADD_SEALS should thus fail as
266
287
* the pages are still pinned. */
267
- r = read (fd , p , MFD_DEF_SIZE );
288
+ r = read (fd , p , mfd_def_size );
268
289
if (r < 0 ) {
269
290
printf ("read() failed: %m\n" );
270
291
abort ();
@@ -291,10 +312,10 @@ int main(int argc, char **argv)
291
312
* enough to avoid any in-flight writes. */
292
313
293
314
p = mfd_assert_mmap_private (mfd );
294
- if (was_sealed && memcmp (p , zero , MFD_DEF_SIZE )) {
315
+ if (was_sealed && memcmp (p , zero , mfd_def_size )) {
295
316
printf ("memfd sealed during read() but data not discarded\n" );
296
317
abort ();
297
- } else if (!was_sealed && !memcmp (p , zero , MFD_DEF_SIZE )) {
318
+ } else if (!was_sealed && !memcmp (p , zero , mfd_def_size )) {
298
319
printf ("memfd sealed after read() but data discarded\n" );
299
320
abort ();
300
321
}
@@ -303,6 +324,7 @@ int main(int argc, char **argv)
303
324
close (fd );
304
325
305
326
printf ("fuse: DONE\n" );
327
+ free (zero );
306
328
307
329
return 0 ;
308
330
}
0 commit comments