MCPcopy Create free account
hub / github.com/F-Stack/f-stack / mlx5_devx_wq_init

Function mlx5_devx_wq_init

dpdk/drivers/common/mlx5/mlx5_common_devx.c:459–515  ·  view source on GitHub ↗

* Create WQ resources using DevX API. * * @param[in] ctx * Context returned from mlx5 open_device() glue function. * @param[in] wqe_size * Size of WQE structure. * @param[in] log_wqbb_n * Log of number of WQBBs in queue. * @param[in] socket * Socket to use for allocation. * @param[out] wq_attr * Pointer to WQ attributes structure. * @param[out] wq_res * Pointer to WQ resou

Source from the content-addressed store, hash-verified

457 * 0 on success, a negative errno value otherwise and rte_errno is set.
458 */
459static int
460mlx5_devx_wq_init(void *ctx, uint32_t wqe_size, uint16_t log_wqbb_n, int socket,
461 struct mlx5_devx_wq_attr *wq_attr,
462 struct mlx5_devx_wq_res *wq_res)
463{
464 struct mlx5dv_devx_umem *umem_obj = NULL;
465 void *umem_buf = NULL;
466 size_t alignment = MLX5_WQE_BUF_ALIGNMENT;
467 uint32_t umem_size, umem_dbrec;
468 int ret;
469
470 if (alignment == (size_t)-1) {
471 DRV_LOG(ERR, "Failed to get WQE buf alignment.");
472 rte_errno = ENOMEM;
473 return -rte_errno;
474 }
475 /* Allocate memory buffer for WQEs and doorbell record. */
476 umem_size = wqe_size * (1 << log_wqbb_n);
477 umem_dbrec = RTE_ALIGN(umem_size, MLX5_DBR_SIZE);
478 umem_size += MLX5_DBR_SIZE;
479 umem_buf = mlx5_malloc(MLX5_MEM_RTE | MLX5_MEM_ZERO, umem_size,
480 alignment, socket);
481 if (!umem_buf) {
482 DRV_LOG(ERR, "Failed to allocate memory for RQ.");
483 rte_errno = ENOMEM;
484 return -rte_errno;
485 }
486 /* Register allocated buffer in user space with DevX. */
487 umem_obj = mlx5_os_umem_reg(ctx, (void *)(uintptr_t)umem_buf,
488 umem_size, 0);
489 if (!umem_obj) {
490 DRV_LOG(ERR, "Failed to register umem for RQ.");
491 rte_errno = errno;
492 goto error;
493 }
494 /* Fill WQ attributes for RQ/RMP object creation. */
495 wq_attr->wq_umem_valid = 1;
496 wq_attr->wq_umem_id = mlx5_os_get_umem_id(umem_obj);
497 wq_attr->wq_umem_offset = 0;
498 wq_attr->dbr_umem_valid = 1;
499 wq_attr->dbr_umem_id = wq_attr->wq_umem_id;
500 wq_attr->dbr_addr = umem_dbrec;
501 wq_attr->log_wq_pg_sz = MLX5_LOG_PAGE_SIZE;
502 /* Fill attributes for RQ object creation. */
503 wq_res->umem_buf = umem_buf;
504 wq_res->umem_obj = umem_obj;
505 wq_res->db_rec = RTE_PTR_ADD(umem_buf, umem_dbrec);
506 return 0;
507error:
508 ret = rte_errno;
509 if (umem_obj)
510 claim_zero(mlx5_os_umem_dereg(umem_obj));
511 if (umem_buf)
512 mlx5_free((void *)(uintptr_t)umem_buf);
513 rte_errno = ret;
514 return -rte_errno;
515}
516

Callers 2

mlx5_devx_rq_std_createFunction · 0.85
mlx5_devx_rmp_createFunction · 0.85

Calls 5

mlx5_mallocFunction · 0.85
mlx5_freeFunction · 0.85
mlx5_os_umem_regFunction · 0.50
mlx5_os_get_umem_idFunction · 0.50
mlx5_os_umem_deregFunction · 0.50

Tested by

no test coverage detected