diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 2ed282cd2940e5e48a7502d2bc3ae0596a454e66..aba848f6c47cd4aa3eb284efdb3910d277bc1453 100644 --- a/drivers/infiniband/core/umem.c +++ b/drivers/infiniband/core/umem.c @@ -48,6 +48,8 @@ #include "ib_peer_mem.h" #endif +#define RESCHED_LOOP_CNT_THRESHOLD 0x1000 + static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int dirty) { bool make_dirty = umem->writable && dirty; @@ -58,10 +60,14 @@ static void __ib_umem_release(struct ib_device *dev, struct ib_umem *umem, int d ib_dma_unmap_sg(dev, umem->sg_head.sgl, umem->sg_nents, DMA_BIDIRECTIONAL); - for_each_sg(umem->sg_head.sgl, sg, umem->sg_nents, i) + for_each_sg(umem->sg_head.sgl, sg, umem->sg_nents, i) { unpin_user_page_range_dirty_lock(sg_page(sg), DIV_ROUND_UP(sg->length, PAGE_SIZE), make_dirty); + if (i && !(i % RESCHED_LOOP_CNT_THRESHOLD)) + cond_resched(); + } + sg_free_table(&umem->sg_head); } diff --git a/drivers/infiniband/hw/hns/hns_roce_bond.c b/drivers/infiniband/hw/hns/hns_roce_bond.c index e41a11cc7c3c5f389faf1b63ca7c02331a79519c..19ef7b8cf77d79e873f4b14ee189016e5c1cc6a4 100644 --- a/drivers/infiniband/hw/hns/hns_roce_bond.c +++ b/drivers/infiniband/hw/hns/hns_roce_bond.c @@ -589,13 +589,13 @@ static struct hns_roce_die_info *alloc_die_info(int bus_num) struct hns_roce_die_info *die_info; int ret; - die_info = kzalloc(sizeof(struct hns_roce_die_info), GFP_KERNEL); + die_info = kvzalloc(sizeof(struct hns_roce_die_info), GFP_KERNEL); if (!die_info) return NULL; ret = xa_err(xa_store(&roce_bond_xa, bus_num, die_info, GFP_KERNEL)); if (ret) { - kfree(die_info); + kvfree(die_info); return NULL; } diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c index fcd953e284d11dc29a3e003bc4d0e183f4c5a120..6bc16347b378f86fd4661771ca4c9623a857778f 100644 --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c @@ -3039,7 +3039,7 @@ static void free_mr_uninit_pd(struct hns_roce_dev *hr_dev) return; hns_roce_dealloc_pd(&free_mr->rsv_pd->ibpd, NULL); - kvfree(free_mr->rsv_pd); + kfree(free_mr->rsv_pd); free_mr->rsv_pd = NULL; } @@ -3089,7 +3089,7 @@ static void free_mr_uninit_cq(struct hns_roce_dev *hr_dev) return; hns_roce_destroy_cq(&free_mr->rsv_cq->ib_cq, NULL); - kvfree(free_mr->rsv_cq); + kfree(free_mr->rsv_cq); free_mr->rsv_cq = NULL; }