Modify create/destroy QP to support shared receive queue and rearrange the destroy_qp() code to avoid touching the QP after calling rdma_rm_dealloc_qp(). Signed-off-by: Kamal Heib <kamalheib1@gmail.com> Message-Id: <20190403113343.26384-4-kamalheib1@gmail.com> Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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
 |