int shmem_transport_xpmem_init(long eager_size) { long page_size = sysconf(_SC_PAGESIZE); char *base; size_t len; int ret; /* setup data region */ base = FIND_BASE(shmem_internal_data_base, page_size); len = FIND_LEN(shmem_internal_data_base, shmem_internal_data_length, page_size); my_info.data_seg = xpmem_make(base, len, XPMEM_PERMIT_MODE, (void*)0666); if (-1 == my_info.data_seg) { fprintf(stderr, "[%03d] ERROR: xpmem_make failed: %s\n", shmem_internal_my_pe, strerror(errno)); return 1; } my_info.data_off = (char*) shmem_internal_data_base - (char*) base; my_info.data_len = len; /* setup heap region */ base = FIND_BASE(shmem_internal_heap_base, page_size); len = FIND_LEN(shmem_internal_heap_base, shmem_internal_heap_length, page_size); my_info.heap_seg = xpmem_make(base, len, XPMEM_PERMIT_MODE, (void*)0666); if (-1 == my_info.heap_seg) { fprintf(stderr, "[%03d] ERROR: xpmem_make failed: %s\n", shmem_internal_my_pe, strerror(errno)); return 1; } my_info.heap_off = (char*) shmem_internal_heap_base - (char*) base; my_info.heap_len = len; ret = shmem_runtime_put("xpmem-segids", &my_info, sizeof(struct share_info_t)); if (0 != ret) { fprintf(stderr, "[%03d] ERROR: runtime_put failed: %d\n", shmem_internal_my_pe, ret); return 1; } return 0; }
int mca_btl_vader_xpmem_init (void) { mca_btl_vader_component.my_seg_id = xpmem_make (0, VADER_MAX_ADDRESS, XPMEM_PERMIT_MODE, (void *)0666); if (-1 == mca_btl_vader_component.my_seg_id) { return OPAL_ERR_NOT_AVAILABLE; } mca_btl_vader.super.btl_get = mca_btl_vader_get_xpmem; mca_btl_vader.super.btl_put = mca_btl_vader_put_xpmem; return OPAL_SUCCESS; }
static ucs_status_t uct_xmpem_reg(void *address, size_t size, uct_mm_id_t *mmid_p) { xpmem_segid_t segid; void *start, *end; start = ucs_align_down_pow2_ptr(address, ucs_get_page_size()); end = ucs_align_up_pow2_ptr(address + size, ucs_get_page_size()); ucs_assert_always(start <= end); segid = xpmem_make(start, end - start, XPMEM_PERMIT_MODE, (void*)0666); VALGRIND_MAKE_MEM_DEFINED(&segid, sizeof(segid)); if (segid < 0) { ucs_error("Failed to register %p..%p with xpmem: %m", start, end); return UCS_ERR_IO_ERROR; } ucs_trace("xpmem registered %p..%p segment 0x%llx", start, end, segid); *mmid_p = segid; return UCS_OK; }
/* * User ioctl to the XPMEM driver. Only 64-bit user applications are * supported. */ static long xpmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret; switch (cmd) { case XPMEM_CMD_VERSION: { return XPMEM_CURRENT_VERSION; } case XPMEM_CMD_MAKE: { struct xpmem_cmd_make make_info; xpmem_segid_t segid; if (copy_from_user(&make_info, (void __user *)arg, sizeof(struct xpmem_cmd_make))) return -EFAULT; ret = xpmem_make(make_info.vaddr, make_info.size, make_info.permit_type, (void *)make_info.permit_value, &segid); if (ret != 0) return ret; if (put_user(segid, &((struct xpmem_cmd_make __user *)arg)->segid)) { (void)xpmem_remove(segid); return -EFAULT; } return 0; } case XPMEM_CMD_REMOVE: { struct xpmem_cmd_remove remove_info; if (copy_from_user(&remove_info, (void __user *)arg, sizeof(struct xpmem_cmd_remove))) return -EFAULT; return xpmem_remove(remove_info.segid); } case XPMEM_CMD_GET: { struct xpmem_cmd_get get_info; xpmem_apid_t apid; if (copy_from_user(&get_info, (void __user *)arg, sizeof(struct xpmem_cmd_get))) return -EFAULT; ret = xpmem_get(get_info.segid, get_info.flags, get_info.permit_type, (void *)get_info.permit_value, &apid); if (ret != 0) return ret; if (put_user(apid, &((struct xpmem_cmd_get __user *)arg)->apid)) { (void)xpmem_release(apid); return -EFAULT; } return 0; } case XPMEM_CMD_RELEASE: { struct xpmem_cmd_release release_info; if (copy_from_user(&release_info, (void __user *)arg, sizeof(struct xpmem_cmd_release))) return -EFAULT; return xpmem_release(release_info.apid); } case XPMEM_CMD_ATTACH: { struct xpmem_cmd_attach attach_info; u64 at_vaddr; if (copy_from_user(&attach_info, (void __user *)arg, sizeof(struct xpmem_cmd_attach))) return -EFAULT; ret = xpmem_attach(file, attach_info.apid, attach_info.offset, attach_info.size, attach_info.vaddr, attach_info.fd, attach_info.flags, &at_vaddr); if (ret != 0) return ret; if (put_user(at_vaddr, &((struct xpmem_cmd_attach __user *)arg)->vaddr)) { (void)xpmem_detach(at_vaddr); return -EFAULT; } return 0; } case XPMEM_CMD_DETACH: { struct xpmem_cmd_detach detach_info; if (copy_from_user(&detach_info, (void __user *)arg, sizeof(struct xpmem_cmd_detach))) return -EFAULT; return xpmem_detach(detach_info.vaddr); } case XPMEM_CMD_FORK_BEGIN: { return xpmem_fork_begin(); } case XPMEM_CMD_FORK_END: { return xpmem_fork_end(); } default: break; } return -ENOIOCTLCMD; }