X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=memory.c;h=e969221f36f86a8a1c74b502152a97e75f81c219;hb=9db01ef976006c002b05fa4e4ec589eb029aac5b;hp=f97749bc72c657f7b0d9f3739853dd7039797280;hpb=c41a9d06a1957ba7c5a019e3d6088a5e8e8e0a47;p=fio.git diff --git a/memory.c b/memory.c index f97749bc..e969221f 100644 --- a/memory.c +++ b/memory.c @@ -5,7 +5,9 @@ #include #include #include +#ifndef FIO_NO_HAVE_SHM_H #include +#endif #include #include "fio.h" @@ -115,10 +117,19 @@ 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; + + /* TODO: make sure the file is a real hugetlbfs file */ + if (!td->o.mmapfile) + flags |= MAP_HUGETLB; + total_mem = (total_mem + mask) & ~mask; + } + if (td->o.mmapfile) { td->mmapfd = open(td->o.mmapfile, O_RDWR|O_CREAT, 0644); @@ -127,13 +138,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);