2019-05-28 09:57:18 -07:00
// SPDX-License-Identifier: GPL-2.0-only
2016-06-02 22:02:01 +10:00
/*
* Copyright 2016 , Anton Blanchard , Michael Ellerman , IBM Corp .
*/
# include <stdio.h>
# include <stdlib.h>
# include <sys/mman.h>
# include <time.h>
2017-11-28 14:06:39 +05:30
# include <getopt.h>
2016-06-02 22:02:01 +10:00
# include "utils.h"
# define ITERATIONS 5000000
2017-11-28 14:06:39 +05:30
# define MEMSIZE (1UL << 27)
# define PAGE_SIZE (1UL << 16)
# define CHUNK_COUNT (MEMSIZE / PAGE_SIZE)
static int pg_fault ;
static int iterations = ITERATIONS ;
static struct option options [ ] = {
{ " pgfault " , no_argument , & pg_fault , 1 } ,
{ " iterations " , required_argument , 0 , ' i ' } ,
{ 0 , } ,
} ;
static void usage ( void )
{
printf ( " mmap_bench <--pgfault> <--iterations count> \n " ) ;
}
2016-06-02 22:02:01 +10:00
int test_mmap ( void )
{
struct timespec ts_start , ts_end ;
2017-11-28 14:06:39 +05:30
unsigned long i = iterations ;
2016-06-02 22:02:01 +10:00
clock_gettime ( CLOCK_MONOTONIC , & ts_start ) ;
while ( i - - ) {
char * c = mmap ( NULL , MEMSIZE , PROT_READ | PROT_WRITE ,
MAP_PRIVATE | MAP_ANONYMOUS , - 1 , 0 ) ;
FAIL_IF ( c = = MAP_FAILED ) ;
2017-11-28 14:06:39 +05:30
if ( pg_fault ) {
int count ;
for ( count = 0 ; count < CHUNK_COUNT ; count + + )
c [ count < < 16 ] = ' c ' ;
}
2016-06-02 22:02:01 +10:00
munmap ( c , MEMSIZE ) ;
}
clock_gettime ( CLOCK_MONOTONIC , & ts_end ) ;
printf ( " time = %.6f \n " , ts_end . tv_sec - ts_start . tv_sec + ( ts_end . tv_nsec - ts_start . tv_nsec ) / 1e9 ) ;
return 0 ;
}
2017-11-28 14:06:39 +05:30
int main ( int argc , char * argv [ ] )
2016-06-02 22:02:01 +10:00
{
2017-11-28 14:06:39 +05:30
signed char c ;
while ( 1 ) {
int option_index = 0 ;
c = getopt_long ( argc , argv , " " , options , & option_index ) ;
if ( c = = - 1 )
break ;
switch ( c ) {
case 0 :
if ( options [ option_index ] . flag ! = 0 )
break ;
usage ( ) ;
exit ( 1 ) ;
break ;
case ' i ' :
iterations = atoi ( optarg ) ;
break ;
default :
usage ( ) ;
exit ( 1 ) ;
}
}
2018-07-26 22:24:59 +10:00
test_harness_set_timeout ( 300 ) ;
2016-06-02 22:02:01 +10:00
return test_harness ( test_mmap , " mmap_bench " ) ;
}