+ 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 && !(td->flags & TD_F_MMAP_KEEP))
+ 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);
+ if (!(td->flags & TD_F_MMAP_KEEP))
+ 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;
+ }
+
+ td->gpu_dev_id = td->o.gpu_dev_id;
+ ret = cuDeviceGet(&td->cu_dev, td->gpu_dev_id);
+ if (ret != CUDA_SUCCESS) {
+ log_err("fio: failed get GPU device\n");
+ return 1;
+ }
+
+ ret = cuDeviceGetName(name, sizeof(name), td->gpu_dev_id);
+ if (ret != CUDA_SUCCESS) {
+ log_err("fio: failed get device name\n");
+ return 1;
+ }
+ dprint(FD_MEM, "dev_id = [%d], device name = [%s]\n", \
+ td->gpu_dev_id, name);
+
+ ret = cuCtxCreate(&td->cu_ctx, CU_CTX_MAP_HOST, td->cu_dev);
+ if (ret != CUDA_SUCCESS) {
+ log_err("fio: failed to create cuda context: %d\n", ret);
+ return 1;
+ }
+
+ ret = cuMemAlloc(&td->dev_mem_ptr, total_mem);
+ if (ret != CUDA_SUCCESS) {
+ log_err("fio: cuMemAlloc %zu bytes failed\n", total_mem);
+ return 1;