Make hugetlbfs maping work
authorShaohua Li <ShLi@fusionio.com>
Thu, 17 Jan 2013 12:28:15 +0000 (13:28 +0100)
committerJens Axboe <axboe@kernel.dk>
Thu, 17 Jan 2013 12:28:15 +0000 (13:28 +0100)
If it's a file mapping, flags must be MAP_HARED; If it's an anonymous
mapping, flags must be MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB (can be
shared, but doesn't matter here).

Signed-off-by: Jens Axboe <axboe@kernel.dk>
memory.c
options.c

index 4a9dc4af212d05feee7b360c9fd6dd08ea6200f4..3759c8c58ae51fb5b1b3cef1e36f6dc24fd23c2a 100644 (file)
--- a/memory.c
+++ b/memory.c
@@ -119,14 +119,16 @@ static void free_mem_shm(struct thread_data *td)
 
 static int alloc_mem_mmap(struct thread_data *td, size_t total_mem)
 {
-       int flags = MAP_PRIVATE;
+       int flags = 0;
 
        td->mmapfd = 1;
 
        if (td->o.mem_type == MEM_MMAPHUGE) {
                unsigned long mask = td->o.hugepage_size - 1;
 
-               flags |= MAP_HUGETLB;
+               /* TODO: make sure the file is a real hugetlbfs file */
+               if (!td->mmapfile)
+                       flags |= MAP_HUGETLB;
                total_mem = (total_mem + mask) & ~mask;
        }
 
@@ -138,13 +140,18 @@ static int alloc_mem_mmap(struct thread_data *td, size_t total_mem)
                        td->orig_buffer = NULL;
                        return 1;
                }
-               if (ftruncate(td->mmapfd, total_mem) < 0) {
+               if (td->o.mem_type != MEM_MMAPHUGE &&
+                   ftruncate(td->mmapfd, total_mem) < 0) {
                        td_verror(td, errno, "truncate mmap file");
                        td->orig_buffer = NULL;
                        return 1;
                }
+               if (td->o.mem_type == MEM_MMAPHUGE)
+                       flags |= MAP_SHARED;
+               else
+                       flags |= MAP_PRIVATE;
        } else
-               flags |= OS_MAP_ANON;
+               flags |= OS_MAP_ANON | MAP_PRIVATE;
 
        td->orig_buffer = mmap(NULL, total_mem, PROT_READ | PROT_WRITE, flags,
                                td->mmapfd, 0);
index 1760762040c65fb83d0eb10a0466738c514551ec..8d460be229a51c659c5f7a07a6f3c4aec0e1f782 100644 (file)
--- a/options.c
+++ b/options.c
@@ -342,13 +342,8 @@ static int str_mem_cb(void *data, const char *mem)
 {
        struct thread_data *td = data;
 
-       if (td->o.mem_type == MEM_MMAPHUGE || td->o.mem_type == MEM_MMAP) {
+       if (td->o.mem_type == MEM_MMAPHUGE || td->o.mem_type == MEM_MMAP)
                td->mmapfile = get_opt_postfix(mem);
-               if (td->o.mem_type == MEM_MMAPHUGE && !td->mmapfile) {
-                       log_err("fio: mmaphuge:/path/to/file\n");
-                       return 1;
-               }
-       }
 
        return 0;
 }