1
1

updated IB memory registry support with new public

interfaces for the other IB PTL code

This commit was SVN r3762.
Этот коммит содержится в:
Mitch Sukalski 2004-12-09 16:28:38 +00:00
родитель 13d23efb65
Коммит 02d5381c25
2 изменённых файлов: 75 добавлений и 1 удалений

Просмотреть файл

@ -142,7 +142,7 @@ mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_mem_registry_register(
/* create new entry and register memory region */
item = (ompi_list_item_t *)info;
OMPI_FREE_LIST_GET(&(registry->info_free_list), item, rc);
if (info == (mca_ptl_ib_mem_registry_info_t *)NULL) {
if (OMPI_SUCCESS != rc) {
/* error - return null pointer */
return info;
}
@ -165,9 +165,14 @@ mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_mem_registry_register(
item = (ompi_list_item_t *)info;
OMPI_FREE_LIST_RETURN(&(registry->info_free_list), item);
info = NULL;
return info;
}
}
} while ((VAPI_OK != vapi_result) && (NULL != info));
/* insert a reference to this information into the red/black tree */
rc = ompi_rb_tree_insert(&(registry->rb_tree), &(info->reply), info);
/* aargh! what do we do if the tree insert fails... */
mca_ptl_ib_mem_registry_insert_hint(registry, &(info->reply), info);
}
else {
(info->ref_cnt)++;
@ -176,6 +181,44 @@ mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_mem_registry_register(
return info;
}
mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_register_mem_with_registry(
mca_ptl_ib_state_t *ib_state,
void *addr, size_t len)
{
mca_ptl_ib_mem_registry_info_t *info;
VAPI_mr_t mr;
mr.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE;
mr.l_key = 0;
mr.r_key = 0;
mr.pd_hndl = ib_state->ptag;
mr.size = len;
mr.start = (VAPI_virt_addr_t) (MT_virt_addr_t) addr;
mr.type = VAPI_MR;
info = mca_ptl_ib_mem_registry_register(&(ib_state->mem_registry),&mr);
return info;
}
int mca_ptl_ib_deregister_mem_with_registry(
mca_ptl_ib_state_t *ib_state,
void *addr, size_t len)
{
VAPI_mr_t mr;
int rc;
mr.acl = VAPI_EN_LOCAL_WRITE | VAPI_EN_REMOTE_WRITE;
mr.l_key = 0;
mr.r_key = 0;
mr.pd_hndl = ib_state->ptag;
mr.size = len;
mr.start = (VAPI_virt_addr_t) (MT_virt_addr_t) addr;
mr.type = VAPI_MR;
rc = mca_ptl_ib_mem_registry_deregister(&(ib_state->mem_registry),&mr);
return rc;
}
static int mca_ptl_ib_mem_registry_real_deregister(
mca_ptl_ib_mem_registry_t *registry,
mca_ptl_ib_mem_registry_info_t *info)

Просмотреть файл

@ -65,6 +65,27 @@ struct mca_ptl_ib_mem_registry_t {
OBJ_CLASS_DECLARATION(mca_ptl_ib_mem_registry_t);
static inline void mca_ptl_ib_mem_registry_insert_hint(
mca_ptl_ib_mem_registry_t *registry, VAPI_mr_t *key,
mca_ptl_ib_mem_registry_info_t *info)
{
uint64_t hints_hash = 0, addrll;
if (registry->hints_size) {
addrll = (uint64_t)(key->start);
/* calculate hash index for hints array - hash is (hints_log_size - 1) bits of key
* from first non-zero least significant bit
*/
hints_hash = addrll & (-addrll);
hints_hash = (((hints_hash << registry->hints_log_size) - hints_hash) & addrll) /
hints_hash;
registry->hints[hints_hash].pval = info;
}
return;
}
/* find information on a registered memory region for a given address,
* region size, and access permissions
*
@ -105,10 +126,20 @@ static inline mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_mem_registry_find(
return info;
}
/* prototypes */
mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_mem_registry_register(
mca_ptl_ib_mem_registry_t *registry,
VAPI_mr_t *mr);
mca_ptl_ib_mem_registry_info_t *mca_ptl_ib_register_mem_with_registry(
struct mca_ptl_ib_state_t *ib_state,
void *addr, size_t len);
int mca_ptl_ib_deregister_mem_with_registry(
struct mca_ptl_ib_state_t *ib_state,
void *addr, size_t len);
int mca_ptl_ib_mem_registry_deregister(
mca_ptl_ib_mem_registry_t *registry,
VAPI_mr_t *mr);