On 2020-05-15 03:30, Avri Altman wrote: > +static int ufshpb_mempool_init(struct ufshpb_dh_lun *hpb) > +{ > + unsigned int max_active_subregions = hpb->max_active_regions * > + subregions_per_region; > + int i; > + > + INIT_LIST_HEAD(&hpb->lh_map_ctx); > + spin_lock_init(&hpb->map_list_lock); > + > + for (i = 0 ; i < max_active_subregions; i++) { > + struct ufshpb_map_ctx *mctx = > + kzalloc(sizeof(struct ufshpb_map_ctx), GFP_KERNEL); > + > + if (!mctx) { > + /* > + * mctxs already added in lh_map_ctx will be removed in > + * detach > + */ > + return -ENOMEM; > + } > + > + /* actual page allocation is done upon subregion activation */ > + > + INIT_LIST_HEAD(&mctx->list); > + list_add(&mctx->list, &hpb->lh_map_ctx); > + } > + > + return 0; > + > +} Could kmem_cache_create() have been used instead of implementing yet another memory pool implementation? > +static int ufshpb_region_tbl_init(struct ufshpb_dh_lun *hpb) > +{ > + struct ufshpb_region *regions; > + int i, j; > + > + regions = kcalloc(hpb->regions_per_lun, sizeof(*regions), GFP_KERNEL); > + if (!regions) > + return -ENOMEM; > + > + atomic_set(&hpb->active_regions, 0); > + > + for (i = 0 ; i < hpb->regions_per_lun; i++) { > + struct ufshpb_region *r = regions + i; > + struct ufshpb_subregion *subregions; > + > + subregions = kcalloc(subregions_per_region, sizeof(*subregions), > + GFP_KERNEL); > + if (!subregions) > + goto release_mem; > + > + for (j = 0; j < subregions_per_region; j++) { > + struct ufshpb_subregion *s = subregions + j; > + > + s->hpb = hpb; > + s->r = r; > + s->region = i; > + s->subregion = j; > + } > + > + r->subregion_tbl = subregions; > + r->hpb = hpb; > + r->region = i; > + } > + > + hpb->region_tbl = regions; > + > + return 0; Could kvmalloc() have been used to allocate multiple subregion data structures instead of calling kcalloc() multiple times? > + spin_lock(&hpb->map_list_lock); > + > + list_for_each_entry_safe(mctx, next, &hpb->lh_map_ctx, list) { > + list_del(&mctx->list); > + kfree(mctx); > + } > + > + spin_unlock(&hpb->map_list_lock); Spinlocks should be held during a short time. I'm not sure that's the case for the above loop. Thanks, Bart.