/* * RDMA device: Definitions of Resource Manager structures * * Copyright (C) 2018 Oracle * Copyright (C) 2018 Red Hat Inc * * Authors: * Yuval Shaia <yuval.shaia@oracle.com> * Marcel Apfelbaum <marcel@redhat.com> * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. * */ #ifndef RDMA_RM_DEFS_H #define RDMA_RM_DEFS_H #include "rdma_backend_defs.h" #define MAX_PORTS 1 /* Do not change - we support only one port */ #define MAX_PORT_GIDS 255 #define MAX_GIDS MAX_PORT_GIDS #define MAX_PORT_PKEYS 1 #define MAX_PKEYS MAX_PORT_PKEYS #define MAX_UCS 512 #define MAX_MR_SIZE (1UL << 27) #define MAX_QP 1024 #define MAX_SGE 4 #define MAX_CQ 2048 #define MAX_MR 1024 #define MAX_PD 1024 #define MAX_QP_RD_ATOM 16 #define MAX_QP_INIT_RD_ATOM 16 #define MAX_AH 64 #define MAX_SRQ 512 #define MAX_RM_TBL_NAME 16 #define MAX_CONSEQ_EMPTY_POLL_CQ 4096 /* considered as error above this */ typedef struct RdmaRmResTbl { char name[MAX_RM_TBL_NAME]; QemuMutex lock; unsigned long *bitmap; size_t tbl_sz; size_t res_sz; void *tbl; uint32_t used; /* number of used entries in the table */ } RdmaRmResTbl; typedef struct RdmaRmPD { RdmaBackendPD backend_pd; uint32_t ctx_handle; } RdmaRmPD; typedef enum CQNotificationType { CNT_CLEAR, CNT_ARM, CNT_SET, } CQNotificationType; typedef struct RdmaRmCQ { RdmaBackendCQ backend_cq; void *opaque; CQNotificationType notify; } RdmaRmCQ; /* MR (DMA region) */ typedef struct RdmaRmMR { RdmaBackendMR backend_mr; void *virt; uint64_t start; size_t length; uint32_t pd_handle; uint32_t lkey; uint32_t rkey; } RdmaRmMR; typedef struct RdmaRmUC { uint64_t uc_handle; } RdmaRmUC; typedef struct RdmaRmQP { RdmaBackendQP backend_qp; void *opaque; uint32_t qp_type; uint32_t qpn; uint32_t send_cq_handle; uint32_t recv_cq_handle; enum ibv_qp_state qp_state; uint8_t is_srq; } RdmaRmQP; typedef struct RdmaRmSRQ { RdmaBackendSRQ backend_srq; uint32_t recv_cq_handle; void *opaque; } RdmaRmSRQ; typedef struct RdmaRmGid { union ibv_gid gid; int backend_gid_index; } RdmaRmGid; typedef struct RdmaRmPort { RdmaRmGid gid_tbl[MAX_PORT_GIDS]; enum ibv_port_state state; } RdmaRmPort; typedef struct RdmaRmStats { uint64_t tx; uint64_t tx_len; uint64_t tx_err; uint64_t rx_bufs; uint64_t rx_bufs_len; uint64_t rx_bufs_err; uint64_t rx_srq; uint64_t completions; uint64_t mad_tx; uint64_t mad_tx_err; uint64_t mad_rx; uint64_t mad_rx_err; uint64_t mad_rx_bufs; uint64_t mad_rx_bufs_err; uint64_t poll_cq_from_bk; uint64_t poll_cq_from_guest; uint64_t poll_cq_from_guest_empty; uint64_t poll_cq_ppoll_to; uint32_t missing_cqe; } RdmaRmStats; struct RdmaDeviceResources { RdmaRmPort port; RdmaRmResTbl pd_tbl; RdmaRmResTbl mr_tbl; RdmaRmResTbl uc_tbl; RdmaRmResTbl qp_tbl; RdmaRmResTbl cq_tbl; RdmaRmResTbl cqe_ctx_tbl; RdmaRmResTbl srq_tbl; GHashTable *qp_hash; /* Keeps mapping between real and emulated */ QemuMutex lock; RdmaRmStats stats; }; #endif