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 "aiori-POSIX.h"
26 #include "iordef.h"
27 #include "utilities.h"
28 
29 /**************************** P R O T O T Y P E S *****************************/
30 static aiori_fd_t *MMAP_Create(char *, int flags, aiori_mod_opt_t *);
31 static aiori_fd_t *MMAP_Open(char *, int flags, aiori_mod_opt_t *);
34 static void MMAP_Close(aiori_fd_t *, aiori_mod_opt_t *);
35 static void MMAP_Fsync(aiori_fd_t *, aiori_mod_opt_t *);
36 static option_help * MMAP_options(aiori_mod_opt_t ** init_backend_options, aiori_mod_opt_t * init_values);
37 static void MMAP_xfer_hints(aiori_xfer_hint_t * params);
39 /************************** D E C L A R A T I O N S ***************************/
40 
42  .name = "MMAP",
43  .create = MMAP_Create,
44  .open = MMAP_Open,
45  .xfer = MMAP_Xfer,
46  .close = MMAP_Close,
47  .delete = POSIX_Delete,
48  .xfer_hints = MMAP_xfer_hints,
49  .get_version = aiori_get_version,
50  .fsync = MMAP_Fsync,
51  .get_file_size = POSIX_GetFileSize,
52  .get_options = MMAP_options,
53  .check_params = MMAP_check_params
54 };
55 
56 /***************************** F U N C T I O N S ******************************/
57 typedef struct{
58  int direct_io_ignored; /* this option is ignored */
59  void* mmap_ptr; /* for internal usage */
60 
64 
65 static option_help * MMAP_options(aiori_mod_opt_t ** init_backend_options, aiori_mod_opt_t * init_values){
66  mmap_options_t * o = malloc(sizeof(mmap_options_t));
67 
68  if (init_values != NULL){
69  memcpy(o, init_values, sizeof(mmap_options_t));
70  }else{
71  memset(o, 0, sizeof(mmap_options_t));
72  }
73 
74  *init_backend_options = (aiori_mod_opt_t*) o;
75 
76  option_help h [] = {
77  {0, "mmap.madv_dont_need", "Use advise don't need", OPTION_FLAG, 'd', & o->madv_dont_need},
78  {0, "mmap.madv_pattern", "Use advise to indicate the pattern random/sequential", OPTION_FLAG, 'd', & o->madv_pattern},
80  };
81  option_help * help = malloc(sizeof(h));
82  memcpy(help, h, sizeof(h));
83  return help;
84 }
85 
87 
88 static void MMAP_xfer_hints(aiori_xfer_hint_t * params){
89  hints = params;
90  POSIX_xfer_hints(params);
91 }
92 
94  if (hints->fsyncPerWrite && (hints->transferSize & (sysconf(_SC_PAGESIZE) - 1)))
95  ERR("transfer size must be aligned with PAGESIZE for MMAP with fsyncPerWrite");
96  return 0;
97 }
98 
99 static void ior_mmap_file(int *file, int mflags, void *param)
100 {
101  int flags = PROT_READ;
102  IOR_offset_t size = hints->expectedAggFileSize;
103 
104  if (mflags & IOR_WRONLY || mflags & IOR_RDWR)
105  flags |= PROT_WRITE;
106  mmap_options_t *o = (mmap_options_t*) param;
107 
108  o->mmap_ptr = mmap(NULL, size, flags, MAP_SHARED,
109  *file, 0);
110  if (o->mmap_ptr == MAP_FAILED)
111  ERR("mmap() failed");
112 
113  if (hints->randomOffset)
114  flags = POSIX_MADV_RANDOM;
115  else
116  flags = POSIX_MADV_SEQUENTIAL;
117 
118  if(o->madv_pattern){
119  if (posix_madvise(o->mmap_ptr, size, flags) != 0)
120  ERR("madvise() failed");
121  }
122 
123  if (o->madv_dont_need){
124  if (posix_madvise(o->mmap_ptr, size, POSIX_MADV_DONTNEED) != 0)
125  ERR("madvise() failed");
126  }
127 
128  return;
129 }
130 
131 /*
132  * Create and open a file through the POSIX interface, then setup mmap.
133  */
134 static aiori_fd_t *MMAP_Create(char *testFileName, int flags, aiori_mod_opt_t * param)
135 {
136  int *fd;
137 
138  fd = (int*) POSIX_Create(testFileName, flags, param);
139  if (ftruncate(*fd, hints->expectedAggFileSize) != 0)
140  ERR("ftruncate() failed");
141  ior_mmap_file(fd, flags, param);
142  return ((aiori_fd_t *)fd);
143 }
144 
145 /*
146  * Open a file through the POSIX interface and setup mmap.
147  */
148 static aiori_fd_t *MMAP_Open(char *testFileName, int flags, aiori_mod_opt_t * param)
149 {
150  int *fd;
151  fd = (int*) POSIX_Open(testFileName, flags, param);
152  ior_mmap_file(fd, flags, param);
153  return ((aiori_fd_t *)fd);
154 }
155 
156 /*
157  * Write or read access to file using mmap
158  */
159 static IOR_offset_t MMAP_Xfer(int access, aiori_fd_t *file, IOR_size_t * buffer,
161 {
162  mmap_options_t *o = (mmap_options_t*) param;
163  if (access == WRITE) {
164  memcpy(o->mmap_ptr + offset, buffer, length);
165  } else {
166  memcpy(buffer, o->mmap_ptr + offset, length);
167  }
168 
169  if (hints->fsyncPerWrite == TRUE) {
170  if (msync(o->mmap_ptr + offset, length, MS_SYNC) != 0)
171  ERR("msync() failed");
172  if (posix_madvise(o->mmap_ptr + offset, length,
173  POSIX_MADV_DONTNEED) != 0)
174  ERR("madvise() failed");
175  }
176  return (length);
177 }
178 
179 /*
180  * Perform msync().
181  */
182 static void MMAP_Fsync(aiori_fd_t *fd, aiori_mod_opt_t * param)
183 {
184  mmap_options_t *o = (mmap_options_t*) param;
185  if (msync(o->mmap_ptr, hints->expectedAggFileSize, MS_SYNC) != 0)
186  EWARN("msync() failed");
187 }
188 
189 /*
190  * Close a file through the POSIX interface, after tear down the mmap.
191  */
192 static void MMAP_Close(aiori_fd_t *fd, aiori_mod_opt_t * param)
193 {
194  mmap_options_t *o = (mmap_options_t*) param;
195  if (munmap(o->mmap_ptr, hints->expectedAggFileSize) != 0)
196  ERR("munmap failed");
197  o->mmap_ptr = NULL;
198  POSIX_Close(fd, param);
199 }
static aiori_fd_t * MMAP_Open(char *, int flags, aiori_mod_opt_t *)
Definition: aiori-MMAP.c:148
static void ior_mmap_file(int *file, int mflags, void *param)
Definition: aiori-MMAP.c:99
#define LAST_OPTION
Definition: option.h:39
static void MMAP_xfer_hints(aiori_xfer_hint_t *params)
Definition: aiori-MMAP.c:88
ior_aiori_t mmap_aiori
Definition: aiori-MMAP.c:41
struct benchmark_options o
Definition: md-workbench.c:128
static option_help * MMAP_options(aiori_mod_opt_t **init_backend_options, aiori_mod_opt_t *init_values)
Definition: aiori-MMAP.c:65
void POSIX_Close(aiori_fd_t *afd, aiori_mod_opt_t *param)
Definition: aiori-POSIX.c:688
IOR_offset_t expectedAggFileSize
Definition: aiori.h:74
#define WRITE
Definition: iordef.h:86
void * mmap_ptr
Definition: aiori-MMAP.c:59
static IOR_offset_t MMAP_Xfer(int, aiori_fd_t *, IOR_size_t *, IOR_offset_t, IOR_offset_t, aiori_mod_opt_t *)
Definition: aiori-MMAP.c:159
aiori_fd_t * POSIX_Open(char *testFileName, int flags, aiori_mod_opt_t *param)
Definition: aiori-POSIX.c:529
char * aiori_get_version()
Definition: aiori.c:232
aiori_fd_t * POSIX_Create(char *testFileName, int flags, aiori_mod_opt_t *param)
Definition: aiori-POSIX.c:401
int madv_dont_need
Definition: aiori-MMAP.c:61
static option_help options[]
Definition: aiori-CEPHFS.c:54
void POSIX_Delete(char *testFileName, aiori_mod_opt_t *param)
Definition: aiori-POSIX.c:708
static aiori_fd_t * MMAP_Create(char *, int flags, aiori_mod_opt_t *)
Definition: aiori-MMAP.c:134
static void MMAP_Close(aiori_fd_t *, aiori_mod_opt_t *)
Definition: aiori-MMAP.c:192
Definition: ior.h:56
#define EWARN(MSG)
Definition: aiori-debug.h:59
IOR_offset_t transferSize
Definition: aiori.h:73
#define IOR_WRONLY
Definition: aiori.h:29
int direct_io_ignored
Definition: aiori-MMAP.c:58
static aiori_xfer_hint_t * hints
Definition: aiori-MMAP.c:86
long long int IOR_size_t
Definition: iordef.h:110
void POSIX_xfer_hints(aiori_xfer_hint_t *params)
Definition: aiori-POSIX.c:191
int randomOffset
Definition: aiori.h:69
#define ERR(MSG)
Definition: aiori-debug.h:92
#define IOR_RDWR
Definition: aiori.h:30
static int MMAP_check_params(aiori_mod_opt_t *options)
Definition: aiori-MMAP.c:93
int fsyncPerWrite
Definition: aiori.h:70
char * name
Definition: aiori.h:88
long long int IOR_offset_t
Definition: iordef.h:109
#define TRUE
Definition: iordef.h:66
IOR_offset_t POSIX_GetFileSize(aiori_mod_opt_t *test, char *testFileName)
Definition: aiori-POSIX.c:731
#define NULL
Definition: iordef.h:70
static void MMAP_Fsync(aiori_fd_t *, aiori_mod_opt_t *)
Definition: aiori-MMAP.c:182