* fill in some more of the chunk mamagement code (chunks == array of memory
used for the rolling recv buffers for non-RDMA messages) This commit was SVN r6355.
Этот коммит содержится в:
родитель
d4bd7252a0
Коммит
465e206216
@ -44,3 +44,58 @@ mca_btl_portals_process_recv(mca_btl_portals_module_t *module,
|
||||
{
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
mca_btl_portals_recv_chunk_t*
|
||||
mca_btl_portals_recv_chunk_init(mca_btl_portals_module_t *module)
|
||||
{
|
||||
mca_btl_portals_recv_chunk_t *chunk;
|
||||
|
||||
chunk = OBJ_NEW(mca_btl_portals_recv_chunk_t);
|
||||
chunk->btl = module;
|
||||
chunk->length = module->portals_recv_mds_size;
|
||||
chunk->start = malloc(chunk->length);
|
||||
if (chunk->start == NULL) return NULL;
|
||||
|
||||
chunk->me_h = PTL_INVALID_HANDLE;
|
||||
chunk->md_h = PTL_INVALID_HANDLE;
|
||||
|
||||
chunk->full = false;
|
||||
chunk->pending = 0;
|
||||
|
||||
return chunk;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
mca_btl_portals_recv_chunk_free(mca_btl_portals_recv_chunk_t *chunk)
|
||||
{
|
||||
|
||||
if (PTL_INVALID_HANDLE != chunk->me_h) {
|
||||
PtlMEUnlink(chunk->me_h);
|
||||
chunk->me_h = PTL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
while (chunk->pending != 0) {
|
||||
mca_btl_portals_component_progress();
|
||||
}
|
||||
|
||||
if (PTL_INVALID_HANDLE != chunk->md_h) {
|
||||
PtlMDUnlink(chunk->md_h);
|
||||
chunk->md_h = PTL_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
if (NULL != chunk->start) {
|
||||
free(chunk->start);
|
||||
chunk->start = NULL;
|
||||
}
|
||||
chunk->length = 0;
|
||||
chunk->full = false;
|
||||
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
OBJ_CLASS_INSTANCE(mca_btl_portals_recv_chunk_t,
|
||||
opal_list_item_t,
|
||||
NULL, NULL);
|
||||
|
@ -17,6 +17,23 @@
|
||||
#ifndef MCA_BTL_PORTALS_RECV_H
|
||||
#define MCA_BTL_PORTALS_RECV_H
|
||||
|
||||
struct mca_btl_portals_recv_chunk_t {
|
||||
opal_list_item_t base;
|
||||
|
||||
mca_btl_portals_module_t *btl;
|
||||
|
||||
void *start;
|
||||
size_t length;
|
||||
ptl_handle_me_t me_h;
|
||||
ptl_handle_md_t md_h;
|
||||
|
||||
volatile bool full;
|
||||
volatile int32_t pending;
|
||||
};
|
||||
typedef struct mca_btl_portals_recv_chunk_t mca_btl_portals_recv_chunk_t;
|
||||
OBJ_CLASS_DECLARATION(mca_btl_portals_recv_chunk_t);
|
||||
|
||||
|
||||
int mca_btl_portals_recv_enable(mca_btl_portals_module_t *module);
|
||||
|
||||
int mca_btl_portals_recv_disable(mca_btl_portals_module_t *module);
|
||||
@ -24,5 +41,72 @@ int mca_btl_portals_recv_disable(mca_btl_portals_module_t *module);
|
||||
int mca_btl_portals_process_recv(mca_btl_portals_module_t *module,
|
||||
ptl_event_t *ev);
|
||||
|
||||
/**
|
||||
* Create a chunk of memory for receiving send messages. Must call
|
||||
* activate_chunk on the returned chunk of memory before it will be
|
||||
* active with the POrtals library */
|
||||
mca_btl_portals_recv_chunk_t*
|
||||
mca_btl_portals_recv_chunk_init(mca_btl_portals_module_t *module);
|
||||
|
||||
/**
|
||||
* Free a chunk of memory. Will remove the match entry, then progress
|
||||
* Portals until the pending count is returned to 0. Will then free
|
||||
* all resources associated with chunk.
|
||||
*/
|
||||
int mca_btl_portals_recv_chunk_free(mca_btl_portals_recv_chunk_t *chunk);
|
||||
|
||||
/*
|
||||
* activate a chunk. Chunks that are full (have gone inactive) can be
|
||||
* re-activated with this call
|
||||
*/
|
||||
static inline int
|
||||
mca_btl_portals_activate_chunk(mca_btl_portals_recv_chunk_t *chunk)
|
||||
{
|
||||
int ret;
|
||||
ptl_process_id_t proc = { PTL_NID_ANY, PTL_PID_ANY };
|
||||
ptl_md_t md;
|
||||
|
||||
/* if we have pending operations, something very, very, very bad
|
||||
has happened... */
|
||||
assert(chunk->pending == 0);
|
||||
|
||||
if (NULL == chunk->start) return OMPI_ERROR;
|
||||
|
||||
/* create match entry */
|
||||
ret = PtlMEAttach(chunk->btl->portals_ni_h,
|
||||
BTL_PORTALS_SEND_TABLE_ID,
|
||||
proc,
|
||||
0, /* match bits */
|
||||
0, /* ignore bits */
|
||||
PTL_UNLINK,
|
||||
PTL_INS_AFTER,
|
||||
&(chunk->me_h));
|
||||
if (PTL_OK != ret) return OMPI_ERROR;
|
||||
|
||||
/* and the memory descriptor */
|
||||
md.start = chunk->start;
|
||||
md.length = chunk->length;
|
||||
md.threshold = PTL_MD_THRESH_INF;
|
||||
md.max_size = chunk->btl->super.btl_max_send_size;
|
||||
md.options = PTL_MD_OP_PUT | PTL_MD_MAX_SIZE;
|
||||
md.user_ptr = chunk;
|
||||
md.eq_handle = chunk->btl->portals_eq_handles[MCA_BTL_PORTALS_EQ_RECV];
|
||||
|
||||
chunk->full = false;
|
||||
|
||||
ret = PtlMDAttach(chunk->me_h,
|
||||
md,
|
||||
PTL_UNLINK,
|
||||
&(chunk->md_h));
|
||||
if (PTL_OK != ret) {
|
||||
PtlMEUnlink(chunk->me_h);
|
||||
return OMPI_ERROR;
|
||||
}
|
||||
|
||||
OPAL_OUTPUT_VERBOSE((100, mca_btl_portals_component.portals_output,
|
||||
"new receive buffer posted"));
|
||||
|
||||
return OMPI_SUCCESS;
|
||||
}
|
||||
|
||||
#endif /* MCA_BTL_PORTALS_RECV_H */
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user