qemu/hw/rdma/rdma_rm_defs.h
<<
>>
Prefs
   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
  37#define MAX_RM_TBL_NAME             16
  38#define MAX_CONSEQ_EMPTY_POLL_CQ    4096 /* considered as error above this */
  39
  40typedef struct RdmaRmResTbl {
  41    char name[MAX_RM_TBL_NAME];
  42    QemuMutex lock;
  43    unsigned long *bitmap;
  44    size_t tbl_sz;
  45    size_t res_sz;
  46    void *tbl;
  47    uint32_t used; /* number of used entries in the table */
  48} RdmaRmResTbl;
  49
  50typedef struct RdmaRmPD {
  51    RdmaBackendPD backend_pd;
  52    uint32_t ctx_handle;
  53} RdmaRmPD;
  54
  55typedef enum CQNotificationType {
  56    CNT_CLEAR,
  57    CNT_ARM,
  58    CNT_SET,
  59} CQNotificationType;
  60
  61typedef struct RdmaRmCQ {
  62    RdmaBackendCQ backend_cq;
  63    void *opaque;
  64    CQNotificationType notify;
  65} RdmaRmCQ;
  66
  67/* MR (DMA region) */
  68typedef struct RdmaRmMR {
  69    RdmaBackendMR backend_mr;
  70    void *virt;
  71    uint64_t start;
  72    size_t length;
  73    uint32_t pd_handle;
  74    uint32_t lkey;
  75    uint32_t rkey;
  76} RdmaRmMR;
  77
  78typedef struct RdmaRmUC {
  79    uint64_t uc_handle;
  80} RdmaRmUC;
  81
  82typedef struct RdmaRmQP {
  83    RdmaBackendQP backend_qp;
  84    void *opaque;
  85    uint32_t qp_type;
  86    uint32_t qpn;
  87    uint32_t send_cq_handle;
  88    uint32_t recv_cq_handle;
  89    enum ibv_qp_state qp_state;
  90} RdmaRmQP;
  91
  92typedef struct RdmaRmGid {
  93    union ibv_gid gid;
  94    int backend_gid_index;
  95} RdmaRmGid;
  96
  97typedef struct RdmaRmPort {
  98    RdmaRmGid gid_tbl[MAX_PORT_GIDS];
  99    enum ibv_port_state state;
 100} RdmaRmPort;
 101
 102typedef struct RdmaRmStats {
 103    uint64_t tx;
 104    uint64_t tx_len;
 105    uint64_t tx_err;
 106    uint64_t rx_bufs;
 107    uint64_t rx_bufs_len;
 108    uint64_t rx_bufs_err;
 109    uint64_t completions;
 110    uint64_t mad_tx;
 111    uint64_t mad_tx_err;
 112    uint64_t mad_rx;
 113    uint64_t mad_rx_err;
 114    uint64_t mad_rx_bufs;
 115    uint64_t mad_rx_bufs_err;
 116    uint64_t poll_cq_from_bk;
 117    uint64_t poll_cq_from_guest;
 118    uint64_t poll_cq_from_guest_empty;
 119    uint64_t poll_cq_ppoll_to;
 120    uint32_t missing_cqe;
 121} RdmaRmStats;
 122
 123struct RdmaDeviceResources {
 124    RdmaRmPort port;
 125    RdmaRmResTbl pd_tbl;
 126    RdmaRmResTbl mr_tbl;
 127    RdmaRmResTbl uc_tbl;
 128    RdmaRmResTbl qp_tbl;
 129    RdmaRmResTbl cq_tbl;
 130    RdmaRmResTbl cqe_ctx_tbl;
 131    GHashTable *qp_hash; /* Keeps mapping between real and emulated */
 132    QemuMutex lock;
 133    RdmaRmStats stats;
 134};
 135
 136#endif
 137