On Sat, Oct 10, 2015 at 02:48:22PM +0800, Chen Feng wrote: > +static int hi6220_ion_probe(struct platform_device *pdev) > +{ > + int i; > + int err = 0; > + static struct ion_platform_heap *p_heap; > + > + idev = ion_device_create(NULL); > + hi6220_set_platform_data(pdev); > + heaps = devm_kzalloc(&pdev->dev, > + sizeof(struct ion_heap *) * num_heaps, > + GFP_KERNEL); > + if (!heaps) > + return -ENOMEM; > + > + /* > + * create the heaps as specified in the dts file > + */ > + for (i = 0; i < num_heaps; i++) { > + p_heap = heaps_data[i]; > + heaps[i] = ion_heap_create(p_heap); > + if (IS_ERR_OR_NULL(heaps[i])) { > + err = PTR_ERR(heaps[i]); > + goto err_free_heaps; > + } > + > + ion_device_add_heap(idev, heaps[i]); > + > + pr_info("%s: adding heap %s of type %d with %lx@%lx\n", > + __func__, p_heap->name, p_heap->type, > + p_heap->base, (unsigned long)p_heap->size); > + } > + return err; > + > +err_free_heaps: > + ion_device_destroy(idev); > + for (i = 0; i < num_heaps; ++i) { > + ion_heap_destroy(heaps[i]); > + heaps[i] = NULL; > + } > + > + return err; > +} Thanks this is better but still not quite right. You have to unwind in the reverse order from how you allocated things. err_free_heaps: for (i = 0; i < num_heaps; ++i) { ion_heap_destroy(heaps[i]); heaps[i] = NULL; } err_destroy_idev: ion_device_destroy(idev); return err; And earlier it should be: idev = ion_device_create(NULL); hi6220_set_platform_data(pdev); heaps = devm_kzalloc(&pdev->dev, sizeof(struct ion_heap *) * num_heaps, GFP_KERNEL); - if (!heaps) - return -ENOMEM; + if (!heaps) { + err = -ENOMEM; + goto err_destroy_idev; + } Otherwise we leak some resources if we can't allocate "heaps". regards, dan carpenter _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel