22#include "zdtmtst.h"
33#include "get_smaps_bits.h"
44
5+ #ifndef MAP_DROPPABLE
6+ #define MAP_DROPPABLE 0x08
7+ #endif
8+
59#ifndef MADV_DONTDUMP
610#define MADV_DONTDUMP 16
711#endif
@@ -27,8 +31,14 @@ static int alloc_anon_mmap(struct mmap_data *m, int flags, int adv)
2731{
2832 m -> start = mmap (NULL , MEM_SIZE , PROT_READ | PROT_WRITE , flags , -1 , 0 );
2933 if (m -> start == MAP_FAILED ) {
30- pr_perror ("mmap failed" );
31- return -1 ;
34+ if (errno == EINVAL ) {
35+ test_msg ("mmap failed, no kernel support\n" );
36+ * m = (struct mmap_data ){};
37+ return 0 ;
38+ } else {
39+ pr_perror ("mmap failed" );
40+ return -1 ;
41+ }
3242 }
3343
3444 if (madvise (m -> start , MEM_SIZE , adv )) {
@@ -47,7 +57,7 @@ static int alloc_anon_mmap(struct mmap_data *m, int flags, int adv)
4757
4858int main (int argc , char * * argv )
4959{
50- struct mmap_data m [6 ] = {};
60+ struct mmap_data m [7 ] = {};
5161 size_t i ;
5262
5363 test_init (argc , argv );
@@ -76,6 +86,10 @@ int main(int argc, char **argv)
7686 if (alloc_anon_mmap (& m [5 ], MAP_PRIVATE | MAP_ANONYMOUS , MADV_WIPEONFORK ))
7787 return -1 ;
7888
89+ test_msg ("Alloc droppable\n" );
90+ if (alloc_anon_mmap (& m [6 ], MAP_DROPPABLE | MAP_ANONYMOUS , MADV_NORMAL ))
91+ return -1 ;
92+
7993 test_msg ("Fetch existing flags/adv\n" );
8094 for (i = 0 ; i < sizeof (m ) / sizeof (m [0 ]); i ++ ) {
8195 if (get_smaps_bits ((unsigned long )m [i ].start , & m [i ].orig_flags , & m [i ].orig_madv ))
0 commit comments