1 /* 2 * RDMA device: Definitions of Resource Manager structures 3 * 4 * Copyright (C) 2018 Oracle 5 * Copyright (C) 2018 Red Hat Inc 6 * 7 * Authors: 8 * Yuval Shaia <yuval.shaia@oracle.com> 9 * Marcel Apfelbaum <marcel@redhat.com> 10 * 11 * This work is licensed under the terms of the GNU GPL, version 2 or later. 12 * See the COPYING file in the top-level directory. 13 * 14 */ 15 16 #ifndef RDMA_RM_DEFS_H 17 #define RDMA_RM_DEFS_H 18 19 #include "rdma_backend_defs.h" 20 21 #define MAX_PORTS 1 /* Do not change - we support only one port */ 22 #define MAX_PORT_GIDS 255 23 #define MAX_GIDS MAX_PORT_GIDS 24 #define MAX_PORT_PKEYS 1 25 #define MAX_PKEYS MAX_PORT_PKEYS 26 #define MAX_UCS 512 27 #define MAX_MR_SIZE (1UL << 27) 28 #define MAX_QP 1024 29 #define MAX_SGE 4 30 #define MAX_CQ 2048 31 #define MAX_MR 1024 32 #define MAX_PD 1024 33 #define MAX_QP_RD_ATOM 16 34 #define MAX_QP_INIT_RD_ATOM 16 35 #define MAX_AH 64 36 #define MAX_SRQ 512 37 38 #define MAX_RM_TBL_NAME 16 39 #define MAX_CONSEQ_EMPTY_POLL_CQ 4096 /* considered as error above this */ 40 41 typedef struct RdmaRmResTbl { 42 char name[MAX_RM_TBL_NAME]; 43 QemuMutex lock; 44 unsigned long *bitmap; 45 size_t tbl_sz; 46 size_t res_sz; 47 void *tbl; 48 uint32_t used; /* number of used entries in the table */ 49 } RdmaRmResTbl; 50 51 typedef struct RdmaRmPD { 52 RdmaBackendPD backend_pd; 53 uint32_t ctx_handle; 54 } RdmaRmPD; 55 56 typedef enum CQNotificationType { 57 CNT_CLEAR, 58 CNT_ARM, 59 CNT_SET, 60 } CQNotificationType; 61 62 typedef struct RdmaRmCQ { 63 RdmaBackendCQ backend_cq; 64 void *opaque; 65 CQNotificationType notify; 66 } RdmaRmCQ; 67 68 /* MR (DMA region) */ 69 typedef struct RdmaRmMR { 70 RdmaBackendMR backend_mr; 71 void *virt; 72 uint64_t start; 73 size_t length; 74 uint32_t pd_handle; 75 uint32_t lkey; 76 uint32_t rkey; 77 } RdmaRmMR; 78 79 typedef struct RdmaRmUC { 80 uint64_t uc_handle; 81 } RdmaRmUC; 82 83 typedef struct RdmaRmQP { 84 RdmaBackendQP backend_qp; 85 void *opaque; 86 uint32_t qp_type; 87 uint32_t qpn; 88 uint32_t send_cq_handle; 89 uint32_t recv_cq_handle; 90 enum ibv_qp_state qp_state; 91 uint8_t is_srq; 92 } RdmaRmQP; 93 94 typedef struct RdmaRmSRQ { 95 RdmaBackendSRQ backend_srq; 96 uint32_t recv_cq_handle; 97 void *opaque; 98 } RdmaRmSRQ; 99 100 typedef struct RdmaRmGid { 101 union ibv_gid gid; 102 int backend_gid_index; 103 } RdmaRmGid; 104 105 typedef struct RdmaRmPort { 106 RdmaRmGid gid_tbl[MAX_PORT_GIDS]; 107 enum ibv_port_state state; 108 } RdmaRmPort; 109 110 typedef struct RdmaRmStats { 111 uint64_t tx; 112 uint64_t tx_len; 113 uint64_t tx_err; 114 uint64_t rx_bufs; 115 uint64_t rx_bufs_len; 116 uint64_t rx_bufs_err; 117 uint64_t rx_srq; 118 uint64_t completions; 119 uint64_t mad_tx; 120 uint64_t mad_tx_err; 121 uint64_t mad_rx; 122 uint64_t mad_rx_err; 123 uint64_t mad_rx_bufs; 124 uint64_t mad_rx_bufs_err; 125 uint64_t poll_cq_from_bk; 126 uint64_t poll_cq_from_guest; 127 uint64_t poll_cq_from_guest_empty; 128 uint64_t poll_cq_ppoll_to; 129 uint32_t missing_cqe; 130 } RdmaRmStats; 131 132 struct RdmaDeviceResources { 133 RdmaRmPort port; 134 RdmaRmResTbl pd_tbl; 135 RdmaRmResTbl mr_tbl; 136 RdmaRmResTbl uc_tbl; 137 RdmaRmResTbl qp_tbl; 138 RdmaRmResTbl cq_tbl; 139 RdmaRmResTbl cqe_ctx_tbl; 140 RdmaRmResTbl srq_tbl; 141 GHashTable *qp_hash; /* Keeps mapping between real and emulated */ 142 QemuMutex lock; 143 RdmaRmStats stats; 144 }; 145 146 #endif 147