ucs_status_t uct_iface_mem_alloc(uct_iface_h tl_iface, size_t length, unsigned flags, const char *name, uct_allocated_memory_t *mem) { uct_base_iface_t *iface = ucs_derived_of(tl_iface, uct_base_iface_t); uct_md_attr_t md_attr; ucs_status_t status; status = uct_mem_alloc(NULL, length, UCT_MD_MEM_ACCESS_ALL, iface->config.alloc_methods, iface->config.num_alloc_methods, &iface->md, 1, name, mem); if (status != UCS_OK) { goto err; } /* If the memory was not allocated using MD, register it */ if (mem->method != UCT_ALLOC_METHOD_MD) { status = uct_md_query(iface->md, &md_attr); if (status != UCS_OK) { goto err_free; } /* If MD does not support registration, allow only the MD method */ if ((md_attr.cap.flags & UCT_MD_FLAG_REG) && (md_attr.cap.reg_mem_types & UCS_BIT(mem->mem_type))) { status = uct_md_mem_reg(iface->md, mem->address, mem->length, flags, &mem->memh); if (status != UCS_OK) { goto err_free; } ucs_assert(mem->memh != UCT_MEM_HANDLE_NULL); } else { mem->memh = UCT_MEM_HANDLE_NULL; } mem->md = iface->md; } return UCS_OK; err_free: uct_mem_free(mem); err: return status; }
ucs_status_t uct_iface_mem_alloc(uct_iface_h tl_iface, size_t length, const char *name, uct_allocated_memory_t *mem) { uct_base_iface_t *iface = ucs_derived_of(tl_iface, uct_base_iface_t); uct_md_attr_t md_attr; ucs_status_t status; status = uct_mem_alloc(length, iface->config.alloc_methods, iface->config.num_alloc_methods, &iface->md, 1, name, mem); if (status != UCS_OK) { goto err; } /* If the memory was not allocated using MD, register it */ if (mem->method != UCT_ALLOC_METHOD_MD) { status = uct_md_query(iface->md, &md_attr); if (status != UCS_OK) { goto err_free; } /* If MD does not support registration, allow only the MD method */ if (!(md_attr.cap.flags & UCT_MD_FLAG_REG)) { ucs_error("%s md does not support registration, so cannot use any allocation " "method except 'md'", iface->md->component->name); status = UCS_ERR_NO_MEMORY; goto err_free; } status = uct_md_mem_reg(iface->md, mem->address, mem->length, &mem->memh); if (status != UCS_OK) { goto err_free; } ucs_assert(mem->memh != UCT_INVALID_MEM_HANDLE); mem->md = iface->md; } return UCS_OK; err_free: uct_mem_free(mem); err: return status; }