15
15
#include <sanitizer/hwasan_interface.h>
16
16
17
17
const unsigned char kTag = 42 ;
18
- const size_t kNumShadowPages = 256 ;
18
+ const size_t kNumShadowPages = 1024 ;
19
19
const size_t kNumPages = 16 * kNumShadowPages ;
20
20
const size_t kPageSize = 4096 ;
21
21
const size_t kMapSize = kNumPages * kPageSize ;
22
22
23
23
void sync_rss () {
24
24
char * page = (char * )mmap (0 , kPageSize , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , 0 , 0 );
25
25
// Linux kernel updates RSS counters after a set number of page faults.
26
- for (int i = 0 ; i < 10000 ; ++ i ) {
26
+ for (int i = 0 ; i < 100 ; ++ i ) {
27
27
page [0 ] = 42 ;
28
28
madvise (page , kPageSize , MADV_DONTNEED );
29
29
}
@@ -44,17 +44,18 @@ size_t current_rss() {
44
44
return rss ;
45
45
}
46
46
47
- void test_rss_difference (void * p ) {
47
+ int test_rss_difference (void * p ) {
48
48
__hwasan_tag_memory (p , kTag , kMapSize );
49
49
size_t rss_before = current_rss ();
50
50
__hwasan_tag_memory (p , 0 , kMapSize );
51
51
size_t rss_after = current_rss ();
52
52
fprintf (stderr , "%zu -> %zu\n" , rss_before , rss_after );
53
- assert (rss_before > rss_after );
53
+ if (rss_before <= rss_after )
54
+ return 0 ;
54
55
size_t diff = rss_before - rss_after ;
55
56
fprintf (stderr , "diff %zu\n" , diff );
56
57
// Check that the difference is at least close to kNumShadowPages.
57
- assert ( diff > kNumShadowPages / 2 ) ;
58
+ return diff > kNumShadowPages / 2 ;
58
59
}
59
60
60
61
int main () {
@@ -64,9 +65,14 @@ int main() {
64
65
void * p = mmap (0 , kMapSize , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANONYMOUS , 0 , 0 );
65
66
fprintf (stderr , "p = %p\n" , p );
66
67
67
- test_rss_difference (p );
68
- test_rss_difference (p );
69
- test_rss_difference (p );
68
+ size_t total_count = 10 ;
69
+ size_t success_count = 0 ;
70
+ for (size_t i = 0 ; i < total_count ; ++ i )
71
+ success_count += test_rss_difference (p );
72
+
73
+ fprintf (stderr , "p = %p\n" , p );
74
+ fprintf (stderr , "passed %zu out of %zu\n" , success_count , total_count );
75
+ assert (success_count > total_count * 0.8 );
70
76
71
77
return 0 ;
72
78
}
0 commit comments