NVIDIA DOCA SDK Data Center on a Chip Framework Documentation
worker_rdmo.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 NVIDIA CORPORATION AND AFFILIATES. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without modification, are permitted
5  * provided that the following conditions are met:
6  * * Redistributions of source code must retain the above copyright notice, this list of
7  * conditions and the following disclaimer.
8  * * Redistributions in binary form must reproduce the above copyright notice, this list of
9  * conditions and the following disclaimer in the documentation and/or other materials
10  * provided with the distribution.
11  * * Neither the name of the NVIDIA CORPORATION nor the names of its contributors may be used
12  * to endorse or promote products derived from this software without specific prior written
13  * permission.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
20  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
21  * STRICT LIABILITY, OR TOR (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
22  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  *
24  */
25 
26 #include <stdint.h>
27 #include <stdlib.h>
28 
29 #include "worker_rdmo.h"
30 #include "urom_rdmo.h"
31 
32 DOCA_LOG_REGISTER(UROM::WORKER::RDMO);
33 
34 static uint64_t plugin_version = 0x01; /* RDMO plugin DPU version */
35 
36 /* UCP memory pool for RDMO requests */
37 static ucs_mpool_ops_t urom_rdmo_req_mpool_ops = {.chunk_alloc = ucs_mpool_chunk_malloc,
38  .chunk_release = ucs_mpool_chunk_free,
39  .obj_init = NULL,
40  .obj_cleanup = NULL,
41  .obj_str = NULL};
42 
43 /*
44  * RDMO active message callback
45  *
46  * @ctx [in]: RDMO worker context
47  * @header [in]: RDMO header
48  * @header_length [in]: RDMO header length
49  * @data [in]: RDMO data
50  * @length [in]: RDMO data length
51  * @param [in]: UCX message parameters
52  */
53 static ucs_status_t urom_worker_rdmo_am_cb(void *ctx,
54  const void *header,
55  size_t header_length,
56  void *data,
57  size_t length,
58  const ucp_am_recv_param_t *param)
59 {
60  khint_t k;
61  doca_error_t status;
62  struct urom_worker_rdmo_ep *ep;
63  struct urom_worker_rdmo_req *req;
64  struct urom_worker_rdmo_client *client;
65  struct urom_rdmo_hdr *rdmo_hdr = (struct urom_rdmo_hdr *)header;
66  struct urom_worker_rdmo *rdmo_worker = (struct urom_worker_rdmo *)ctx;
67 
68  k = kh_get(client, rdmo_worker->clients, rdmo_hdr->id);
69  if (k == kh_end(rdmo_worker->clients)) {
70  DOCA_LOG_ERR("Unknown client ID: %#lx", rdmo_hdr->id);
71  return UCS_OK;
72  }
73 
74  client = kh_value(rdmo_worker->clients, k);
75  k = kh_get(ep, rdmo_worker->eps, (int64_t)param->reply_ep);
76  if (k == kh_end(rdmo_worker->eps)) {
77  DOCA_LOG_ERR("Unknown EP: %#lx", rdmo_hdr->id);
78  return UCS_OK;
79  }
80 
81  ep = kh_value(rdmo_worker->eps, k);
82  if (rdmo_hdr->op_id > UROM_RDMO_OP_SCATTER) {
83  DOCA_LOG_ERR("Invalid op_id: %d", rdmo_hdr->op_id);
84  return UCS_OK;
85  }
86 
87  req = ucs_mpool_get(&rdmo_worker->req_mp);
88  if (req == NULL)
89  return UCS_ERR_NO_ELEM;
90 
91  memset(req, 0, sizeof(*req));
92 
93  if (header_length > UROM_RDMO_HDR_LEN_MAX)
94  return UCS_ERR_INVALID_PARAM;
95  req->client = client;
96  req->ep = ep;
97  memcpy(req->header, header, header_length); /* AM header does not persist */
98  req->data = data;
99  req->length = length;
100  req->param = *param;
101  req->ops = urom_worker_rdmo_ops_table[rdmo_hdr->op_id];
102  if (req->ops == NULL || req->ops->progress == NULL)
103  return UCS_ERR_NO_RESOURCE;
104 
105  status = urom_worker_rdmo_req_queue(req);
106  if (status == DOCA_SUCCESS)
107  return UCS_OK;
108  return UCS_INPROGRESS;
109 }
110 
111 /*
112  * Close RDMO worker plugin
113  *
114  * @worker_ctx [in]: DOCA UROM worker context
115  */
117 {
118  struct urom_worker_rdmo *rdmo_worker = worker_ctx->plugin_ctx;
119 
120  if (rdmo_worker == NULL)
121  return;
122 
123  kh_destroy(ep, rdmo_worker->eps);
124  kh_destroy(client, rdmo_worker->clients);
125  ucs_mpool_cleanup(&rdmo_worker->req_mp, 0);
126  ucp_worker_release_address(rdmo_worker->ucp_data.ucp_worker, rdmo_worker->ucp_data.worker_address);
127  ucp_worker_destroy(rdmo_worker->ucp_data.ucp_worker);
128  ucp_cleanup(rdmo_worker->ucp_data.ucp_context);
129  free(rdmo_worker);
130 }
131 
132 /*
133  * Open RDMO worker plugin
134  *
135  * @ctx [in]: DOCA UROM worker context
136  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
137  */
139 {
140  ucs_status_t status;
141  ucp_params_t ucp_params;
142  ucp_config_t *ucp_config;
143  ucp_context_h ucp_context;
144  ucp_worker_h ucp_worker;
145  ucs_mpool_params_t mp_params;
146  ucp_am_handler_param_t am_param;
147  ucp_worker_params_t worker_params;
148  struct urom_worker_rdmo *rdmo_worker;
149 
150  rdmo_worker = calloc(1, sizeof(*rdmo_worker));
151  if (rdmo_worker == NULL)
152  return DOCA_ERROR_NO_MEMORY;
153 
154  ctx->plugin_ctx = rdmo_worker;
155 
156  status = ucp_config_read(NULL, NULL, &ucp_config);
157  if (status != UCS_OK)
158  goto err_cfg;
159 
160  /* Use TCP for CM, but do not allow TCP for RDMA */
161 #if UCP_API_VERSION >= UCP_VERSION(1, 17)
162  status = ucp_config_modify(ucp_config, "TCP_PUT_ENABLE", "n");
163 #else
164  status = ucp_config_modify(ucp_config, "PUT_ENABLE", "n");
165 #endif
166  if (status != UCS_OK) {
167  ucp_config_release(ucp_config);
168  goto err_cfg;
169  }
170 
171  ucp_params.field_mask = UCP_PARAM_FIELD_FEATURES;
172  ucp_params.features = UCP_FEATURE_AM | UCP_FEATURE_RMA | UCP_FEATURE_AMO64 | UCP_FEATURE_EXPORTED_MEMH;
173  ucp_params.features |= UCP_FEATURE_WAKEUP;
174  status = ucp_init(&ucp_params, ucp_config, &ucp_context);
175  ucp_config_release(ucp_config);
176  if (status != UCS_OK)
177  goto err_cfg;
178 
179  worker_params.field_mask = UCP_WORKER_PARAM_FIELD_THREAD_MODE;
180  worker_params.thread_mode = UCS_THREAD_MODE_SINGLE;
181  status = ucp_worker_create(ucp_context, &worker_params, &ucp_worker);
182  if (status != UCS_OK)
183  goto err_worker_create;
184 
185  status = ucp_worker_get_address(ucp_worker,
186  &rdmo_worker->ucp_data.worker_address,
187  &rdmo_worker->ucp_data.ucp_addrlen);
188  if (status != UCS_OK)
189  goto err_worker_address;
190 
191  DOCA_LOG_DBG("Worker addr length: %lu", rdmo_worker->ucp_data.ucp_addrlen);
192  rdmo_worker->ucp_data.ucp_context = ucp_context;
193  rdmo_worker->ucp_data.ucp_worker = ucp_worker;
194  am_param.field_mask = UCP_AM_HANDLER_PARAM_FIELD_ID | UCP_AM_HANDLER_PARAM_FIELD_FLAGS |
195  UCP_AM_HANDLER_PARAM_FIELD_CB | UCP_AM_HANDLER_PARAM_FIELD_ARG;
196  am_param.id = UROM_RDMO_AM_ID;
197  am_param.flags = UCP_AM_FLAG_PERSISTENT_DATA;
198  am_param.cb = urom_worker_rdmo_am_cb;
199  am_param.arg = rdmo_worker;
200 
201  status = ucp_worker_set_am_recv_handler(ucp_worker, &am_param);
202  if (status != UCS_OK)
203  goto err_am;
204 
205  rdmo_worker->clients = kh_init(client);
206  if (!rdmo_worker->clients)
207  goto err_clients;
208 
209  rdmo_worker->eps = kh_init(ep);
210  if (!rdmo_worker->eps)
211  goto err_eps;
212 
213  ucs_mpool_params_reset(&mp_params);
214  mp_params.elem_size = sizeof(struct urom_worker_rdmo_req);
215  mp_params.elems_per_chunk = 1024;
216  mp_params.ops = &urom_rdmo_req_mpool_ops;
217  mp_params.name = "urom_rdmo_requests";
218 
219  /* Create memory pool for requests */
220  status = ucs_mpool_init(&mp_params, &rdmo_worker->req_mp);
221  if (status != UCS_OK)
222  goto err_reqs;
223 
224  ucs_list_head_init(&rdmo_worker->completed_reqs);
225 
226  return DOCA_SUCCESS;
227 
228 err_reqs:
229  kh_destroy(ep, rdmo_worker->eps);
230 err_eps:
231  kh_destroy(client, rdmo_worker->clients);
232 err_clients:
233 err_am:
234  ucp_worker_release_address(ucp_worker, rdmo_worker->ucp_data.worker_address);
235 err_worker_address:
236  ucp_worker_destroy(ucp_worker);
237 err_worker_create:
238  ucp_cleanup(ucp_context);
239 err_cfg:
240  free(rdmo_worker);
241  return DOCA_ERROR_DRIVER;
242 }
243 
244 /*
245  * Get RDMO end-point according to UCP worker address
246  *
247  * @rdmo_worker [in]: RDMO worker context
248  * @peer_addr [in]: Client peer address
249  * @rdmo_ep [out]: Set RDMO end-point
250  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
251  */
253  void *peer_addr,
254  struct urom_worker_rdmo_ep **rdmo_ep)
255 {
256  ucs_status_t ucs_status;
257  khint_t k;
258  int ret;
259  ucp_ep_params_t ep_params;
260  struct urom_worker_rdmo_ep *ep;
261  ucp_worker_address_attr_t addr_attr = {
262  .field_mask = UCP_WORKER_ADDRESS_ATTR_FIELD_UID,
263  };
264 
265  ep = calloc(1, sizeof(*ep));
266  if (ep == NULL)
267  return DOCA_ERROR_NO_MEMORY;
268 
269  ep->ref_cnt = 1;
270  ep->peer_uid = addr_attr.worker_uid;
271  ucs_list_head_init(&ep->fenced_ops);
272  ep_params.field_mask = UCP_EP_PARAM_FIELD_REMOTE_ADDRESS;
273  ep_params.address = peer_addr;
274 
275  /* Create end-point on UCX side */
276  ucs_status = ucp_ep_create(rdmo_worker->ucp_data.ucp_worker, &ep_params, &ep->ep);
277  if (ucs_status != UCS_OK) {
278  free(ep);
279  return DOCA_ERROR_DRIVER;
280  }
281 
282  k = kh_put(ep, rdmo_worker->eps, (int64_t)ep->ep, &ret);
283  if (ret <= 0) {
284  ucp_ep_destroy(ep->ep);
285  free(ep);
286  return DOCA_ERROR_DRIVER;
287  }
288  kh_value(rdmo_worker->eps, k) = ep;
289  *rdmo_ep = ep;
290 
291  DOCA_LOG_DBG("New RDMO EP: %p UCP EP: %p UID: %#lx", ep, ep->ep, ep->peer_uid);
292  return DOCA_SUCCESS;
293 }
294 
295 /*
296  * Get RDMO client structure by destination id.
297  *
298  * @rdmo_worker [in]: RDMO worker context
299  * @dest_id [in]: The destination id
300  * @return: A pointer to RDMO client structure and NULL otherwise
301  */
303  uint64_t dest_id)
304 {
305  khiter_t k;
306  struct urom_worker_rdmo_client *client;
307 
308  for (k = kh_begin(rdmo_worker->clients); k != kh_end(rdmo_worker->clients); ++k) {
309  if (!kh_exist(rdmo_worker->clients, k))
310  continue;
311 
312  client = kh_value(rdmo_worker->clients, k);
313  if (client->dest_id == dest_id)
314  return kh_value(rdmo_worker->clients, k);
315  }
316  return NULL;
317 }
318 
319 /*
320  * Handle RDMO client init command
321  *
322  * @rdmo_worker [in]: RDMO worker context
323  * @cmd_desc [in]: RDMO command descriptor
324  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
325  */
327  struct urom_worker_cmd_desc *cmd_desc)
328 {
329  int ret;
330  khint_t k;
331  doca_error_t status;
332  struct urom_worker_notify *notif;
333  struct urom_worker_notif_desc *nd;
334  struct urom_worker_rdmo_client *client;
335  struct urom_worker_notify_rdmo *rdmo_notif;
336  struct urom_worker_cmd *cmd = (struct urom_worker_cmd *)&cmd_desc->worker_cmd;
337  struct urom_worker_rdmo_cmd *rdmo_cmd = (struct urom_worker_rdmo_cmd *)cmd->plugin_cmd;
338 
339  /* Prepare notification */
340  nd = calloc(1, sizeof(*nd) + sizeof(*rdmo_notif));
341  if (nd == NULL)
342  return DOCA_ERROR_NO_MEMORY;
343 
344  nd->dest_id = cmd_desc->dest_id;
345 
346  notif = (struct urom_worker_notify *)&nd->worker_notif;
347  notif->type = cmd->type;
348  notif->urom_context = cmd->urom_context;
349  notif->len = sizeof(*rdmo_notif) + rdmo_worker->ucp_data.ucp_addrlen;
350  notif->status = DOCA_SUCCESS;
351 
352  rdmo_notif = (struct urom_worker_notify_rdmo *)notif->plugin_notif;
354 
355  /* Return UCP worker address */
356  rdmo_notif->client_init.addr = rdmo_worker->ucp_data.worker_address;
357  rdmo_notif->client_init.addr_len = rdmo_worker->ucp_data.ucp_addrlen;
358 
359  client = urom_worker_rdmo_dest_to_client(rdmo_worker, cmd_desc->dest_id);
360  if (client != NULL) {
361  DOCA_LOG_ERR("Client already initialized");
362  status = DOCA_ERROR_ALREADY_EXIST;
363  goto push_err;
364  }
365 
366  k = kh_get(client, rdmo_worker->clients, rdmo_cmd->client_init.id);
367  if (k != kh_end(rdmo_worker->clients)) {
368  DOCA_LOG_ERR("Client ID unavailable: %#lx", rdmo_cmd->client_init.id);
369  return DOCA_ERROR_IN_USE;
370  }
371 
372  client = calloc(1, sizeof(*client));
373  if (client == NULL) {
374  status = DOCA_ERROR_NO_MEMORY;
375  goto push_err;
376  }
377 
378  client->rdmo_worker = rdmo_worker;
379  client->id = rdmo_cmd->client_init.id;
380  client->dest_id = cmd_desc->dest_id;
381  ucs_list_head_init(&client->paused_ops);
382 
383  DOCA_LOG_DBG("Client worker address len: %lu", rdmo_cmd->client_init.addr_len);
384 
385  /* Create host access EP */
386  status = urom_worker_rdmo_ep_get(rdmo_worker, rdmo_cmd->client_init.addr, &client->ep);
387  if (status != DOCA_SUCCESS) {
388  DOCA_LOG_ERR("Failed to get host access EP");
389  goto client_destroy;
390  }
391 
392  client->mkeys = kh_init(mkey);
393  if (client->mkeys == NULL) {
394  status = DOCA_ERROR_INITIALIZATION;
395  goto ep_destroy;
396  }
397 
398  client->rqs = kh_init(rq);
399  if (client->rqs == NULL) {
400  status = DOCA_ERROR_INITIALIZATION;
401  goto mkeys_destroy;
402  }
403 
404  k = kh_put(client, rdmo_worker->clients, client->id, &ret);
405  if (ret <= 0) {
406  status = DOCA_ERROR_DRIVER;
407  goto rqs_destroy;
408  }
409  kh_value(rdmo_worker->clients, k) = client;
410 
411  DOCA_LOG_DBG("Local worker address len: %lu", rdmo_notif->client_init.addr_len);
412  ucs_list_add_tail(&rdmo_worker->completed_reqs, &nd->entry);
413 
414  DOCA_LOG_DBG("RDMO client initialized (client: %p ep: %p)", client, client->ep);
415 
416  return DOCA_SUCCESS;
417 
418 rqs_destroy:
419  kh_destroy(rq, client->rqs);
420 mkeys_destroy:
421  kh_destroy(mkey, client->mkeys);
422 ep_destroy:
423  ucp_ep_destroy(client->ep->ep);
424 client_destroy:
425  free(client);
426 push_err:
427  notif->status = status;
428  ucs_list_add_tail(&rdmo_worker->completed_reqs, &nd->entry);
429  return status;
430 }
431 
432 /*
433  * Handle RDMO MR deregister command
434  *
435  * @rdmo_worker [in]: RDMO worker context
436  * @cmd_desc [in]: RDMO command descriptor
437  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
438  */
440  struct urom_worker_cmd_desc *cmd_desc)
441 {
442  khint_t k;
443  doca_error_t status;
444  ucs_status_t ucs_status;
445  struct urom_worker_rdmo_mkey *rdmo_mkey;
446  struct urom_worker_notify *notif;
447  struct urom_worker_notif_desc *nd;
448  struct urom_worker_rdmo_client *client;
449  struct urom_worker_notify_rdmo *rdmo_notif;
450  struct urom_worker_cmd *cmd = (struct urom_worker_cmd *)&cmd_desc->worker_cmd;
451  struct urom_worker_rdmo_cmd *rdmo_cmd = (struct urom_worker_rdmo_cmd *)cmd->plugin_cmd;
452 
453  client = urom_worker_rdmo_dest_to_client(rdmo_worker, cmd_desc->dest_id);
454  if (client == NULL) {
455  DOCA_LOG_ERR("Client is not initialized");
456  return DOCA_ERROR_NOT_FOUND;
457  }
458 
459  k = kh_get(mkey, client->mkeys, rdmo_cmd->mr_dereg.rkey);
460  if (k == kh_end(client->mkeys)) {
461  DOCA_LOG_ERR("Mkey does not exists for rkey: %lu", rdmo_cmd->mr_dereg.rkey);
462  status = DOCA_ERROR_NOT_FOUND;
463  goto push_notif;
464  }
465 
466  rdmo_mkey = kh_value(client->mkeys, k);
467  /* Unmap mem in case memh is present */
468  if (rdmo_mkey->ucp_memh != NULL) {
469  ucs_status = ucp_mem_unmap(rdmo_worker->ucp_data.ucp_context, rdmo_mkey->ucp_memh);
470  if (ucs_status != UCS_OK) {
471  DOCA_LOG_ERR("ucp_mem_unmap() returned error: %s", ucs_status_string(ucs_status));
472  status = DOCA_ERROR_DRIVER;
473  goto push_notif;
474  }
475  }
476 
477  ucp_rkey_destroy(rdmo_mkey->ucp_rkey);
478  kh_destroy(mem_cache, rdmo_mkey->mem_cache);
479  kh_del(mkey, client->mkeys, k);
480  free(rdmo_mkey);
481 
482  status = DOCA_SUCCESS;
483 
484 push_notif:
485  /* Prepare notification */
486  nd = calloc(1, sizeof(*nd) + sizeof(*rdmo_notif));
487  if (nd == NULL) {
488  kh_del(rq, client->rqs, k);
489  return DOCA_ERROR_NO_MEMORY;
490  }
491 
492  nd->dest_id = cmd_desc->dest_id;
493 
494  notif = (struct urom_worker_notify *)&nd->worker_notif;
495  notif->type = cmd->type;
496  notif->urom_context = cmd->urom_context;
497  notif->len = sizeof(*rdmo_notif);
498  notif->status = status;
499 
500  rdmo_notif = (struct urom_worker_notify_rdmo *)notif->plugin_notif;
502  rdmo_notif->mr_dereg.rkey = rdmo_cmd->mr_dereg.rkey;
503 
504  ucs_list_add_tail(&rdmo_worker->completed_reqs, &nd->entry);
505 
506  DOCA_LOG_DBG("Dereg - rkey: %lu (client: %p)", rdmo_cmd->mr_dereg.rkey, client);
507  return status;
508 }
509 
510 /*
511  * Handle RDMO RQ create command
512  *
513  * @rdmo_worker [in]: RDMO worker context
514  * @cmd_desc [in]: RDMO command descriptor
515  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
516  */
518  struct urom_worker_cmd_desc *cmd_desc)
519 {
520  int ret;
521  khint_t k;
522  doca_error_t status;
523  struct urom_worker_rdmo_rq *rq;
524  struct urom_worker_notify *notif;
525  struct urom_worker_notif_desc *nd;
526  struct urom_worker_rdmo_client *client;
527  struct urom_worker_notify_rdmo *rdmo_notif;
528  struct urom_worker_cmd *cmd = (struct urom_worker_cmd *)&cmd_desc->worker_cmd;
529  struct urom_worker_rdmo_cmd *rdmo_cmd = (struct urom_worker_rdmo_cmd *)cmd->plugin_cmd;
530 
531  /* Prepare notification */
532  nd = calloc(1, sizeof(*nd) + sizeof(*rdmo_notif));
533  if (nd == NULL)
534  return DOCA_ERROR_NO_MEMORY;
535 
536  nd->dest_id = cmd_desc->dest_id;
537 
538  notif = (struct urom_worker_notify *)&nd->worker_notif;
539  notif->type = cmd->type;
540  notif->urom_context = cmd->urom_context;
541  notif->len = sizeof(*rdmo_notif);
542 
543  rdmo_notif = (struct urom_worker_notify_rdmo *)notif->plugin_notif;
545 
546  client = urom_worker_rdmo_dest_to_client(rdmo_worker, cmd_desc->dest_id);
547  if (client == NULL) {
548  DOCA_LOG_ERR("Client is not initialized");
549  status = DOCA_ERROR_NOT_FOUND;
550  goto push_notif;
551  }
552 
553  rq = calloc(1, sizeof(*rq));
554  if (rq == NULL) {
555  status = DOCA_ERROR_NO_MEMORY;
556  goto push_notif;
557  }
558 
559  rq->id = client->next_rq_id++;
560  k = kh_put(rq, client->rqs, rq->id, &ret);
561  if (ret <= 0) {
562  free(rq);
563  status = DOCA_ERROR_DRIVER;
564  goto push_notif;
565  }
566  kh_value(client->rqs, k) = rq;
567 
568  status = urom_worker_rdmo_ep_get(rdmo_worker, rdmo_cmd->rq_create.addr, &rq->ep);
569  if (status != DOCA_SUCCESS) {
570  kh_del(rq, client->rqs, k);
571  free(rq);
572  goto push_notif;
573  }
574 
575  /* Set RQ id */
576  rdmo_notif->rq_create.rq_id = rq->id;
577  DOCA_LOG_DBG("Created RQ: %p ID: %#lx (client: %p ep: %p)", rq, rq->id, client, rq->ep);
578  status = DOCA_SUCCESS;
579 
580 push_notif:
581  notif->status = status;
582  ucs_list_add_tail(&rdmo_worker->completed_reqs, &nd->entry);
583  return status;
584 }
585 
586 /*
587  * RDMO UCP EP destroy function
588  *
589  * @rdmo_worker [in]: RDMO worker context
590  * @rdmo_ep [in]: RDMO endpoint
591  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
592  */
593 static doca_error_t urom_worker_rdmo_ep_del(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_rdmo_ep *rdmo_ep)
594 {
595  khint_t k;
596  ucs_status_ptr_t ucs_status_ptr;
597 
598  k = kh_get(ep, rdmo_worker->eps, (int64_t)rdmo_ep->ep);
599  if (k == kh_end(rdmo_worker->eps)) {
600  DOCA_LOG_ERR("EP does not exist - RDMO EP: %p UCP EP: %p", rdmo_ep, rdmo_ep->ep);
601  return DOCA_ERROR_NOT_FOUND;
602  }
603  ucs_status_ptr = ucp_ep_close_nb(rdmo_ep->ep, UCP_EP_CLOSE_MODE_FLUSH);
604  if (UCS_PTR_IS_ERR(ucs_status_ptr))
605  return DOCA_ERROR_DRIVER;
606 
607  kh_del(ep, rdmo_worker->eps, k);
608  ucp_request_release(ucs_status_ptr);
609  free(rdmo_ep);
610 
611  return DOCA_SUCCESS;
612 }
613 
614 /*
615  * Handle RDMO RQ Destroy command
616  *
617  * @rdmo_worker [in]: RDMO worker context
618  * @cmd_desc [in]: RDMO command descriptor
619  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
620  */
622  struct urom_worker_cmd_desc *cmd_desc)
623 {
624  khint_t k;
625  doca_error_t status;
626  struct urom_worker_rdmo_rq *rq = NULL;
627  struct urom_worker_notify *notif;
628  struct urom_worker_notif_desc *nd;
629  struct urom_worker_rdmo_client *client;
630  struct urom_worker_notify_rdmo *rdmo_notif;
631  struct urom_worker_cmd *cmd = (struct urom_worker_cmd *)&cmd_desc->worker_cmd;
632  struct urom_worker_rdmo_cmd *rdmo_cmd = (struct urom_worker_rdmo_cmd *)cmd->plugin_cmd;
633 
634  client = urom_worker_rdmo_dest_to_client(rdmo_worker, cmd_desc->dest_id);
635  if (client == NULL) {
636  DOCA_LOG_ERR("Client is not initialized");
637  return DOCA_ERROR_NOT_FOUND;
638  }
639 
640  k = kh_get(rq, client->rqs, rdmo_cmd->rq_destroy.rq_id);
641  if (k == kh_end(client->rqs)) {
642  DOCA_LOG_ERR("RQ does not exist for ID: %lu", rdmo_cmd->rq_destroy.rq_id);
643  status = DOCA_ERROR_NOT_FOUND;
644  goto push_notif;
645  }
646  rq = kh_value(client->rqs, k);
647 
648  status = urom_worker_rdmo_ep_del(rdmo_worker, rq->ep);
649  if (status != DOCA_SUCCESS)
650  goto push_notif;
651 
652  kh_del(rq, client->rqs, k);
653 
654  status = DOCA_SUCCESS;
655 
656 push_notif:
657 
658  /* Prepare notification */
659  nd = calloc(1, sizeof(*nd) + sizeof(*rdmo_notif));
660  if (nd == NULL) {
661  kh_del(rq, client->rqs, k);
662  return DOCA_ERROR_NO_MEMORY;
663  }
664 
665  nd->dest_id = cmd_desc->dest_id;
666 
667  notif = (struct urom_worker_notify *)&nd->worker_notif;
668  notif->type = cmd->type;
669  notif->urom_context = cmd->urom_context;
670  notif->len = sizeof(*rdmo_notif);
671  notif->status = status;
672 
673  rdmo_notif = (struct urom_worker_notify_rdmo *)notif->plugin_notif;
675  rdmo_notif->rq_destroy.rq_id = rdmo_cmd->rq_destroy.rq_id;
676 
677  ucs_list_add_tail(&rdmo_worker->completed_reqs, &nd->entry);
678 
679  DOCA_LOG_DBG("Destroyed RQ for ID: %#lx (client: %p)", rdmo_notif->rq_destroy.rq_id, client);
680  return status;
681 }
682 
683 /*
684  * Handle RDMO MR register command
685  *
686  * @rdmo_worker [in]: RDMO worker context
687  * @cmd_desc [in]: RDMO command descriptor
688  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
689  */
691  struct urom_worker_cmd_desc *cmd_desc)
692 {
693  int ret;
694  khint_t k;
695  uint64_t rkey;
696  ucp_rkey_h ucp_rkey;
697  doca_error_t status;
698  ucs_status_t ucs_status;
699  ucp_mem_h ucp_memh = NULL;
700  ucp_mem_map_params_t map_params;
701  struct urom_worker_notify *notif;
702  struct urom_worker_notif_desc *nd;
703  struct urom_worker_rdmo_client *client;
704  struct urom_worker_rdmo_mkey *rdmo_mkey;
705  struct urom_worker_notify_rdmo *rdmo_notif;
706  struct urom_worker_cmd *cmd = (struct urom_worker_cmd *)&cmd_desc->worker_cmd;
707  struct urom_worker_rdmo_cmd *rdmo_cmd = (struct urom_worker_rdmo_cmd *)cmd->plugin_cmd;
708 
709  /* Prepare notification */
710  nd = calloc(1, sizeof(*nd) + sizeof(*rdmo_notif));
711  if (nd == NULL)
712  return DOCA_ERROR_NO_MEMORY;
713 
714  nd->dest_id = cmd_desc->dest_id;
715 
716  notif = (struct urom_worker_notify *)&nd->worker_notif;
717  notif->type = cmd->type;
718  notif->urom_context = cmd->urom_context;
719  notif->len = sizeof(*rdmo_notif);
720 
721  rdmo_notif = (struct urom_worker_notify_rdmo *)notif->plugin_notif;
722  rdmo_notif->type = UROM_WORKER_NOTIFY_RDMO_MR_REG;
723 
724  rdmo_mkey = malloc(sizeof(*rdmo_mkey));
725  if (rdmo_mkey == NULL) {
726  status = DOCA_ERROR_NO_MEMORY;
727  goto push_notif;
728  }
729 
730  client = urom_worker_rdmo_dest_to_client(rdmo_worker, cmd_desc->dest_id);
731  if (client == NULL) {
732  DOCA_LOG_ERR("Client is not initialized");
733  free(rdmo_mkey);
734  status = DOCA_ERROR_NOT_FOUND;
735  goto push_notif;
736  }
737 
738  ucs_status = ucp_ep_rkey_unpack(client->ep->ep, rdmo_cmd->mr_reg.packed_rkey, &ucp_rkey);
739  if (ucs_status != UCS_OK) {
740  status = DOCA_ERROR_DRIVER;
741  free(rdmo_mkey);
742  goto push_notif;
743  }
744 
745  if (rdmo_cmd->mr_reg.packed_memh) {
746  map_params.field_mask = UCP_MEM_MAP_PARAM_FIELD_EXPORTED_MEMH_BUFFER;
747  map_params.exported_memh_buffer = rdmo_cmd->mr_reg.packed_memh;
748  ucs_status = ucp_mem_map(rdmo_worker->ucp_data.ucp_context, &map_params, &ucp_memh);
749  if (ucs_status == UCS_ERR_UNREACHABLE) {
750  DOCA_LOG_ERR("EXPORTED_MEMH unsupported");
751  ucp_memh = NULL;
752  } else if (ucs_status != UCS_OK) {
753  status = DOCA_ERROR_DRIVER;
754  free(rdmo_mkey);
755  goto push_notif;
756  }
757  }
758 
759  rdmo_mkey->mem_cache = kh_init(mem_cache);
760  if (rdmo_mkey->mem_cache == NULL) {
761  free(rdmo_mkey);
762  status = DOCA_ERROR_INITIALIZATION;
763  goto push_notif;
764  }
765 
766  rdmo_mkey->ucp_rkey = ucp_rkey;
767  rdmo_mkey->ucp_memh = ucp_memh;
768  rdmo_mkey->va = rdmo_cmd->mr_reg.va;
769  rdmo_mkey->len = rdmo_cmd->mr_reg.len;
770  rkey = (uintptr_t)ucp_rkey;
771 
772  k = kh_put(mkey, client->mkeys, rkey, &ret);
773  if (ret <= 0) {
774  free(rdmo_mkey);
775  status = DOCA_ERROR_DRIVER;
776  goto push_notif;
777  }
778  kh_value(client->mkeys, k) = rdmo_mkey;
779 
780  rdmo_notif->mr_reg.rkey = rkey;
781  status = DOCA_SUCCESS;
782  DOCA_LOG_DBG("Allocated rkey: %lu ucp_memh: %p (client: %p)", rkey, ucp_memh, client);
783 
784 push_notif:
785  notif->status = status;
786  ucs_list_add_tail(&rdmo_worker->completed_reqs, &nd->entry);
787 
788  return DOCA_SUCCESS;
789 }
790 
791 /*
792  * Unpacking RDMO worker command
793  *
794  * @packed_cmd [in]: packed worker command
795  * @packed_cmd_len [in]: packed worker command length
796  * @cmd [out]: set unpacked UROM worker command
797  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
798  */
799 static doca_error_t urom_worker_rdmo_cmd_unpack(void *packed_cmd, size_t packed_cmd_len, struct urom_worker_cmd **cmd)
800 {
801  void *ptr;
802  struct urom_worker_rdmo_cmd *rdmo_cmd;
803  uint64_t extended_mem = 0;
804 
805  if (packed_cmd_len < sizeof(struct urom_worker_rdmo_cmd)) {
806  DOCA_LOG_INFO("Invalid packed command length");
808  }
809 
810  *cmd = packed_cmd;
811  ptr = packed_cmd + ucs_offsetof(struct urom_worker_cmd, plugin_cmd) + sizeof(struct urom_worker_rdmo_cmd);
812  rdmo_cmd = (struct urom_worker_rdmo_cmd *)(*cmd)->plugin_cmd;
813 
814  switch (rdmo_cmd->type) {
816  rdmo_cmd->client_init.addr = ptr;
817  extended_mem += rdmo_cmd->client_init.addr_len;
818  break;
820  rdmo_cmd->rq_create.addr = ptr;
821  extended_mem += rdmo_cmd->rq_create.addr_len;
822  break;
824  rdmo_cmd->mr_reg.packed_rkey = ptr;
825  ptr += rdmo_cmd->mr_reg.packed_rkey_len;
826  extended_mem += rdmo_cmd->mr_reg.packed_rkey_len;
827  rdmo_cmd->mr_reg.packed_memh = ptr;
828  extended_mem += rdmo_cmd->mr_reg.packed_memh_len;
829  break;
830  }
831 
832  if ((*cmd)->len != extended_mem + sizeof(struct urom_worker_rdmo_cmd)) {
833  DOCA_LOG_ERR("Invalid RDMO command length");
835  }
836  return DOCA_SUCCESS;
837 }
838 
839 /*
840  * Handle UROM RDMO worker commands function
841  *
842  * @ctx [in]: DOCA UROM worker context
843  * @cmd_list [in]: command descriptor list to handle
844  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
845  */
846 static doca_error_t urom_worker_rdmo_worker_cmd(struct urom_worker_ctx *ctx, ucs_list_link_t *cmd_list)
847 {
848  doca_error_t status = DOCA_SUCCESS;
849  struct urom_worker_cmd_desc *cmd_desc;
850  struct urom_worker_cmd *cmd;
851  struct urom_worker_rdmo_cmd *rdmo_cmd;
852  struct urom_worker_rdmo *rdmo_worker = (struct urom_worker_rdmo *)ctx->plugin_ctx;
853 
854  while (!ucs_list_is_empty(cmd_list)) {
855  cmd_desc = ucs_list_extract_head(cmd_list, struct urom_worker_cmd_desc, entry);
856 
857  status = urom_worker_rdmo_cmd_unpack(&cmd_desc->worker_cmd, cmd_desc->worker_cmd.len, &cmd);
858  if (status != DOCA_SUCCESS) {
859  free(cmd_desc);
860  return status;
861  }
862  rdmo_cmd = (struct urom_worker_rdmo_cmd *)cmd->plugin_cmd;
863  switch (rdmo_cmd->type) {
865  status = urom_worker_rdmo_client_init_cmd(rdmo_worker, cmd_desc);
866  break;
868  status = urom_worker_rdmo_rq_create_cmd(rdmo_worker, cmd_desc);
869  break;
871  status = urom_worker_rdmo_rq_destroy_cmd(rdmo_worker, cmd_desc);
872  break;
874  status = urom_worker_rdmo_mr_reg_cmd(rdmo_worker, cmd_desc);
875  break;
877  status = urom_worker_rdmo_mr_dereg_cmd(rdmo_worker, cmd_desc);
878  break;
879  default:
880  DOCA_LOG_INFO("Invalid RDMO command type: %lu", rdmo_cmd->type);
881  status = DOCA_ERROR_INVALID_VALUE;
882  break;
883  }
884  free(cmd_desc);
885  if (status != DOCA_SUCCESS)
886  return status;
887  }
888  return status;
889 }
890 
891 /*
892  * Check RDMO worker tasks progress to get notifications
893  *
894  * @ctx [in]: DOCA UROM worker context
895  * @notif_list [out]: set notification descriptors for completed tasks
896  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
897  */
898 static doca_error_t urom_worker_rdmo_progress(struct urom_worker_ctx *ctx, ucs_list_link_t *notif_list)
899 {
900  struct urom_worker_notif_desc *nd;
901  struct urom_worker_rdmo *rdmo_worker = (struct urom_worker_rdmo *)ctx->plugin_ctx;
902 
903  ucp_worker_progress(rdmo_worker->ucp_data.ucp_worker);
904 
905  if (ucs_list_is_empty(&rdmo_worker->completed_reqs))
906  return DOCA_ERROR_EMPTY;
907 
908  while (!ucs_list_is_empty(&rdmo_worker->completed_reqs)) {
909  nd = ucs_list_extract_head(&rdmo_worker->completed_reqs, struct urom_worker_notif_desc, entry);
910  ucs_list_add_tail(notif_list, &nd->entry);
911  /* Caller must free entries in notif_list */
912  }
913  return DOCA_SUCCESS;
914 }
915 
916 /*
917  * Packing RDMO notification
918  *
919  * @notif [in]: RDMO notification to pack
920  * @packed_notif_len [in/out]: set packed notification command buffer size
921  * @packed_notif [out]: set packed notification command buffer
922  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
923  */
925  size_t *packed_notif_len,
926  void *packed_notif)
927 {
928  int pack_len;
929  void *pack_head;
930  void *pack_tail = packed_notif;
931  struct urom_worker_notify_rdmo *rdmo_notif = (struct urom_worker_notify_rdmo *)notif->plugin_notif;
932 
933  /* Pack base command */
934  pack_len = ucs_offsetof(struct urom_worker_notify, plugin_notif) + sizeof(struct urom_worker_notify_rdmo);
935  pack_head = urom_rdmo_serialize_next_raw(&pack_tail, void, pack_len);
936  memcpy(pack_head, notif, pack_len);
937  *packed_notif_len = pack_len;
938 
939  /* Pack inline data */
940  switch (rdmo_notif->type) {
942  pack_len = rdmo_notif->client_init.addr_len;
943  pack_head = urom_rdmo_serialize_next_raw(&pack_tail, void, pack_len);
944  memcpy(pack_head, rdmo_notif->client_init.addr, pack_len);
945  *packed_notif_len += pack_len;
946  break;
947  }
948  return DOCA_SUCCESS;
949 }
950 
951 /*
952  * Get RDMO worker address
953  *
954  * UROM worker calls the function twice, first one to get address length and second one to get address data
955  *
956  * @worker_ctx [in]: DOCA UROM worker context
957  * @addr [out]: set worker address
958  * @addr_len [out]: set worker address length
959  * @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise
960  */
961 static doca_error_t urom_worker_rdmo_addr(struct urom_worker_ctx *worker_ctx, void *addr, uint64_t *addr_len)
962 {
963  struct urom_worker_rdmo *rdmo_worker = (struct urom_worker_rdmo *)worker_ctx->plugin_ctx;
964 
965  /* Always return address size */
966  if (*addr_len < rdmo_worker->ucp_data.ucp_addrlen) {
967  /* Return required buffer size on error */
968  *addr_len = rdmo_worker->ucp_data.ucp_addrlen;
970  }
971 
972  *addr_len = rdmo_worker->ucp_data.ucp_addrlen;
973  memcpy(addr, rdmo_worker->ucp_data.worker_address, *addr_len);
974  return DOCA_SUCCESS;
975 }
976 
977 /* Define UROM RDMO plugin interface, set plugin functions */
979  .super.open = urom_worker_rdmo_open,
980  .super.close = urom_worker_rdmo_close,
981  .super.addr = urom_worker_rdmo_addr,
982  .super.worker_cmd = urom_worker_rdmo_worker_cmd,
983  .super.progress = urom_worker_rdmo_progress,
984  .super.notif_pack = urom_worker_rdmo_notif_pack,
985 };
986 
988 {
989  if (iface == NULL)
991 
993  *iface = urom_worker_rdmo.super;
994  return DOCA_SUCCESS;
995 }
996 
998 {
999  if (version == NULL)
1000  return DOCA_ERROR_INVALID_VALUE;
1001 
1002  *version = plugin_version;
1003  return DOCA_SUCCESS;
1004 }
#define NULL
Definition: __stddef_null.h:26
uintptr_t addr
if(bitoffset % 64+bitlength > 64) result|
static ucs_mpool_ops_t urom_rdmo_req_mpool_ops
Definition: worker_rdmo.c:37
static doca_error_t urom_worker_rdmo_cmd_unpack(void *packed_cmd, size_t packed_cmd_len, struct urom_worker_cmd **cmd)
Definition: worker_rdmo.c:799
static uint64_t plugin_version
Definition: worker_rdmo.c:34
static doca_error_t urom_worker_rdmo_rq_destroy_cmd(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_cmd_desc *cmd_desc)
Definition: worker_rdmo.c:621
static doca_error_t urom_worker_rdmo_ep_get(struct urom_worker_rdmo *rdmo_worker, void *peer_addr, struct urom_worker_rdmo_ep **rdmo_ep)
Definition: worker_rdmo.c:252
static doca_error_t urom_worker_rdmo_mr_dereg_cmd(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_cmd_desc *cmd_desc)
Definition: worker_rdmo.c:439
static doca_error_t urom_worker_rdmo_progress(struct urom_worker_ctx *ctx, ucs_list_link_t *notif_list)
Definition: worker_rdmo.c:898
static doca_error_t urom_worker_rdmo_notif_pack(struct urom_worker_notify *notif, size_t *packed_notif_len, void *packed_notif)
Definition: worker_rdmo.c:924
static doca_error_t urom_worker_rdmo_open(struct urom_worker_ctx *ctx)
Definition: worker_rdmo.c:138
static ucs_status_t urom_worker_rdmo_am_cb(void *ctx, const void *header, size_t header_length, void *data, size_t length, const ucp_am_recv_param_t *param)
Definition: worker_rdmo.c:53
DOCA_LOG_REGISTER(UROM::WORKER::RDMO)
doca_error_t urom_plugin_get_version(uint64_t *version)
Definition: worker_rdmo.c:997
doca_error_t urom_plugin_get_iface(struct urom_plugin_iface *iface)
Definition: worker_rdmo.c:987
static doca_error_t urom_worker_rdmo_rq_create_cmd(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_cmd_desc *cmd_desc)
Definition: worker_rdmo.c:517
static void urom_worker_rdmo_close(struct urom_worker_ctx *worker_ctx)
Definition: worker_rdmo.c:116
static struct urom_worker_rdmo_client * urom_worker_rdmo_dest_to_client(struct urom_worker_rdmo *rdmo_worker, uint64_t dest_id)
Definition: worker_rdmo.c:302
static doca_error_t urom_worker_rdmo_addr(struct urom_worker_ctx *worker_ctx, void *addr, uint64_t *addr_len)
Definition: worker_rdmo.c:961
static doca_error_t urom_worker_rdmo_worker_cmd(struct urom_worker_ctx *ctx, ucs_list_link_t *cmd_list)
Definition: worker_rdmo.c:846
static doca_error_t urom_worker_rdmo_ep_del(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_rdmo_ep *rdmo_ep)
Definition: worker_rdmo.c:593
static doca_error_t urom_worker_rdmo_mr_reg_cmd(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_cmd_desc *cmd_desc)
Definition: worker_rdmo.c:690
static doca_error_t urom_worker_rdmo_client_init_cmd(struct urom_worker_rdmo *rdmo_worker, struct urom_worker_cmd_desc *cmd_desc)
Definition: worker_rdmo.c:326
struct urom_worker_rdmo_req_ops * urom_worker_rdmo_ops_table[]
doca_error_t urom_worker_rdmo_req_queue(struct urom_worker_rdmo_req *req)
#define UROM_RDMO_HDR_LEN_MAX
Definition: worker_rdmo.h:40
#define UROM_RDMO_AM_ID
Definition: worker_rdmo.h:39
static struct doca_flow_pipe_entry * entry[MAX_ENTRIES]
#define DOCA_STRUCT_CTOR(_X_)
Definition: doca_compat.h:141
enum doca_error doca_error_t
DOCA API return codes.
@ DOCA_ERROR_INVALID_VALUE
Definition: doca_error.h:44
@ DOCA_ERROR_INITIALIZATION
Definition: doca_error.h:46
@ DOCA_ERROR_IN_USE
Definition: doca_error.h:41
@ DOCA_ERROR_NOT_FOUND
Definition: doca_error.h:54
@ DOCA_SUCCESS
Definition: doca_error.h:38
@ DOCA_ERROR_NO_MEMORY
Definition: doca_error.h:45
@ DOCA_ERROR_DRIVER
Definition: doca_error.h:59
@ DOCA_ERROR_ALREADY_EXIST
Definition: doca_error.h:61
@ DOCA_ERROR_EMPTY
Definition: doca_error.h:63
#define DOCA_LOG_ERR(format,...)
Generates an ERROR application log message.
Definition: doca_log.h:466
#define DOCA_LOG_INFO(format,...)
Generates an INFO application log message.
Definition: doca_log.h:486
#define DOCA_LOG_DBG(format,...)
Generates a DEBUG application log message.
Definition: doca_log.h:496
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:298
ucp_context_h ucp_context
Definition: worker_rdmo.h:44
ucp_address_t * worker_address
Definition: worker_rdmo.h:46
size_t ucp_addrlen
Definition: worker_rdmo.h:47
ucp_worker_h ucp_worker
Definition: worker_rdmo.h:45
UROM Worker plugin interface.
uint64_t id
Definition: urom_rdmo.h:161
uint32_t op_id
Definition: urom_rdmo.h:162
UROM Worker command descriptor structure.
struct urom_worker_cmd worker_cmd
UROM Worker command structure.
uint8_t plugin_cmd[]
UROM worker context.
UROM Worker notification descriptor structure.
struct urom_worker_notify worker_notif
struct urom_worker_rdmo_notify_mr_reg mr_reg
Definition: urom_rdmo.h:142
struct urom_worker_rdmo_notify_rq_create rq_create
Definition: urom_rdmo.h:140
struct urom_worker_rdmo_notify_rq_destroy rq_destroy
Definition: urom_rdmo.h:141
struct urom_worker_rdmo_notify_mr_dereg mr_dereg
Definition: urom_rdmo.h:143
struct urom_worker_rdmo_notify_client_init client_init
Definition: urom_rdmo.h:139
UROM Worker notification structure.
struct urom_worker_rdmo * rdmo_worker
Definition: worker_rdmo.h:88
struct urom_worker_rdmo_cmd_mr_reg mr_reg
Definition: urom_rdmo.h:92
struct urom_worker_rdmo_cmd_client_init client_init
Definition: urom_rdmo.h:89
struct urom_worker_rdmo_cmd_rq_create rq_create
Definition: urom_rdmo.h:90
doca_error_t(* progress)(struct urom_worker_rdmo_req *req)
Definition: worker_rdmo.h:108
uint8_t header[UROM_RDMO_HDR_LEN_MAX]
Definition: worker_rdmo.h:117
struct urom_worker_rdmo_ep * ep
Definition: worker_rdmo.h:115
struct urom_worker_rdmo_req_ops * ops
Definition: worker_rdmo.h:121
struct urom_worker_rdmo_client * client
Definition: worker_rdmo.h:114
ucp_am_recv_param_t param
Definition: worker_rdmo.h:120
struct urom_worker_rdmo_ep * ep
Definition: worker_rdmo.h:65
struct ucp_data ucp_data
Definition: worker_rdmo.h:127
ucs_list_link_t completed_reqs
Definition: worker_rdmo.h:131
ucs_mpool_t req_mp
Definition: worker_rdmo.h:128
struct upf_accel_ctx * ctx
@ UROM_WORKER_NOTIFY_RDMO_CLIENT_INIT
Definition: urom_rdmo.h:99
@ UROM_WORKER_NOTIFY_RDMO_RQ_CREATE
Definition: urom_rdmo.h:101
@ UROM_WORKER_NOTIFY_RDMO_RQ_DESTROY
Definition: urom_rdmo.h:103
@ UROM_WORKER_NOTIFY_RDMO_MR_REG
Definition: urom_rdmo.h:105
@ UROM_WORKER_NOTIFY_RDMO_MR_DEREG
Definition: urom_rdmo.h:106
@ UROM_WORKER_CMD_RDMO_MR_REG
Definition: urom_rdmo.h:48
@ UROM_WORKER_CMD_RDMO_MR_DEREG
Definition: urom_rdmo.h:49
@ UROM_WORKER_CMD_RDMO_RQ_CREATE
Definition: urom_rdmo.h:46
@ UROM_WORKER_CMD_RDMO_RQ_DESTROY
Definition: urom_rdmo.h:47
@ UROM_WORKER_CMD_RDMO_CLIENT_INIT
Definition: urom_rdmo.h:45
@ UROM_RDMO_OP_SCATTER
Definition: urom_rdmo.h:156
#define urom_rdmo_serialize_next_raw(_iter, _type, _offset)
Definition: urom_rdmo.h:36