Updated MMap module to option parser.

master
Julian M. Kunkel 2019-03-27 22:32:59 +00:00
parent b4fb80a69e
commit 21405ed924
5 changed files with 57 additions and 19 deletions

View File

@ -32,6 +32,7 @@ static IOR_offset_t MMAP_Xfer(int, void *, IOR_size_t *,
IOR_offset_t, IOR_param_t *); IOR_offset_t, IOR_param_t *);
static void MMAP_Close(void *, IOR_param_t *); static void MMAP_Close(void *, IOR_param_t *);
static void MMAP_Fsync(void *, IOR_param_t *); static void MMAP_Fsync(void *, IOR_param_t *);
static option_help * MMAP_options(void ** init_backend_options, void * init_values);
/************************** D E C L A R A T I O N S ***************************/ /************************** D E C L A R A T I O N S ***************************/
@ -45,9 +46,38 @@ ior_aiori_t mmap_aiori = {
.get_version = aiori_get_version, .get_version = aiori_get_version,
.fsync = MMAP_Fsync, .fsync = MMAP_Fsync,
.get_file_size = POSIX_GetFileSize, .get_file_size = POSIX_GetFileSize,
.get_options = MMAP_options,
}; };
/***************************** F U N C T I O N S ******************************/ /***************************** F U N C T I O N S ******************************/
typedef struct{
int direct_io_ignored; /* this option is ignored */
void* mmap_ptr; /* for internal usage */
int madv_dont_need;
int madv_pattern;
} mmap_options_t;
static option_help * MMAP_options(void ** init_backend_options, void * init_values){
mmap_options_t * o = malloc(sizeof(mmap_options_t));
if (init_values != NULL){
memcpy(o, init_values, sizeof(mmap_options_t));
}else{
o->direct_io_ignored = 0;
}
*init_backend_options = o;
option_help h [] = {
{0, "mmap.madv_dont_need", "Use advise don't need", OPTION_FLAG, 'd', & o->madv_dont_need},
{0, "mmap.madv_pattern", "Use advise to indicate the pattern random/sequential", OPTION_FLAG, 'd', & o->madv_pattern},
LAST_OPTION
};
option_help * help = malloc(sizeof(h));
memcpy(help, h, sizeof(h));
return help;
}
static void ior_mmap_file(int *file, IOR_param_t *param) static void ior_mmap_file(int *file, IOR_param_t *param)
{ {
@ -56,21 +86,27 @@ static void ior_mmap_file(int *file, IOR_param_t *param)
if (param->open == WRITE) if (param->open == WRITE)
flags |= PROT_WRITE; flags |= PROT_WRITE;
mmap_options_t *o = (mmap_options_t*) param->backend_options;
param->mmap_ptr = mmap(NULL, size, flags, MAP_SHARED, o->mmap_ptr = mmap(NULL, size, flags, MAP_SHARED,
*file, 0); *file, 0);
if (param->mmap_ptr == MAP_FAILED) if (o->mmap_ptr == MAP_FAILED)
ERR("mmap() failed"); ERR("mmap() failed");
if (param->randomOffset) if (param->randomOffset)
flags = POSIX_MADV_RANDOM; flags = POSIX_MADV_RANDOM;
else else
flags = POSIX_MADV_SEQUENTIAL; flags = POSIX_MADV_SEQUENTIAL;
if (posix_madvise(param->mmap_ptr, size, flags) != 0)
ERR("madvise() failed"); if(o->madv_pattern){
if (posix_madvise(o->mmap_ptr, size, flags) != 0)
ERR("madvise() failed");
}
if (posix_madvise(param->mmap_ptr, size, POSIX_MADV_DONTNEED) != 0) if (o->madv_dont_need){
ERR("madvise() failed"); if (posix_madvise(o->mmap_ptr, size, POSIX_MADV_DONTNEED) != 0)
ERR("madvise() failed");
}
return; return;
} }
@ -107,16 +143,17 @@ static void *MMAP_Open(char *testFileName, IOR_param_t * param)
static IOR_offset_t MMAP_Xfer(int access, void *file, IOR_size_t * buffer, static IOR_offset_t MMAP_Xfer(int access, void *file, IOR_size_t * buffer,
IOR_offset_t length, IOR_param_t * param) IOR_offset_t length, IOR_param_t * param)
{ {
mmap_options_t *o = (mmap_options_t*) param->backend_options;
if (access == WRITE) { if (access == WRITE) {
memcpy(param->mmap_ptr + param->offset, buffer, length); memcpy(o->mmap_ptr + param->offset, buffer, length);
} else { } else {
memcpy(buffer, param->mmap_ptr + param->offset, length); memcpy(buffer, o->mmap_ptr + param->offset, length);
} }
if (param->fsyncPerWrite == TRUE) { if (param->fsyncPerWrite == TRUE) {
if (msync(param->mmap_ptr + param->offset, length, MS_SYNC) != 0) if (msync(o->mmap_ptr + param->offset, length, MS_SYNC) != 0)
ERR("msync() failed"); ERR("msync() failed");
if (posix_madvise(param->mmap_ptr + param->offset, length, if (posix_madvise(o->mmap_ptr + param->offset, length,
POSIX_MADV_DONTNEED) != 0) POSIX_MADV_DONTNEED) != 0)
ERR("madvise() failed"); ERR("madvise() failed");
} }
@ -128,7 +165,8 @@ static IOR_offset_t MMAP_Xfer(int access, void *file, IOR_size_t * buffer,
*/ */
static void MMAP_Fsync(void *fd, IOR_param_t * param) static void MMAP_Fsync(void *fd, IOR_param_t * param)
{ {
if (msync(param->mmap_ptr, param->expectedAggFileSize, MS_SYNC) != 0) mmap_options_t *o = (mmap_options_t*) param->backend_options;
if (msync(o->mmap_ptr, param->expectedAggFileSize, MS_SYNC) != 0)
EWARN("msync() failed"); EWARN("msync() failed");
} }
@ -137,8 +175,9 @@ static void MMAP_Fsync(void *fd, IOR_param_t * param)
*/ */
static void MMAP_Close(void *fd, IOR_param_t * param) static void MMAP_Close(void *fd, IOR_param_t * param)
{ {
if (munmap(param->mmap_ptr, param->expectedAggFileSize) != 0) mmap_options_t *o = (mmap_options_t*) param->backend_options;
if (munmap(o->mmap_ptr, param->expectedAggFileSize) != 0)
ERR("munmap failed"); ERR("munmap failed");
param->mmap_ptr = NULL; o->mmap_ptr = NULL;
POSIX_Close(fd, param); POSIX_Close(fd, param);
} }

View File

@ -74,11 +74,12 @@ static void POSIX_Fsync(void *, IOR_param_t *);
/************************** O P T I O N S *****************************/ /************************** O P T I O N S *****************************/
typedef struct{ typedef struct{
/* in case of a change, please update depending MMAP module too */
int direct_io; int direct_io;
} posix_options_t; } posix_options_t;
static option_help * posix_options(void ** init_backend_options, void * init_values){ option_help * POSIX_options(void ** init_backend_options, void * init_values){
posix_options_t * o = malloc(sizeof(posix_options_t)); posix_options_t * o = malloc(sizeof(posix_options_t));
if (init_values != NULL){ if (init_values != NULL){
@ -118,7 +119,7 @@ ior_aiori_t posix_aiori = {
.rmdir = aiori_posix_rmdir, .rmdir = aiori_posix_rmdir,
.access = aiori_posix_access, .access = aiori_posix_access,
.stat = aiori_posix_stat, .stat = aiori_posix_stat,
.get_options = posix_options, .get_options = POSIX_options,
.enable_mdtest = true, .enable_mdtest = true,
}; };

View File

@ -129,6 +129,8 @@ void *POSIX_Open(char *testFileName, IOR_param_t * param);
IOR_offset_t POSIX_GetFileSize(IOR_param_t * test, MPI_Comm testComm, char *testFileName); IOR_offset_t POSIX_GetFileSize(IOR_param_t * test, MPI_Comm testComm, char *testFileName);
void POSIX_Delete(char *testFileName, IOR_param_t * param); void POSIX_Delete(char *testFileName, IOR_param_t * param);
void POSIX_Close(void *fd, IOR_param_t * param); void POSIX_Close(void *fd, IOR_param_t * param);
option_help * POSIX_options(void ** init_backend_options, void * init_values);
/* NOTE: these 3 MPI-IO functions are exported for reuse by HDF5/PNetCDF */ /* NOTE: these 3 MPI-IO functions are exported for reuse by HDF5/PNetCDF */
void MPIIO_Delete(char *testFileName, IOR_param_t * param); void MPIIO_Delete(char *testFileName, IOR_param_t * param);

View File

@ -218,8 +218,6 @@ void init_IOR_Param_t(IOR_param_t * p)
p->beegfs_numTargets = -1; p->beegfs_numTargets = -1;
p->beegfs_chunkSize = -1; p->beegfs_chunkSize = -1;
p->mmap_ptr = NULL;
} }
static void static void

View File

@ -162,8 +162,6 @@ typedef struct
int fsyncPerWrite; /* fsync() after each write */ int fsyncPerWrite; /* fsync() after each write */
int fsync; /* fsync() after write */ int fsync; /* fsync() after write */
void* mmap_ptr;
/* MPI variables */ /* MPI variables */
MPI_Comm testComm; /* MPI communicator */ MPI_Comm testComm; /* MPI communicator */
MPI_Datatype transferType; /* datatype for transfer */ MPI_Datatype transferType; /* datatype for transfer */