The control over the RDMA device's GID table is done by updating the device's Ethernet function addresses. Usually the first GID entry is determined by the MAC address, the second by the first IPv6 address and the third by the IPv4 address. Other entries can be added by adding more IP addresses. The opposite is the same, i.e. whenever an address is removed, the corresponding GID entry is removed. The process is done by the network and RDMA stacks. Whenever an address is added the ib_core driver is notified and calls the device driver add_gid function which in turn update the device. To support this in pvrdma device we need to hook into the create_bind and destroy_bind HW commands triggered by pvrdma driver in guest. Whenever a change is made to the pvrdma port's GID table a special QMP message is sent to be processed by libvirt to update the address of the backend Ethernet device. Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com> Reviewed-by: Marcel Apfelbaum<marcel.apfelbaum@gmail.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
111 lines
2.5 KiB
C
111 lines
2.5 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
|
|
#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_RM_TBL_NAME 16
|
|
typedef struct RdmaRmResTbl {
|
|
char name[MAX_RM_TBL_NAME];
|
|
QemuMutex lock;
|
|
unsigned long *bitmap;
|
|
size_t tbl_sz;
|
|
size_t res_sz;
|
|
void *tbl;
|
|
} 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;
|
|
} RdmaRmQP;
|
|
|
|
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 RdmaDeviceResources {
|
|
RdmaRmPort ports[MAX_PORTS];
|
|
RdmaRmResTbl pd_tbl;
|
|
RdmaRmResTbl mr_tbl;
|
|
RdmaRmResTbl uc_tbl;
|
|
RdmaRmResTbl qp_tbl;
|
|
RdmaRmResTbl cq_tbl;
|
|
RdmaRmResTbl cqe_ctx_tbl;
|
|
GHashTable *qp_hash; /* Keeps mapping between real and emulated */
|
|
} RdmaDeviceResources;
|
|
|
|
#endif
|