Robert, Vladimir, On 5/19/22 07:14, Vladimir Zapolskiy wrote: > The change simplifies driver's probe and remove functions, no functional > change is intended. > > Signed-off-by: Vladimir Zapolskiy <vladimir.zapolskiy@xxxxxxxxxx> > --- > Changes from v1 to v2: > * rebased on top of media/master > > drivers/media/platform/qcom/camss/camss.c | 33 +++++++---------------- > 1 file changed, 10 insertions(+), 23 deletions(-) > > diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c > index 79ad82e233cb..2055233af101 100644 > --- a/drivers/media/platform/qcom/camss/camss.c > +++ b/drivers/media/platform/qcom/camss/camss.c > @@ -1529,7 +1529,7 @@ static int camss_probe(struct platform_device *pdev) > struct camss *camss; > int num_subdevs, ret; > > - camss = kzalloc(sizeof(*camss), GFP_KERNEL); > + camss = devm_kzalloc(dev, sizeof(*camss), GFP_KERNEL); In general it is not a good idea to use devm_*alloc. The problem is that if a device instance is forcibly unbound, then all the memory allocated with devm_ is immediately freed. But if an application still has a file handle to a device open, then it can still use that memory. Now in this case the driver is already using devm_kcalloc, so it doesn't matter, but it is something to keep in mind. In general, hotpluggable devices cannot use devm_*alloc. In general, my recommendation is to not use devm_*alloc for this, but since it is already in use in this driver, it's better to use devm_*alloc consistently. Or, alternatively, not use it all. That's up to Robert. This is just as background information. Regards, Hans > if (!camss) > return -ENOMEM; > > @@ -1567,39 +1567,30 @@ static int camss_probe(struct platform_device *pdev) > camss->csid_num = 4; > camss->vfe_num = 4; > } else { > - ret = -EINVAL; > - goto err_free; > + return -EINVAL; > } > > camss->csiphy = devm_kcalloc(dev, camss->csiphy_num, > sizeof(*camss->csiphy), GFP_KERNEL); > - if (!camss->csiphy) { > - ret = -ENOMEM; > - goto err_free; > - } > + if (!camss->csiphy) > + return -ENOMEM; > > camss->csid = devm_kcalloc(dev, camss->csid_num, sizeof(*camss->csid), > GFP_KERNEL); > - if (!camss->csid) { > - ret = -ENOMEM; > - goto err_free; > - } > + if (!camss->csid) > + return -ENOMEM; > > if (camss->version == CAMSS_8x16 || > camss->version == CAMSS_8x96) { > camss->ispif = devm_kcalloc(dev, 1, sizeof(*camss->ispif), GFP_KERNEL); > - if (!camss->ispif) { > - ret = -ENOMEM; > - goto err_free; > - } > + if (!camss->ispif) > + return -ENOMEM; > } > > camss->vfe = devm_kcalloc(dev, camss->vfe_num, sizeof(*camss->vfe), > GFP_KERNEL); > - if (!camss->vfe) { > - ret = -ENOMEM; > - goto err_free; > - } > + if (!camss->vfe) > + return -ENOMEM; > > v4l2_async_nf_init(&camss->notifier); > > @@ -1681,8 +1672,6 @@ static int camss_probe(struct platform_device *pdev) > v4l2_device_unregister(&camss->v4l2_dev); > err_cleanup: > v4l2_async_nf_cleanup(&camss->notifier); > -err_free: > - kfree(camss); > > return ret; > } > @@ -1709,8 +1698,6 @@ void camss_delete(struct camss *camss) > device_link_del(camss->genpd_link[i]); > dev_pm_domain_detach(camss->genpd[i], true); > } > - > - kfree(camss); > } > > /*