+ if (td->o.mem_type != MEM_MMAPHUGE &&
+ td->o.mem_type != MEM_MMAPSHARED &&
+ 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 ||
+ td->o.mem_type == MEM_MMAPSHARED)
+ flags |= MAP_SHARED;
+ else
+ flags |= MAP_PRIVATE;
+ } else
+ flags |= OS_MAP_ANON | MAP_PRIVATE;
+
+ td->orig_buffer = mmap(NULL, total_mem, PROT_READ | PROT_WRITE, flags,
+ td->mmapfd, 0);
+ dprint(FD_MEM, "mmap %llu/%d %p\n", (unsigned long long) total_mem,
+ td->mmapfd, td->orig_buffer);
+ if (td->orig_buffer == MAP_FAILED) {
+ td_verror(td, errno, "mmap");
+ td->orig_buffer = NULL;
+ if (td->mmapfd != 1 && td->mmapfd != -1) {
+ close(td->mmapfd);
+ if (td->o.mmapfile)
+ unlink(td->o.mmapfile);
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static void free_mem_mmap(struct thread_data *td, size_t total_mem)
+{
+ dprint(FD_MEM, "munmap %llu %p\n", (unsigned long long) total_mem,
+ td->orig_buffer);
+ munmap(td->orig_buffer, td->orig_buffer_size);
+ if (td->o.mmapfile) {
+ if (td->mmapfd != -1)
+ close(td->mmapfd);
+ unlink(td->o.mmapfile);
+ free(td->o.mmapfile);
+ }
+}
+
+static int alloc_mem_malloc(struct thread_data *td, size_t total_mem)
+{
+ td->orig_buffer = malloc(total_mem);
+ dprint(FD_MEM, "malloc %llu %p\n", (unsigned long long) total_mem,
+ td->orig_buffer);
+
+ return td->orig_buffer == NULL;
+}
+
+static void free_mem_malloc(struct thread_data *td)
+{
+ dprint(FD_MEM, "free malloc mem %p\n", td->orig_buffer);
+ free(td->orig_buffer);
+}
+
+static int alloc_mem_cudamalloc(struct thread_data *td, size_t total_mem)
+{
+#ifdef CONFIG_CUDA
+ CUresult ret;
+ char name[128];
+
+ ret = cuInit(0);
+ if (ret != CUDA_SUCCESS) {
+ log_err("fio: failed initialize cuda driver api\n");
+ return 1;
+ }
+
+ ret = cuDeviceGetCount(&td->gpu_dev_cnt);
+ if (ret != CUDA_SUCCESS) {
+ log_err("fio: failed get device count\n");
+ return 1;
+ }
+ dprint(FD_MEM, "found %d GPU devices\n", td->gpu_dev_cnt);
+
+ if (td->gpu_dev_cnt == 0) {
+ log_err("fio: no GPU device found. "
+ "Can not perform GPUDirect RDMA.\n");
+ return 1;