From: Shaohua Li Date: Thu, 17 Jan 2013 12:28:15 +0000 (+0100) Subject: Make hugetlbfs maping work X-Git-Tag: fio-2.0.14~118 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=d9759b1e4081cc45b958d8ffd06607260cb5557e Make hugetlbfs maping work 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 --- diff --git a/memory.c b/memory.c index 4a9dc4af..3759c8c5 100644 --- 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); diff --git a/options.c b/options.c index 17607620..8d460be2 100644 --- 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; }