diff --git a/drivers/ub/urma/hw/udma/udma_common.c b/drivers/ub/urma/hw/udma/udma_common.c index c4c3e2c746b6fc44601afed8bd9b0b5f3f2506cd..8d5336622a2c5003ddd39f0be246255b64987c8f 100644 --- a/drivers/ub/urma/hw/udma/udma_common.c +++ b/drivers/ub/urma/hw/udma/udma_common.c @@ -249,8 +249,8 @@ int udma_id_alloc_auto_grow(struct udma_dev *udma_dev, struct udma_ida *ida_tabl id = ida_alloc_range(&ida_table->ida, ida_table->min, ida_table->max, GFP_ATOMIC); if (id < 0) { - dev_err(udma_dev->dev, "failed to alloc id, ret = %d.\n", id); spin_unlock(&ida_table->lock); + dev_err(udma_dev->dev, "failed to alloc id, ret = %d.\n", id); return id; } } @@ -291,9 +291,9 @@ int udma_specify_adv_id(struct udma_dev *udma_dev, struct udma_group_bitmap *bit spin_lock(&bitmap_table->lock); if ((bit[block] & (1U << bit_idx)) == 0) { + spin_unlock(&bitmap_table->lock); dev_err(udma_dev->dev, "user specify id %u been used.\n", user_id); - spin_unlock(&bitmap_table->lock); return -ENOMEM; } @@ -347,10 +347,10 @@ int udma_adv_id_alloc(struct udma_dev *udma_dev, struct udma_group_bitmap *bitma ; if (i == bitmap_cnt) { + spin_unlock(&bitmap_table->lock); dev_err(udma_dev->dev, "all bitmaps have been used, bitmap_cnt = %u.\n", bitmap_cnt); - spin_unlock(&bitmap_table->lock); return -ENOMEM; } @@ -370,9 +370,9 @@ int udma_adv_id_alloc(struct udma_dev *udma_dev, struct udma_group_bitmap *bitma ; if (i == bitmap_cnt || (i + 1) * NUM_JETTY_PER_GROUP > bitmap_table->n_bits) { + spin_unlock(&bitmap_table->lock); dev_err(udma_dev->dev, "no completely bitmap for Jetty group.\n"); - spin_unlock(&bitmap_table->lock); return -ENOMEM; } @@ -865,9 +865,11 @@ void udma_init_hugepage(struct udma_dev *dev) void udma_destroy_hugepage(struct udma_dev *dev) { struct udma_hugepage_priv *priv; + struct udma_hugepage_priv *tmp; mutex_lock(&dev->hugepage_lock); - list_for_each_entry(priv, &dev->hugepage_list, list) { + list_for_each_entry_safe(priv, tmp, &dev->hugepage_list, list) { + list_del(&priv->list); dev_info(dev->dev, "unmap_hugepage, 2m_page_num=%u.\n", priv->va_len >> UDMA_HUGEPAGE_SHIFT); udma_unpin_k_addr(priv->umem); diff --git a/drivers/ub/urma/hw/udma/udma_ctrlq_tp.c b/drivers/ub/urma/hw/udma/udma_ctrlq_tp.c index b313c26831407d962668143c7b2f3ce401e6aedd..ae9549de1e22e9756c77a1089f671f8e3de184c4 100644 --- a/drivers/ub/urma/hw/udma/udma_ctrlq_tp.c +++ b/drivers/ub/urma/hw/udma/udma_ctrlq_tp.c @@ -73,7 +73,6 @@ static struct udma_ue_idx_table *udma_find_ue_idx_by_tpn(struct udma_dev *udev, xa_lock(&udev->tpn_ue_idx_table); tp_ue_idx_info = xa_load(&udev->tpn_ue_idx_table, tpn); if (!tp_ue_idx_info) { - dev_warn(udev->dev, "ue idx info not exist, tpn %u.\n", tpn); xa_unlock(&udev->tpn_ue_idx_table); return NULL; diff --git a/drivers/ub/urma/hw/udma/udma_ctx.c b/drivers/ub/urma/hw/udma/udma_ctx.c index 4613923b6ee5f43a0574a1c5c03d3ec399e2379b..e842b523ab3341fac789c43d10707d22ae82fbe5 100644 --- a/drivers/ub/urma/hw/udma/udma_ctx.c +++ b/drivers/ub/urma/hw/udma/udma_ctx.c @@ -96,6 +96,7 @@ int udma_free_ucontext(struct ubcore_ucontext *ucontext) { struct udma_dev *udma_dev = to_udma_dev(ucontext->ub_dev); struct udma_hugepage_priv *priv; + struct udma_hugepage_priv *tmp; struct vm_area_struct *vma; struct udma_context *ctx; int ret; @@ -111,7 +112,8 @@ int udma_free_ucontext(struct ubcore_ucontext *ucontext) ummu_sva_unbind_device(ctx->sva); mutex_lock(&ctx->hugepage_lock); - list_for_each_entry(priv, &ctx->hugepage_list, list) { + list_for_each_entry_safe(priv, tmp, &ctx->hugepage_list, list) { + list_del(&priv->list); if (current->mm) { mmap_write_lock(current->mm); vma = find_vma(current->mm, (unsigned long)priv->va_base); @@ -148,9 +150,9 @@ static int udma_mmap_jetty_dsqe(struct udma_dev *dev, struct ubcore_ucontext *uc xa_lock(&dev->jetty_table.xa); sq = xa_load(&dev->jetty_table.xa, j_id); if (!sq) { + xa_unlock(&dev->jetty_table.xa); dev_err(dev->dev, "mmap failed, j_id: %llu not exist\n", j_id); - xa_unlock(&dev->jetty_table.xa); return -EINVAL; } @@ -160,9 +162,9 @@ static int udma_mmap_jetty_dsqe(struct udma_dev *dev, struct ubcore_ucontext *uc jetty_uctx = to_udma_jfs_from_queue(sq)->ubcore_jfs.uctx; if (jetty_uctx != uctx) { + xa_unlock(&dev->jetty_table.xa); dev_err(dev->dev, "mmap failed, j_id: %llu, uctx invalid\n", j_id); - xa_unlock(&dev->jetty_table.xa); return -EINVAL; } xa_unlock(&dev->jetty_table.xa); diff --git a/drivers/ub/urma/hw/udma/udma_eq.c b/drivers/ub/urma/hw/udma/udma_eq.c index d3b6813b1d550d1f5fe66ce5286cbd702395cb2d..dab9130df7619fbfeb9bc9df0e25200fb239f558 100644 --- a/drivers/ub/urma/hw/udma/udma_eq.c +++ b/drivers/ub/urma/hw/udma/udma_eq.c @@ -84,9 +84,9 @@ static int udma_ae_jfs_check_err(struct auxiliary_device *adev, uint32_t queue_n xa_lock(&udma_dev->jetty_table.xa); udma_sq = (struct udma_jetty_queue *)xa_load(&udma_dev->jetty_table.xa, queue_num); if (!udma_sq) { + xa_unlock(&udma_dev->jetty_table.xa); dev_warn(udma_dev->dev, "async event for bogus queue number = %u.\n", queue_num); - xa_unlock(&udma_dev->jetty_table.xa); return -EINVAL; } @@ -138,9 +138,9 @@ static int udma_ae_jfr_check_err(struct auxiliary_device *adev, uint32_t queue_n xa_lock(&udma_dev->jfr_table.xa); udma_jfr = (struct udma_jfr *)xa_load(&udma_dev->jfr_table.xa, queue_num); if (!udma_jfr) { + xa_unlock(&udma_dev->jfr_table.xa); dev_warn(udma_dev->dev, "async event for bogus jfr number = %u.\n", queue_num); - xa_unlock(&udma_dev->jfr_table.xa); return -EINVAL; } @@ -172,9 +172,9 @@ static int udma_ae_jfc_check_err(struct auxiliary_device *adev, uint32_t queue_n xa_lock_irqsave(&udma_dev->jfc_table.xa, flags); udma_jfc = (struct udma_jfc *)xa_load(&udma_dev->jfc_table.xa, queue_num); if (!udma_jfc) { + xa_unlock_irqrestore(&udma_dev->jfc_table.xa, flags); dev_warn(udma_dev->dev, "async event for bogus jfc number = %u.\n", queue_num); - xa_unlock_irqrestore(&udma_dev->jfc_table.xa, flags); return -EINVAL; } @@ -206,9 +206,9 @@ static int udma_ae_jetty_group_check_err(struct auxiliary_device *adev, uint32_t xa_lock(&udma_dev->jetty_grp_table.xa); udma_jetty_grp = (struct udma_jetty_grp *)xa_load(&udma_dev->jetty_grp_table.xa, queue_num); if (!udma_jetty_grp) { + xa_unlock(&udma_dev->jetty_grp_table.xa); dev_warn(udma_dev->dev, "async event for bogus jetty group number = %u.\n", queue_num); - xa_unlock(&udma_dev->jetty_grp_table.xa); return -EINVAL; } @@ -373,9 +373,9 @@ static int udma_save_tpn_ue_idx_info(struct udma_dev *udma_dev, uint8_t ue_idx, tp_ue_idx_info = xa_load(&udma_dev->tpn_ue_idx_table, tpn); if (tp_ue_idx_info) { if (tp_ue_idx_info->num >= UDMA_UE_NUM) { + xa_unlock(&udma_dev->tpn_ue_idx_table); dev_err(udma_dev->dev, "num exceeds the maximum value.\n"); - xa_unlock(&udma_dev->tpn_ue_idx_table); return -EINVAL; } diff --git a/drivers/ub/urma/hw/udma/udma_jfr.c b/drivers/ub/urma/hw/udma/udma_jfr.c index cdd0d50236a16c3d410bd9d5cc65a76633d242cf..a80f2cc0f1aa536ff2c2498dac9b69ff1922008b 100644 --- a/drivers/ub/urma/hw/udma/udma_jfr.c +++ b/drivers/ub/urma/hw/udma/udma_jfr.c @@ -393,10 +393,10 @@ static int udma_alloc_jfr_id(struct udma_dev *udma_dev, uint32_t cfg_id, uint32_ id = ida_alloc_range(&ida_table->ida, min = ida_table->min, max, GFP_ATOMIC); if (id < 0) { + spin_unlock(&ida_table->lock); dev_err(udma_dev->dev, "alloc jfr id range (%u - %u) failed, ret = %d.\n", min, max, id); - spin_unlock(&ida_table->lock); return id; }