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>
86 lines
4 KiB
C
86 lines
4 KiB
C
/*
|
|
* RDMA device: Definitions of Resource Manager functions
|
|
*
|
|
* 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_H
|
|
#define RDMA_RM_H
|
|
|
|
#include "qapi/error.h"
|
|
#include "rdma_backend_defs.h"
|
|
#include "rdma_rm_defs.h"
|
|
|
|
int rdma_rm_init(RdmaDeviceResources *dev_res, struct ibv_device_attr *dev_attr,
|
|
Error **errp);
|
|
void rdma_rm_fini(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
const char *ifname);
|
|
|
|
int rdma_rm_alloc_pd(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
uint32_t *pd_handle, uint32_t ctx_handle);
|
|
RdmaRmPD *rdma_rm_get_pd(RdmaDeviceResources *dev_res, uint32_t pd_handle);
|
|
void rdma_rm_dealloc_pd(RdmaDeviceResources *dev_res, uint32_t pd_handle);
|
|
|
|
int rdma_rm_alloc_mr(RdmaDeviceResources *dev_res, uint32_t pd_handle,
|
|
uint64_t guest_start, size_t guest_length, void *host_virt,
|
|
int access_flags, uint32_t *mr_handle, uint32_t *lkey,
|
|
uint32_t *rkey);
|
|
RdmaRmMR *rdma_rm_get_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle);
|
|
void rdma_rm_dealloc_mr(RdmaDeviceResources *dev_res, uint32_t mr_handle);
|
|
|
|
int rdma_rm_alloc_uc(RdmaDeviceResources *dev_res, uint32_t pfn,
|
|
uint32_t *uc_handle);
|
|
RdmaRmUC *rdma_rm_get_uc(RdmaDeviceResources *dev_res, uint32_t uc_handle);
|
|
void rdma_rm_dealloc_uc(RdmaDeviceResources *dev_res, uint32_t uc_handle);
|
|
|
|
int rdma_rm_alloc_cq(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
uint32_t cqe, uint32_t *cq_handle, void *opaque);
|
|
RdmaRmCQ *rdma_rm_get_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle);
|
|
void rdma_rm_req_notify_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle,
|
|
bool notify);
|
|
void rdma_rm_dealloc_cq(RdmaDeviceResources *dev_res, uint32_t cq_handle);
|
|
|
|
int rdma_rm_alloc_qp(RdmaDeviceResources *dev_res, uint32_t pd_handle,
|
|
uint8_t qp_type, uint32_t max_send_wr,
|
|
uint32_t max_send_sge, uint32_t send_cq_handle,
|
|
uint32_t max_recv_wr, uint32_t max_recv_sge,
|
|
uint32_t recv_cq_handle, void *opaque, uint32_t *qpn);
|
|
RdmaRmQP *rdma_rm_get_qp(RdmaDeviceResources *dev_res, uint32_t qpn);
|
|
int rdma_rm_modify_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
uint32_t qp_handle, uint32_t attr_mask, uint8_t sgid_idx,
|
|
union ibv_gid *dgid, uint32_t dqpn,
|
|
enum ibv_qp_state qp_state, uint32_t qkey,
|
|
uint32_t rq_psn, uint32_t sq_psn);
|
|
int rdma_rm_query_qp(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
uint32_t qp_handle, struct ibv_qp_attr *attr,
|
|
int attr_mask, struct ibv_qp_init_attr *init_attr);
|
|
void rdma_rm_dealloc_qp(RdmaDeviceResources *dev_res, uint32_t qp_handle);
|
|
|
|
int rdma_rm_alloc_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t *cqe_ctx_id,
|
|
void *ctx);
|
|
void *rdma_rm_get_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t cqe_ctx_id);
|
|
void rdma_rm_dealloc_cqe_ctx(RdmaDeviceResources *dev_res, uint32_t cqe_ctx_id);
|
|
|
|
int rdma_rm_add_gid(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
const char *ifname, union ibv_gid *gid, int gid_idx);
|
|
int rdma_rm_del_gid(RdmaDeviceResources *dev_res, RdmaBackendDev *backend_dev,
|
|
const char *ifname, int gid_idx);
|
|
int rdma_rm_get_backend_gid_index(RdmaDeviceResources *dev_res,
|
|
RdmaBackendDev *backend_dev, int sgid_idx);
|
|
static inline union ibv_gid *rdma_rm_get_gid(RdmaDeviceResources *dev_res,
|
|
int sgid_idx)
|
|
{
|
|
return &dev_res->ports[0].gid_tbl[sgid_idx].gid;
|
|
}
|
|
|
|
#endif
|