@@ -990,6 +990,36 @@ static void collapse_max_ptes_shared(struct collapse_context *c)
990990 munmap (p , hpage_pmd_size );
991991}
992992
993+ static void madvise_collapse_existing_thps (void )
994+ {
995+ void * p ;
996+ int err ;
997+
998+ p = alloc_mapping ();
999+ fill_memory (p , 0 , hpage_pmd_size );
1000+
1001+ printf ("Collapse fully populated PTE table..." );
1002+ /*
1003+ * Note that we don't set MADV_HUGEPAGE here, which
1004+ * also tests that VM_HUGEPAGE isn't required for
1005+ * MADV_COLLAPSE in "madvise" mode.
1006+ */
1007+ err = madvise (p , hpage_pmd_size , MADV_COLLAPSE );
1008+ if (err == 0 && check_huge (p )) {
1009+ success ("OK" );
1010+ printf ("Re-collapse PMD-mapped hugepage" );
1011+ err = madvise (p , hpage_pmd_size , MADV_COLLAPSE );
1012+ if (err == 0 && check_huge (p ))
1013+ success ("OK" );
1014+ else
1015+ fail ("Fail" );
1016+ } else {
1017+ fail ("Fail" );
1018+ }
1019+ validate_memory (p , 0 , hpage_pmd_size );
1020+ munmap (p , hpage_pmd_size );
1021+ }
1022+
9931023int main (int argc , const char * * argv )
9941024{
9951025 struct collapse_context c ;
@@ -1057,6 +1087,7 @@ int main(int argc, const char **argv)
10571087 collapse_fork (& c );
10581088 collapse_fork_compound (& c );
10591089 collapse_max_ptes_shared (& c );
1090+ madvise_collapse_existing_thps ();
10601091 }
10611092
10621093 restore_settings (0 );
0 commit comments