static int fi_ibv_get_device_attrs(struct ibv_context *ctx, struct fi_info *info) { struct ibv_device_attr device_attr; struct ibv_port_attr port_attr; int ret = 0; ret = ibv_query_device(ctx, &device_attr); if (ret) { VERBS_INFO_ERRNO(FI_LOG_FABRIC, "ibv_query_device", errno); return -errno; } info->domain_attr->cq_cnt = device_attr.max_cq; info->domain_attr->ep_cnt = device_attr.max_qp; info->domain_attr->tx_ctx_cnt = MIN(info->domain_attr->tx_ctx_cnt, device_attr.max_qp); info->domain_attr->rx_ctx_cnt = MIN(info->domain_attr->rx_ctx_cnt, device_attr.max_qp); info->domain_attr->max_ep_tx_ctx = device_attr.max_qp; info->domain_attr->max_ep_rx_ctx = device_attr.max_qp; ret = fi_ibv_get_qp_cap(ctx, &device_attr, info); if (ret) return ret; ret = ibv_query_port(ctx, 1, &port_attr); if (ret) { VERBS_INFO_ERRNO(FI_LOG_FABRIC, "ibv_query_port", errno); return -errno; } info->ep_attr->max_msg_size = port_attr.max_msg_sz; info->ep_attr->max_order_raw_size = port_attr.max_msg_sz; info->ep_attr->max_order_waw_size = port_attr.max_msg_sz; return 0; }
static int fi_ibv_get_device_attrs(struct ibv_context *ctx, struct fi_info *info) { struct ibv_device_attr device_attr; struct ibv_port_attr port_attr; int ret = 0; ret = ibv_query_device(ctx, &device_attr); if (ret) { VERBS_INFO_ERRNO(FI_LOG_FABRIC, "ibv_query_device", errno); return -errno; } info->domain_attr->cq_cnt = device_attr.max_cq; info->domain_attr->ep_cnt = device_attr.max_qp; info->domain_attr->tx_ctx_cnt = MIN(info->domain_attr->tx_ctx_cnt, device_attr.max_qp); info->domain_attr->rx_ctx_cnt = MIN(info->domain_attr->rx_ctx_cnt, device_attr.max_qp); info->domain_attr->max_ep_tx_ctx = MIN(info->domain_attr->tx_ctx_cnt, device_attr.max_qp); info->domain_attr->max_ep_rx_ctx = MIN(info->domain_attr->rx_ctx_cnt, device_attr.max_qp); info->domain_attr->max_ep_srx_ctx = device_attr.max_qp; info->domain_attr->mr_cnt = device_attr.max_mr; if (info->ep_attr->type == FI_EP_RDM) info->domain_attr->cntr_cnt = device_attr.max_qp * 4; info->tx_attr->size = device_attr.max_qp_wr; info->tx_attr->iov_limit = device_attr.max_sge; info->tx_attr->rma_iov_limit = device_attr.max_sge; info->rx_attr->size = device_attr.max_srq_wr ? MIN(device_attr.max_qp_wr, device_attr.max_srq_wr) : device_attr.max_qp_wr; info->rx_attr->iov_limit = MIN(device_attr.max_sge, device_attr.max_srq_sge); ret = fi_ibv_get_qp_cap(ctx, info); if (ret) return ret; ret = ibv_query_port(ctx, 1, &port_attr); if (ret) { VERBS_INFO_ERRNO(FI_LOG_FABRIC, "ibv_query_port", errno); return -errno; } info->ep_attr->max_msg_size = port_attr.max_msg_sz; info->ep_attr->max_order_raw_size = port_attr.max_msg_sz; info->ep_attr->max_order_waw_size = port_attr.max_msg_sz; return 0; }