int mca_spml_ucx_deregister(sshmem_mkey_t *mkeys) { spml_ucx_mkey_t *ucx_mkey; map_segment_t *mem_seg; int segno; int my_pe = oshmem_my_proc_id(); MCA_SPML_CALL(quiet(oshmem_ctx_default)); if (!mkeys) return OSHMEM_SUCCESS; if (!mkeys[0].spml_context) return OSHMEM_SUCCESS; mem_seg = memheap_find_va(mkeys[0].va_base); ucx_mkey = (spml_ucx_mkey_t*)mkeys[0].spml_context; if (OPAL_UNLIKELY(NULL == mem_seg)) { return OSHMEM_ERROR; } if (MAP_SEGMENT_ALLOC_UCX != mem_seg->type) { ucp_mem_unmap(mca_spml_ucx.ucp_context, ucx_mkey->mem_h); } ucp_rkey_destroy(ucx_mkey->rkey); ucx_mkey->rkey = NULL; if (0 < mkeys[0].len) { ucp_rkey_buffer_release(mkeys[0].u.data); } free(mkeys); return OSHMEM_SUCCESS; }
sshmem_mkey_t *mca_memheap_base_get_mkey(void* va, int tr_id) { map_segment_t *s; s = memheap_find_va(va); return ((s && MAP_SEGMENT_IS_VALID(s)) ? &s->mkeys[tr_id] : NULL ); }
uint64_t mca_memheap_base_find_offset(int pe, int tr_id, void* va, void* rva) { map_segment_t *s; int my_pe = oshmem_my_proc_id(); s = memheap_find_va(va); if (my_pe == pe) { return (uintptr_t)va - (uintptr_t)s->seg_base_addr; } else { return ((s && MAP_SEGMENT_IS_VALID(s)) ? ((uintptr_t)rva - (uintptr_t)(s->mkeys_cache[pe][tr_id].va_base)) : 0); } }
int mca_memheap_base_detect_addr_type(void* va) { int addr_type = ADDR_INVALID; map_segment_t *s; s = memheap_find_va(va); if (s) { if (s->type == MAP_SEGMENT_STATIC) { addr_type = ADDR_STATIC; } else if ((uintptr_t)va >= (uintptr_t) s->seg_base_addr && (uintptr_t)va < (uintptr_t) ((uintptr_t)s->seg_base_addr + mca_memheap.memheap_size)) { addr_type = ADDR_USER; } else { assert( (uintptr_t)va >= (uintptr_t) ((uintptr_t)s->seg_base_addr + mca_memheap.memheap_size) && (uintptr_t)va < (uintptr_t)s->end); addr_type = ADDR_PRIVATE; } } return addr_type; }
int mca_memheap_base_is_symmetric_addr(const void* va) { return (memheap_find_va(va) ? 1 : 0); }