
driver inclusion category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IBQK42 ---------------------------------------------------------------------- Driver allocates and frees db in a unit of page. One db page will be shared by multiple dbs. Currently the delayed destruiction of db only depends on the delayed_unmap_flag of the db itself. It means if this flag of the last db in a page is not set, this page will still be freed, and the delayed-destruction mechanism won't take effect despite the flag of some previous dbs may be set. A db page is associated with a umem_node. Add a flag to umem_node to indicate whether this page should be delayed-destroyed. Fixes: 431c875e4b02 ("RDMA/hns: Fix simultaneous reset and resource deregistration") Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com> Signed-off-by: Xinghai Cen <cenxinghai@h-partners.com> --- drivers/infiniband/hw/hns/hns_roce_db.c | 7 +++++-- drivers/infiniband/hw/hns/hns_roce_device.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/hw/hns/hns_roce_db.c b/drivers/infiniband/hw/hns/hns_roce_db.c index 78121524a794..6c4aaa38e199 100644 --- a/drivers/infiniband/hw/hns/hns_roce_db.c +++ b/drivers/infiniband/hw/hns/hns_roce_db.c @@ -67,17 +67,20 @@ void hns_roce_db_unmap_user(struct hns_roce_ucontext *context, bool delayed_unmap_flag) { struct hns_roce_dev *hr_dev = to_hr_dev(context->ibucontext.device); + struct hns_roce_umem_node *umem_node = db->u.user_page->umem_node; mutex_lock(&context->page_mutex); + umem_node->delayed_unmap_flag |= delayed_unmap_flag; + refcount_dec(&db->u.user_page->refcount); if (refcount_dec_if_one(&db->u.user_page->refcount)) { list_del(&db->u.user_page->list); - if (delayed_unmap_flag) { + if (umem_node->delayed_unmap_flag) { hns_roce_add_unfree_umem(db->u.user_page, hr_dev); } else { ib_umem_release(db->u.user_page->umem); - kvfree(db->u.user_page->umem_node); + kvfree(umem_node); } kfree(db->u.user_page); } diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h index e29f12108279..09798d124aa9 100644 --- a/drivers/infiniband/hw/hns/hns_roce_device.h +++ b/drivers/infiniband/hw/hns/hns_roce_device.h @@ -500,6 +500,7 @@ struct hns_roce_db_pgdir { struct hns_roce_umem_node { struct ib_umem *umem; struct list_head list; + bool delayed_unmap_flag; }; struct hns_roce_user_db_page { -- 2.33.0