34 #define urom_rdmo_compiler_fence() asm volatile("" ::: "memory")
50 k = kh_get(mem_cache, rdmo_mkey->mem_cache,
addr);
51 if (k == kh_end(rdmo_mkey->mem_cache)) {
56 *val = kh_value(rdmo_mkey->mem_cache, k);
75 k = kh_get(mem_cache, rdmo_mkey->mem_cache,
addr);
76 if (k != kh_end(rdmo_mkey->mem_cache)) {
77 kh_value(rdmo_mkey->mem_cache, k) = val;
80 k = kh_put(mem_cache, rdmo_mkey->mem_cache,
addr, &ret);
85 kh_value(rdmo_mkey->mem_cache, k) = val;
100 if (ucs_status != UCS_OK)
103 ucs_mpool_put(user_data);
104 ucp_request_free(request);
121 ucp_request_param_t req_param = {0};
126 req = ucs_mpool_get(&client->rdmo_worker->req_mp);
131 req_param.op_attr_mask = UCP_OP_ATTR_FIELD_CALLBACK | UCP_OP_ATTR_FIELD_USER_DATA;
133 req_param.user_data = req;
135 return ucp_put_nbx(client->ep->ep, req, 8,
addr, rdmo_mkey->
ucp_rkey, &req_param);
151 ucp_request_param_t req_param;
152 ucs_status_ptr_t ucs_status_ptr;
153 uint64_t get_addr = 0;
157 for (k = kh_begin(client->mkeys); k != kh_end(client->mkeys); ++k) {
158 if (!kh_exist(client->mkeys, k))
161 rdmo_mkey = kh_value(client->mkeys, k);
164 for (j = kh_begin(rdmo_mkey->mem_cache); j != kh_end(rdmo_mkey->mem_cache); ++j) {
165 if (!kh_exist(rdmo_mkey->mem_cache, j))
168 addr = kh_key(rdmo_mkey->mem_cache, j);
169 val = kh_value(rdmo_mkey->mem_cache, j);
170 kh_del(mem_cache, rdmo_mkey->mem_cache, j);
173 memset(&req_param, 0,
sizeof(req_param));
174 req_param.op_attr_mask = UCP_OP_ATTR_FLAG_FORCE_IMM_CMPL;
176 ucs_status_ptr = ucp_put_nbx(client->ep->ep, &val, 8,
addr, rdmo_mkey->
ucp_rkey, &req_param);
177 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_ERR_NO_RESOURCE) {
181 if (UCS_PTR_IS_PTR(ucs_status_ptr))
182 ucp_request_free(ucs_status_ptr);
185 if (UCS_PTR_IS_ERR(ucs_status_ptr))
200 memset(&req_param, 0,
sizeof(req_param));
201 ucs_status_ptr = ucp_get_nbx(client->ep->ep, &client->get_result, 8, get_addr, get_rkey, &req_param);
203 if (UCS_PTR_IS_ERR(ucs_status_ptr))
206 if (UCS_PTR_IS_PTR(ucs_status_ptr))
207 ucp_request_free(ucs_status_ptr);
235 if (!(req->
param.recv_attr & UCP_AM_RECV_ATTR_FLAG_RNDV))
287 ucs_list_del(&req->
entry);
358 ucp_request_free(request);
399 DOCA_LOG_DBG(
"Pending completions: %lu req: %p", req->ctx[1], req);
411 ucs_status_t ucs_status;
412 ucs_status_ptr_t ucs_status_ptr;
413 ucp_request_param_t req_param = {
414 .op_attr_mask = UCP_OP_ATTR_FIELD_CALLBACK | UCP_OP_ATTR_FIELD_USER_DATA,
422 size_t rsp_len =
sizeof(*rsp_hdr) +
sizeof(*flush_rsp);
424 if (req->
ctx[0] == 0) {
428 if (ucs_status != UCS_OK)
433 ucs_status_ptr = ucp_ep_flush_nbx(req->
client->
ep->
ep, &req_param);
434 if (UCS_PTR_IS_ERR(ucs_status_ptr))
439 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
445 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
451 if (req->
ctx[0] == 1) {
456 flush_rsp->
flush_id = flush_hdr->flush_id;
461 if (UCS_PTR_IS_ERR(ucs_status_ptr))
466 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
470 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
497 ucs_status_ptr_t ucs_status_ptr;
498 ucp_request_param_t req_param;
506 uint64_t *sm_ptr =
NULL;
508 if (req->
ctx[0] == 0) {
511 k = kh_get(mkey, req->
client->mkeys, append_hdr->ptr_rkey);
512 if (k == kh_end(req->
client->mkeys)) {
513 DOCA_LOG_ERR(
"Unknown ptr_rkey: %lu", append_hdr->ptr_rkey);
517 rdmo_mkey = kh_value(req->
client->mkeys, k);
518 req->
ctx[2] = (uint64_t)rdmo_mkey;
523 if (ucp_rkey_ptr(
ucp_rkey, append_hdr->ptr_addr, (
void **)&sm_addr) == UCS_OK) {
525 req->
ctx[1] = *sm_addr;
530 DOCA_LOG_DBG(
"Using cached pointer val: %#lx, req: %p", req->
ctx[1], req);
533 memset(&req_param, 0,
sizeof(req_param));
534 req_param.op_attr_mask = UCP_OP_ATTR_FIELD_CALLBACK | UCP_OP_ATTR_FIELD_USER_DATA;
536 req_param.user_data = req;
538 ucs_status_ptr = ucp_get_nbx(req->
client->
ep->
ep,
541 append_hdr->ptr_addr,
544 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_INPROGRESS)
556 if (req->
ctx[0] == 1) {
566 if (req->
ctx[0] == 2) {
568 if (append_hdr->ptr_rkey != append_hdr->data_rkey) {
569 k = kh_get(mkey, req->
client->mkeys, append_hdr->data_rkey);
570 if (k == kh_end(req->
client->mkeys)) {
571 DOCA_LOG_ERR(
"Unknown data_rkey: %lu", append_hdr->data_rkey);
575 rdmo_mkey = kh_value(req->
client->mkeys, k);
582 if (req->
ctx[1] < rdmo_mkey->
va || (req->
ctx[1] + req->
length) > (rdmo_mkey->
va + rdmo_mkey->
len)) {
583 DOCA_LOG_ERR(
"Append out of bounds, put: %#lx-%#lx mkey: %#lx-%#lx",
587 rdmo_mkey->
va + rdmo_mkey->
len);
591 if (req->
param.recv_attr & UCP_AM_RECV_ATTR_FLAG_RNDV) {
597 memset(&req_param, 0,
sizeof(req_param));
598 req_param.op_attr_mask = UCP_OP_ATTR_FIELD_CALLBACK | UCP_OP_ATTR_FIELD_USER_DATA |
599 UCP_OP_ATTR_FIELD_MEMH;
601 req_param.user_data = req;
602 req_param.memh = rdmo_mkey->
ucp_memh;
609 if (UCS_PTR_IS_ERR(ucs_status_ptr))
614 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
618 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
622 }
else if (ucp_rkey_ptr(
ucp_rkey, req->
ctx[1], (
void **)&sm_addr) != UCS_OK) {
623 memset(&req_param, 0,
sizeof(req_param));
624 req_param.op_attr_mask = UCP_OP_ATTR_FIELD_CALLBACK | UCP_OP_ATTR_FIELD_USER_DATA;
626 req_param.user_data = req;
629 ucs_status_ptr = ucp_put_nbx(req->
client->
ep->
ep,
636 if (UCS_PTR_IS_ERR(ucs_status_ptr))
641 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
645 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
651 memcpy((
void *)sm_addr, req->
data, req->
length);
679 ucs_status_ptr_t ucs_status_ptr;
680 ucp_request_param_t req_param;
684 uint64_t prev_rkey = UINT64_MAX;
692 if (req->
ctx[0] == 0) {
693 if (req->
param.recv_attr & UCP_AM_RECV_ATTR_FLAG_RNDV) {
700 iov_data = (
void *)(iov + 1);
702 for (i = 0; i < scatter_hdr->count; i++) {
703 if (iov->
rkey != prev_rkey) {
704 k = kh_get(mkey, req->
client->mkeys, iov->
rkey);
705 if (k == kh_end(req->
client->mkeys)) {
710 rdmo_mkey = kh_value(req->
client->mkeys, k);
712 prev_rkey = iov->
rkey;
715 if (iov->
addr < rdmo_mkey->
va || (iov->
addr + iov->
len) > (rdmo_mkey->
va + rdmo_mkey->
len)) {
716 DOCA_LOG_ERR(
"Scatter IOV out of bounds, put: %#lx-%#lx mkey: %#lx-%#lx",
720 rdmo_mkey->
va + rdmo_mkey->
len);
724 if (ucp_rkey_ptr(ucp_rkey, iov->
addr, (
void **)&sm_addr) != UCS_OK) {
725 memset(&req_param, 0,
sizeof(req_param));
726 req_param.op_attr_mask = UCP_OP_ATTR_FIELD_CALLBACK | UCP_OP_ATTR_FIELD_USER_DATA;
728 req_param.user_data = req;
730 ucs_status_ptr = ucp_put_nbx(req->
client->
ep->
ep,
736 if (UCS_PTR_IS_ERR(ucs_status_ptr))
739 if (UCS_PTR_STATUS(ucs_status_ptr) == UCS_INPROGRESS) {
743 if (UCS_PTR_STATUS(ucs_status_ptr) != UCS_OK)
750 memcpy((
void *)sm_addr, iov_data, iov->
len);
756 iov_data = (
void *)(iov + 1);
763 if (req->
ctx[0] == 1) {
791 if (!ucs_list_is_empty(&client->paused_ops) || client->pause) {
793 ucs_list_add_tail(&client->paused_ops, &req->
entry);
if(bitoffset % 64+bitlength > 64) result|
static struct doca_flow_pipe_entry * entry[MAX_ENTRIES]
#define __attribute__(_x_)
To allow compiling functions and structs that are using GCC attributes using attribute() in compilers...
enum doca_error doca_error_t
DOCA API return codes.
@ DOCA_ERROR_INVALID_VALUE
@ DOCA_ERROR_NOT_SUPPORTED
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
__UINTPTR_TYPE__ uintptr_t
ucs_list_link_t paused_ops
struct urom_worker_rdmo * rdmo_worker
struct urom_worker_rdmo_ep * ep
ucs_list_link_t fenced_ops
doca_error_t(* progress)(struct urom_worker_rdmo_req *req)
uint8_t header[UROM_RDMO_HDR_LEN_MAX]
struct urom_worker_rdmo_ep * ep
struct urom_worker_rdmo_req_ops * ops
struct urom_worker_rdmo_client * client
ucp_am_recv_param_t param
@ UROM_RDMO_REQ_FLAG_FENCE
static void urom_worker_rdmo_addr_flush_cb(void *request, ucs_status_t ucs_status, void *user_data)
static void urom_worker_rdmo_scatter_op_send_cb(void *request, ucs_status_t ucs_status, void *user_data)
static void urom_worker_rdmo_am_recv_data_cb(void *request, ucs_status_t ucs_status, size_t length, void *user_data)
static ucs_status_ptr_t urom_worker_rdmo_addr_flush_slow(struct urom_worker_rdmo_client *client, uint64_t addr, uint64_t val, struct urom_worker_rdmo_mkey *rdmo_mkey)
static void urom_worker_rdmo_req_complete(struct urom_worker_rdmo_req *req)
#define urom_rdmo_compiler_fence()
static doca_error_t urom_worker_rdmo_flush_progress(struct urom_worker_rdmo_req *req)
static doca_error_t urom_worker_rdmo_mem_cache_flush(struct urom_worker_rdmo_client *client)
static void urom_worker_rdmo_req_free_data(struct urom_worker_rdmo_req *req)
static doca_error_t urom_worker_rdmo_mem_cache_get(struct urom_worker_rdmo_mkey *rdmo_mkey, uint64_t addr, uint64_t *val)
DOCA_LOG_REGISTER(UROM::WORKER::RDMO::OPS)
struct urom_worker_rdmo_req_ops * urom_worker_rdmo_ops_table[]
static struct urom_worker_rdmo_req_ops urom_worker_rdmo_scatter_ops
static struct urom_worker_rdmo_req_ops urom_worker_rdmo_flush_ops
static doca_error_t urom_worker_rdmo_mem_cache_put(struct urom_worker_rdmo_mkey *rdmo_mkey, uint64_t addr, uint64_t val)
doca_error_t urom_worker_rdmo_req_queue(struct urom_worker_rdmo_req *req)
static void urom_worker_rdmo_req_free(struct urom_worker_rdmo_req *req)
static doca_error_t urom_worker_rdmo_req_start(struct urom_worker_rdmo_req *req)
static void urom_worker_rdmo_op_send_cb(void *request, ucs_status_t ucs_status, void *user_data)
static void urom_worker_rdmo_check_paused(struct urom_worker_rdmo_client *client)
static void urom_worker_rdmo_op_cb(void *request, ucs_status_t ucs_status, void *user_data)
static void urom_worker_rdmo_check_fenced(struct urom_worker_rdmo_ep *ep)
static doca_error_t urom_worker_rdmo_append_progress(struct urom_worker_rdmo_req *req)
static doca_error_t urom_worker_rdmo_scatter_progress(struct urom_worker_rdmo_req *req)
static struct urom_worker_rdmo_req_ops urom_worker_rdmo_append_ops