1
1
openmpi/ompi/mca/btl/pcie/btl_pcie_frag.h
Ralph Castain 4d3aa5a8a4 Once again, into the breach!
Yes, friends, our favorite PCIE BTL has resurfaced as mgmt vacillates over its existence. This is an updated version that actually mostly works, in its final stages of debugging.

Some generalization still remains to be done...

This commit was SVN r21358.
2009-06-02 22:26:36 +00:00

180 строки
7.4 KiB
C

/*
* Copyright (c) 2007 Los Alamos National Security, LLC.
* All righs reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef MCA_BTL_PCIE_FRAG_H
#define MCA_BTL_PCIE_FRAG_H
#include "ompi_config.h"
#include "ompi/mca/btl/btl.h"
BEGIN_C_DECLS
#define MCA_BTL_PCIE_FRAG_ALIGN (16)
/* Header that sits at top of any send message */
struct mca_btl_pcie_header_t {
mca_btl_base_tag_t tag;
uint8_t pad[3];
uint32_t length;
ompi_ptr_t send_frag;
};
typedef struct mca_btl_pcie_header_t mca_btl_pcie_header_t;
#define OMPI_BTL_PCIE_HEADER_HTON(header) \
do { \
(header).length = htonl((header).length); \
} while (0)
#define OMPI_BTL_PCIE_HEADER_NTOH(header) \
do { \
(header).length = ntohl((header).length); \
} while (0)
struct mca_btl_pcie_frag_t;
/** Type description for fragments / buffers */
enum mca_btl_pcie_frag_type_t {
MCA_BTL_PCIE_TYPE_UNKNOWN,
MCA_BTL_PCIE_TYPE_EAGER,
MCA_BTL_PCIE_TYPE_MAX,
MCA_BTL_PCIE_TYPE_RDMA,
MCA_BTL_PCIE_TYPE_RECV
};
typedef enum mca_btl_pcie_frag_type_t mca_btl_pcie_frag_type_t;
/** SMA transfer fragment */
struct mca_btl_pcie_sma_buf_t {
ompi_free_list_item_t super;
/** Pointer to the SMA space available for this copy. An
ompi_ptr_t because in v1.2, this sits in the sma region,
and we need to not have different sizes on each endpoint. */
ompi_ptr_t pcie_data;
/** type of buffer */
mca_btl_pcie_frag_type_t type;
};
typedef struct mca_btl_pcie_sma_buf_t mca_btl_pcie_sma_buf_t;
typedef mca_btl_pcie_sma_buf_t mca_btl_pcie_sma_buf_eager_t;
OBJ_CLASS_DECLARATION(mca_btl_pcie_sma_buf_eager_t);
typedef mca_btl_pcie_sma_buf_t mca_btl_pcie_sma_buf_max_t;
OBJ_CLASS_DECLARATION(mca_btl_pcie_sma_buf_max_t);
#define MCA_BTL_PCIE_SMA_BUF_ALLOC_EAGER(btl, buf, rc) \
{ \
ompi_free_list_item_t *item; \
OMPI_FREE_LIST_GET(&((mca_btl_pcie_module_t*)btl)->pcie_sma_buf_eager, item, rc); \
buf = (mca_btl_pcie_sma_buf_t*) item; \
}
#define MCA_BTL_PCIE_SMA_BUF_ALLOC_MAX(btl, buf, rc) \
{ \
ompi_free_list_item_t *item; \
OMPI_FREE_LIST_GET(&((mca_btl_pcie_module_t*)btl)->pcie_sma_buf_max, item, rc); \
buf = (mca_btl_pcie_sma_buf_t*) item; \
}
#define MCA_BTL_PCIE_SMA_BUF_RETURN(btl, buf, ret) \
{ \
ret = OMPI_SUCCESS; \
switch ((buf)->type) { \
case MCA_BTL_PCIE_TYPE_EAGER: \
OMPI_FREE_LIST_RETURN(&((mca_btl_pcie_module_t*)btl)->pcie_sma_buf_eager, \
(ompi_free_list_item_t*)(buf)); \
break; \
case MCA_BTL_PCIE_TYPE_MAX: \
OMPI_FREE_LIST_RETURN(&((mca_btl_pcie_module_t*)btl)->pcie_sma_buf_max, \
(ompi_free_list_item_t*)(buf)); \
break; \
default: \
BTL_ERROR(("Invalid return type (%d) for frag 0x%lx in SMA_BUF_RETURN", \
buf->type, (long)buf)); \
ret = OMPI_ERR_BAD_PARAM; \
} \
}
/** Fragment description -- used for send/rdma fragments */
struct mca_btl_pcie_frag_t {
mca_btl_base_descriptor_t base;
mca_btl_base_segment_t segment;
struct mca_btl_base_endpoint_t *endpoint;
mca_btl_pcie_header_t *hdr;
size_t size;
struct mca_btl_pcie_reg_t *registration;
mca_btl_pcie_frag_type_t type;
mca_btl_pcie_sma_buf_t *sma_buf;
};
typedef struct mca_btl_pcie_frag_t mca_btl_pcie_frag_t;
typedef struct mca_btl_pcie_frag_t mca_btl_pcie_frag_eager_t;
OBJ_CLASS_DECLARATION(mca_btl_pcie_frag_eager_t);
typedef struct mca_btl_pcie_frag_t mca_btl_pcie_frag_max_t;
OBJ_CLASS_DECLARATION(mca_btl_pcie_frag_max_t);
typedef struct mca_btl_pcie_frag_t mca_btl_pcie_frag_recv_t;
OBJ_CLASS_DECLARATION(mca_btl_pcie_frag_recv_t);
typedef struct mca_btl_pcie_frag_t mca_btl_pcie_frag_dma_t;
OBJ_CLASS_DECLARATION(mca_btl_pcie_frag_dma_t);
#define MCA_BTL_PCIE_FRAG_ALLOC_EAGER(btl, frag, rc) \
{ \
ompi_free_list_item_t *item; \
OMPI_FREE_LIST_GET(&((mca_btl_pcie_module_t*)btl)->pcie_frag_eager, item, rc); \
frag = (mca_btl_pcie_frag_t*) item; \
}
#define MCA_BTL_PCIE_FRAG_ALLOC_MAX(btl, frag, rc) \
{ \
ompi_free_list_item_t *item; \
OMPI_FREE_LIST_GET(&((mca_btl_pcie_module_t*)btl)->pcie_frag_max, item, rc); \
frag = (mca_btl_pcie_frag_t*) item; \
}
#define MCA_BTL_PCIE_FRAG_ALLOC_DMA(btl, frag, rc) \
{ \
\
ompi_free_list_item_t *item; \
OMPI_FREE_LIST_GET(&((mca_btl_pcie_module_t*)btl)->pcie_frag_dma, item, rc); \
frag = (mca_btl_pcie_frag_t*) item; \
}
#define MCA_BTL_PCIE_FRAG_RETURN(btl, frag, ret) \
{ \
ret = OMPI_SUCCESS; \
switch ((frag)->type) { \
case MCA_BTL_PCIE_TYPE_EAGER: \
OMPI_FREE_LIST_RETURN(&((mca_btl_pcie_module_t*)btl)->pcie_frag_eager, \
(ompi_free_list_item_t*)(frag)); \
break; \
case MCA_BTL_PCIE_TYPE_MAX: \
OMPI_FREE_LIST_RETURN(&((mca_btl_pcie_module_t*)btl)->pcie_frag_max, \
(ompi_free_list_item_t*)(frag)); \
break; \
case MCA_BTL_PCIE_TYPE_RDMA: \
OMPI_FREE_LIST_RETURN(&((mca_btl_pcie_module_t*)btl)->pcie_frag_dma, \
(ompi_free_list_item_t*)(frag)); \
break; \
default: \
BTL_ERROR(("Invalid return type (%d) for frag 0x%lx in FRAG_RETURN", \
frag->type, (long)frag)); \
ret = OMPI_ERR_BAD_PARAM; \
} \
}
END_C_DECLS
#endif /* #ifndef MCA_BTL_PCIE_FRAG_H */