IOR
aiori-MMAP.c
Go to the documentation of this file.
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  */
4 /******************************************************************************\
5 *
6 * Implement of abstract I/O interface for MMAP.
7 *
8 \******************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include "config.h"
12 #endif
13 
14 #include <stdio.h>
15 #include <stdlib.h>
16 
17 #include <errno.h>
18 #include <fcntl.h> /* IO operations */
19 #include <sys/stat.h>
20 #include <sys/mman.h>
21 #include <assert.h>
22 
23 #include "ior.h"
24 #include "aiori.h"
25 #include "iordef.h"
26 #include "utilities.h"
27 
28 /**************************** P R O T O T Y P E S *****************************/
29 static void *MMAP_Create(char *, IOR_param_t *);
30 static void *MMAP_Open(char *, IOR_param_t *);
31 static IOR_offset_t MMAP_Xfer(int, void *, IOR_size_t *,
33 static void MMAP_Close(void *, IOR_param_t *);
34 static void MMAP_Fsync(void *, IOR_param_t *);
35 
36 /************************** D E C L A R A T I O N S ***************************/
37 
39  .name = "MMAP",
40  .create = MMAP_Create,
41  .open = MMAP_Open,
42  .xfer = MMAP_Xfer,
43  .close = MMAP_Close,
44  .delete = POSIX_Delete,
45  .get_version = aiori_get_version,
46  .fsync = MMAP_Fsync,
47  .get_file_size = POSIX_GetFileSize,
48 };
49 
50 /***************************** F U N C T I O N S ******************************/
51 
52 static void ior_mmap_file(int *file, IOR_param_t *param)
53 {
54  int flags = PROT_READ;
56 
57  if (param->open == WRITE)
58  flags |= PROT_WRITE;
59 
60  param->mmap_ptr = mmap(NULL, size, flags, MAP_SHARED,
61  *file, 0);
62  if (param->mmap_ptr == MAP_FAILED)
63  ERR("mmap() failed");
64 
65  if (param->randomOffset)
66  flags = POSIX_MADV_RANDOM;
67  else
68  flags = POSIX_MADV_SEQUENTIAL;
69  if (posix_madvise(param->mmap_ptr, size, flags) != 0)
70  ERR("madvise() failed");
71 
72  if (posix_madvise(param->mmap_ptr, size, POSIX_MADV_DONTNEED) != 0)
73  ERR("madvise() failed");
74 
75  return;
76 }
77 
78 /*
79  * Creat and open a file through the POSIX interface, then setup mmap.
80  */
81 static void *MMAP_Create(char *testFileName, IOR_param_t * param)
82 {
83  int *fd;
84 
85  fd = POSIX_Create(testFileName, param);
86  if (ftruncate(*fd, param->expectedAggFileSize) != 0)
87  ERR("ftruncate() failed");
88  ior_mmap_file(fd, param);
89  return ((void *)fd);
90 }
91 
92 /*
93  * Open a file through the POSIX interface and setup mmap.
94  */
95 static void *MMAP_Open(char *testFileName, IOR_param_t * param)
96 {
97  int *fd;
98 
99  fd = POSIX_Open(testFileName, param);
100  ior_mmap_file(fd, param);
101  return ((void *)fd);
102 }
103 
104 /*
105  * Write or read access to file using mmap
106  */
107 static IOR_offset_t MMAP_Xfer(int access, void *file, IOR_size_t * buffer,
108  IOR_offset_t length, IOR_param_t * param)
109 {
110  if (access == WRITE) {
111  memcpy(param->mmap_ptr + param->offset, buffer, length);
112  } else {
113  memcpy(buffer, param->mmap_ptr + param->offset, length);
114  }
115 
116  if (param->fsyncPerWrite == TRUE) {
117  if (msync(param->mmap_ptr + param->offset, length, MS_SYNC) != 0)
118  ERR("msync() failed");
119  if (posix_madvise(param->mmap_ptr + param->offset, length,
120  POSIX_MADV_DONTNEED) != 0)
121  ERR("madvise() failed");
122  }
123  return (length);
124 }
125 
126 /*
127  * Perform msync().
128  */
129 static void MMAP_Fsync(void *fd, IOR_param_t * param)
130 {
131  if (msync(param->mmap_ptr, param->expectedAggFileSize, MS_SYNC) != 0)
132  EWARN("msync() failed");
133 }
134 
135 /*
136  * Close a file through the POSIX interface, after tear down the mmap.
137  */
138 static void MMAP_Close(void *fd, IOR_param_t * param)
139 {
140  if (munmap(param->mmap_ptr, param->expectedAggFileSize) != 0)
141  ERR("munmap failed");
142  param->mmap_ptr = NULL;
143  POSIX_Close(fd, param);
144 }
#define ERR(MSG)
Definition: iordef.h:169
ior_aiori_t mmap_aiori
Definition: aiori-MMAP.c:38
static int size
Definition: mdtest.c:82
void * POSIX_Open(char *testFileName, IOR_param_t *param)
Definition: aiori-POSIX.c:378
static void ior_mmap_file(int *file, IOR_param_t *param)
Definition: aiori-MMAP.c:52
static void * MMAP_Create(char *, IOR_param_t *)
Definition: aiori-MMAP.c:81
static void MMAP_Fsync(void *, IOR_param_t *)
Definition: aiori-MMAP.c:129
int fsyncPerWrite
Definition: ior.h:152
#define WRITE
Definition: iordef.h:95
#define EWARN(MSG)
Definition: iordef.h:156
void * POSIX_Create(char *testFileName, IOR_param_t *param)
Definition: aiori-POSIX.c:267
char * aiori_get_version()
Definition: aiori.c:149
void POSIX_Delete(char *testFileName, IOR_param_t *param)
Definition: aiori-POSIX.c:516
IOR_offset_t expectedAggFileSize
Definition: ior.h:120
static void MMAP_Close(void *, IOR_param_t *)
Definition: aiori-MMAP.c:138
IOR_offset_t POSIX_GetFileSize(IOR_param_t *test, MPI_Comm testComm, char *testFileName)
Definition: aiori-POSIX.c:528
static IOR_param_t param
Definition: mdtest.c:153
static void * MMAP_Open(char *, IOR_param_t *)
Definition: aiori-MMAP.c:95
void * mmap_ptr
Definition: ior.h:155
long long int IOR_size_t
Definition: iordef.h:124
static IOR_offset_t MMAP_Xfer(int, void *, IOR_size_t *, IOR_offset_t, IOR_param_t *)
Definition: aiori-MMAP.c:107
int randomOffset
Definition: ior.h:144
void POSIX_Close(void *fd, IOR_param_t *param)
Definition: aiori-POSIX.c:506
IOR_offset_t offset
Definition: ior.h:119
int open
Definition: ior.h:101
char * name
Definition: aiori.h:67
long long int IOR_offset_t
Definition: iordef.h:123
#define TRUE
Definition: iordef.h:75
#define NULL
Definition: iordef.h:79