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 static option_help * MMAP_options(void ** init_backend_options, void * init_values);
36 
37 /************************** D E C L A R A T I O N S ***************************/
38 
40  .name = "MMAP",
41  .create = MMAP_Create,
42  .open = MMAP_Open,
43  .xfer = MMAP_Xfer,
44  .close = MMAP_Close,
45  .delete = POSIX_Delete,
46  .get_version = aiori_get_version,
47  .fsync = MMAP_Fsync,
48  .get_file_size = POSIX_GetFileSize,
49  .get_options = MMAP_options,
50 };
51 
52 /***************************** F U N C T I O N S ******************************/
53 typedef struct{
54  int direct_io_ignored; /* this option is ignored */
55  void* mmap_ptr; /* for internal usage */
56 
60 
61 static option_help * MMAP_options(void ** init_backend_options, void * init_values){
62  mmap_options_t * o = malloc(sizeof(mmap_options_t));
63 
64  if (init_values != NULL){
65  memcpy(o, init_values, sizeof(mmap_options_t));
66  }else{
67  memset(o, 0, sizeof(mmap_options_t));
68  }
69 
70  *init_backend_options = o;
71 
72  option_help h [] = {
73  {0, "mmap.madv_dont_need", "Use advise don't need", OPTION_FLAG, 'd', & o->madv_dont_need},
74  {0, "mmap.madv_pattern", "Use advise to indicate the pattern random/sequential", OPTION_FLAG, 'd', & o->madv_pattern},
76  };
77  option_help * help = malloc(sizeof(h));
78  memcpy(help, h, sizeof(h));
79  return help;
80 }
81 
82 static void ior_mmap_file(int *file, IOR_param_t *param)
83 {
84  int flags = PROT_READ;
86 
87  if (param->open == WRITE)
88  flags |= PROT_WRITE;
90 
91  o->mmap_ptr = mmap(NULL, size, flags, MAP_SHARED,
92  *file, 0);
93  if (o->mmap_ptr == MAP_FAILED)
94  ERR("mmap() failed");
95 
96  if (param->randomOffset)
97  flags = POSIX_MADV_RANDOM;
98  else
99  flags = POSIX_MADV_SEQUENTIAL;
100 
101  if(o->madv_pattern){
102  if (posix_madvise(o->mmap_ptr, size, flags) != 0)
103  ERR("madvise() failed");
104  }
105 
106  if (o->madv_dont_need){
107  if (posix_madvise(o->mmap_ptr, size, POSIX_MADV_DONTNEED) != 0)
108  ERR("madvise() failed");
109  }
110 
111  return;
112 }
113 
114 /*
115  * Creat and open a file through the POSIX interface, then setup mmap.
116  */
117 static void *MMAP_Create(char *testFileName, IOR_param_t * param)
118 {
119  int *fd;
120 
121  fd = POSIX_Create(testFileName, param);
122  if (ftruncate(*fd, param->expectedAggFileSize) != 0)
123  ERR("ftruncate() failed");
124  ior_mmap_file(fd, param);
125  return ((void *)fd);
126 }
127 
128 /*
129  * Open a file through the POSIX interface and setup mmap.
130  */
131 static void *MMAP_Open(char *testFileName, IOR_param_t * param)
132 {
133  int *fd;
134 
135  fd = POSIX_Open(testFileName, param);
136  ior_mmap_file(fd, param);
137  return ((void *)fd);
138 }
139 
140 /*
141  * Write or read access to file using mmap
142  */
143 static IOR_offset_t MMAP_Xfer(int access, void *file, IOR_size_t * buffer,
144  IOR_offset_t length, IOR_param_t * param)
145 {
147  if (access == WRITE) {
148  memcpy(o->mmap_ptr + param->offset, buffer, length);
149  } else {
150  memcpy(buffer, o->mmap_ptr + param->offset, length);
151  }
152 
153  if (param->fsyncPerWrite == TRUE) {
154  if (msync(o->mmap_ptr + param->offset, length, MS_SYNC) != 0)
155  ERR("msync() failed");
156  if (posix_madvise(o->mmap_ptr + param->offset, length,
157  POSIX_MADV_DONTNEED) != 0)
158  ERR("madvise() failed");
159  }
160  return (length);
161 }
162 
163 /*
164  * Perform msync().
165  */
166 static void MMAP_Fsync(void *fd, IOR_param_t * param)
167 {
169  if (msync(o->mmap_ptr, param->expectedAggFileSize, MS_SYNC) != 0)
170  EWARN("msync() failed");
171 }
172 
173 /*
174  * Close a file through the POSIX interface, after tear down the mmap.
175  */
176 static void MMAP_Close(void *fd, IOR_param_t * param)
177 {
179  if (munmap(o->mmap_ptr, param->expectedAggFileSize) != 0)
180  ERR("munmap failed");
181  o->mmap_ptr = NULL;
182  POSIX_Close(fd, param);
183 }
#define ERR(MSG)
Definition: iordef.h:184
#define LAST_OPTION
Definition: option.h:37
ior_aiori_t mmap_aiori
Definition: aiori-MMAP.c:39
static int size
Definition: mdtest.c:91
void * POSIX_Open(char *testFileName, IOR_param_t *param)
Definition: aiori-POSIX.c:453
static void ior_mmap_file(int *file, IOR_param_t *param)
Definition: aiori-MMAP.c:82
static void * MMAP_Create(char *, IOR_param_t *)
Definition: aiori-MMAP.c:117
static void MMAP_Fsync(void *, IOR_param_t *)
Definition: aiori-MMAP.c:166
int fsyncPerWrite
Definition: ior.h:162
#define WRITE
Definition: iordef.h:95
#define EWARN(MSG)
Definition: iordef.h:169
void * mmap_ptr
Definition: aiori-MMAP.c:55
void * backend_options
Definition: ior.h:158
static option_help * MMAP_options(void **init_backend_options, void *init_values)
Definition: aiori-MMAP.c:61
void * POSIX_Create(char *testFileName, IOR_param_t *param)
Definition: aiori-POSIX.c:321
char * aiori_get_version()
Definition: aiori.c:200
int madv_dont_need
Definition: aiori-MMAP.c:57
void POSIX_Delete(char *testFileName, IOR_param_t *param)
Definition: aiori-POSIX.c:614
IOR_offset_t expectedAggFileSize
Definition: ior.h:127
static void MMAP_Close(void *, IOR_param_t *)
Definition: aiori-MMAP.c:176
IOR_offset_t POSIX_GetFileSize(IOR_param_t *test, MPI_Comm testComm, char *testFileName)
Definition: aiori-POSIX.c:627
static IOR_param_t param
Definition: mdtest.c:170
static void * MMAP_Open(char *, IOR_param_t *)
Definition: aiori-MMAP.c:131
int direct_io_ignored
Definition: aiori-MMAP.c:54
long long int IOR_size_t
Definition: iordef.h:123
static IOR_offset_t MMAP_Xfer(int, void *, IOR_size_t *, IOR_offset_t, IOR_param_t *)
Definition: aiori-MMAP.c:143
int randomOffset
Definition: ior.h:150
void POSIX_Close(void *fd, IOR_param_t *param)
Definition: aiori-POSIX.c:602
IOR_offset_t offset
Definition: ior.h:126
int open
Definition: ior.h:108
char * name
Definition: aiori.h:68
long long int IOR_offset_t
Definition: iordef.h:122
#define TRUE
Definition: iordef.h:75
static struct cephfs_options o
Definition: aiori-CEPHFS.c:48
#define NULL
Definition: iordef.h:79