mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
hw/rdma: Free all MAD receive buffers when device is closed
When device is going down free all saved MAD buffers. Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com> Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Message-Id: <1552300155-25216-7-git-send-email-yuval.shaia@oracle.com> Reviewed-by: Kamal Heib <kamalheib1@gmail.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
This commit is contained in:
parent
f4b2c02a29
commit
ff30a446b1
2 changed files with 35 additions and 1 deletions
|
@ -64,6 +64,33 @@ static inline void complete_work(enum ibv_wc_status status, uint32_t vendor_err,
|
||||||
comp_handler(ctx, &wc);
|
comp_handler(ctx, &wc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void free_cqe_ctx(gpointer data, gpointer user_data)
|
||||||
|
{
|
||||||
|
BackendCtx *bctx;
|
||||||
|
RdmaDeviceResources *rdma_dev_res = user_data;
|
||||||
|
unsigned long cqe_ctx_id = GPOINTER_TO_INT(data);
|
||||||
|
|
||||||
|
bctx = rdma_rm_get_cqe_ctx(rdma_dev_res, cqe_ctx_id);
|
||||||
|
if (bctx) {
|
||||||
|
rdma_rm_dealloc_cqe_ctx(rdma_dev_res, cqe_ctx_id);
|
||||||
|
}
|
||||||
|
g_free(bctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clean_recv_mads(RdmaBackendDev *backend_dev)
|
||||||
|
{
|
||||||
|
unsigned long cqe_ctx_id;
|
||||||
|
|
||||||
|
do {
|
||||||
|
cqe_ctx_id = rdma_protected_qlist_pop_int64(&backend_dev->
|
||||||
|
recv_mads_list);
|
||||||
|
if (cqe_ctx_id != -ENOENT) {
|
||||||
|
free_cqe_ctx(GINT_TO_POINTER(cqe_ctx_id),
|
||||||
|
backend_dev->rdma_dev_res);
|
||||||
|
}
|
||||||
|
} while (cqe_ctx_id != -ENOENT);
|
||||||
|
}
|
||||||
|
|
||||||
static int rdma_poll_cq(RdmaDeviceResources *rdma_dev_res, struct ibv_cq *ibcq)
|
static int rdma_poll_cq(RdmaDeviceResources *rdma_dev_res, struct ibv_cq *ibcq)
|
||||||
{
|
{
|
||||||
int i, ne, total_ne = 0;
|
int i, ne, total_ne = 0;
|
||||||
|
@ -1037,6 +1064,11 @@ static int mad_init(RdmaBackendDev *backend_dev, CharBackend *mad_chr_be)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mad_stop(RdmaBackendDev *backend_dev)
|
||||||
|
{
|
||||||
|
clean_recv_mads(backend_dev);
|
||||||
|
}
|
||||||
|
|
||||||
static void mad_fini(RdmaBackendDev *backend_dev)
|
static void mad_fini(RdmaBackendDev *backend_dev)
|
||||||
{
|
{
|
||||||
disable_rdmacm_mux_async(backend_dev);
|
disable_rdmacm_mux_async(backend_dev);
|
||||||
|
@ -1224,12 +1256,12 @@ void rdma_backend_start(RdmaBackendDev *backend_dev)
|
||||||
|
|
||||||
void rdma_backend_stop(RdmaBackendDev *backend_dev)
|
void rdma_backend_stop(RdmaBackendDev *backend_dev)
|
||||||
{
|
{
|
||||||
|
mad_stop(backend_dev);
|
||||||
stop_backend_thread(&backend_dev->comp_thread);
|
stop_backend_thread(&backend_dev->comp_thread);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rdma_backend_fini(RdmaBackendDev *backend_dev)
|
void rdma_backend_fini(RdmaBackendDev *backend_dev)
|
||||||
{
|
{
|
||||||
rdma_backend_stop(backend_dev);
|
|
||||||
mad_fini(backend_dev);
|
mad_fini(backend_dev);
|
||||||
g_hash_table_destroy(ah_hash);
|
g_hash_table_destroy(ah_hash);
|
||||||
ibv_destroy_comp_channel(backend_dev->channel);
|
ibv_destroy_comp_channel(backend_dev->channel);
|
||||||
|
|
|
@ -313,6 +313,8 @@ static void pvrdma_fini(PCIDevice *pdev)
|
||||||
|
|
||||||
pvrdma_qp_ops_fini();
|
pvrdma_qp_ops_fini();
|
||||||
|
|
||||||
|
rdma_backend_stop(&dev->backend_dev);
|
||||||
|
|
||||||
rdma_rm_fini(&dev->rdma_dev_res, &dev->backend_dev,
|
rdma_rm_fini(&dev->rdma_dev_res, &dev->backend_dev,
|
||||||
dev->backend_eth_device_name);
|
dev->backend_eth_device_name);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue