1+ #include <errno.h>
2+ #include <fcntl.h>
13#include <signal.h>
24#include <stdio.h>
35#include <stdlib.h>
79
810#include "eat_all_memory.h"
911
10- #define NUM_PAGES 10
11-
1212static void handle_sigterm (int sig )
1313{
1414 printf ("blocking SIGTERM %d\n" , sig );
@@ -17,7 +17,11 @@ static void handle_sigterm(int sig)
1717void eat_all_memory (eat_how_enum eat_how )
1818{
1919 long page_size = sysconf (_SC_PAGESIZE );
20- long bs = page_size * NUM_PAGES ;
20+ long num_pages = 10 ;
21+ if (eat_how == EAT_MMAP_FILE ) {
22+ num_pages = 10000 ;
23+ }
24+ long bs = page_size * num_pages ;
2125 long cnt = 0 , last_sum = 0 ;
2226 struct timeval tv1 ;
2327 signal (SIGTERM , handle_sigterm );
@@ -39,16 +43,42 @@ void eat_all_memory(eat_how_enum eat_how)
3943 continue ;
4044 }
4145 break ;
46+ case EAT_MMAP_FILE :
47+ char tmp_path [] = "/var/tmp/membomb.mmap_file.XXXXXX" ;
48+ int fd = mkstemp (tmp_path );
49+ if (fd == -1 ) {
50+ perror ("mkstemp failed" );
51+ sleep (1 );
52+ continue ;
53+ }
54+ int ret = unlink (tmp_path );
55+ if (ret ) {
56+ perror ("unlink failed" );
57+ }
58+ if (ret ) {
59+ errno = ret ;
60+ perror ("ftruncate failed" );
61+ sleep (1 );
62+ continue ;
63+ }
64+ p = mmap (NULL , bs , PROT_READ | PROT_WRITE , MAP_SHARED , fd , 0 );
65+ if (p == MAP_FAILED ) {
66+ perror ("mmap failed" );
67+ sleep (1 );
68+ continue ;
69+ }
70+ break ;
4271 default :
4372 fprintf (stderr , "BUG: unknown eat_how=%d\n" , eat_how );
4473 exit (1 );
4574 }
46- for (int i = 0 ; i < NUM_PAGES ; i ++ ) {
75+ for (int i = 0 ; i < num_pages ; i ++ ) {
4776 // Write to each page so the kernel really has to allocate it.
4877 p [i * page_size ] = 0xab ;
4978 }
5079 cnt ++ ;
51- if (cnt % 1000 == 0 ) {
80+ const int cnt_per_100mb = 100 * 1024 * 1024 / bs ;
81+ if (cnt % cnt_per_100mb == 0 ) {
5282 long sum = bs * cnt / 1024 / 1024 ;
5383 struct timeval tv2 ;
5484 gettimeofday (& tv2 , NULL );
0 commit comments