Message ID | 8b4203dc-bc0a-4c00-8862-e2d0ed6e346b@web.de |
---|---|
State | New |
Headers | show |
Series | media: rcar-csi2: Use common error handling code in rcsi2_parse_dt() | expand |
Hi Markus, On Fri, Mar 1, 2024 at 1:10 PM Markus Elfring <Markus.Elfring@web.de> wrote: > From: Markus Elfring <elfring@users.sourceforge.net> > Date: Fri, 1 Mar 2024 13:02:18 +0100 > > Add a label so that a bit of exception handling can be better reused > in an if branch of this function implementation. > > Signed-off-by: Markus Elfring <elfring@users.sourceforge.net> Thanks for your patch! > --- a/drivers/media/platform/renesas/rcar-csi2.c > +++ b/drivers/media/platform/renesas/rcar-csi2.c > @@ -1388,12 +1388,13 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) > ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep); > if (ret) { > dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); > - fwnode_handle_put(ep); > - return -EINVAL; > + ret = -EINVAL; > + goto put_fwnode_ep; > } > > ret = rcsi2_parse_v4l2(priv, &v4l2_ep); > if (ret) { > +put_fwnode_ep: > fwnode_handle_put(ep); > return ret; > } Please do not use goto to jump to random positions buried deep inside a function,as this makes the code harder to read. Gr{oetje,eeting}s, Geert
> Sakari Ailus pointed out in another thread that we could use __free() instead. See also: Contributions by Jonathan Cameron from 2024-02-17 * device property: Move fwnode_handle_put() into property.h https://lore.kernel.org/r/20240217164249.921878-2-jic23@kernel.org * device property: Add cleanup.h based fwnode_handle_put() scope based cleanup. https://lore.kernel.org/r/20240217164249.921878-3-jic23@kernel.org > Something like this: > > diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c > index 582d5e35db0e..c569df6057b7 100644 > --- a/drivers/media/platform/renesas/rcar-csi2.c > +++ b/drivers/media/platform/renesas/rcar-csi2.c > @@ -1372,8 +1372,8 @@ static int rcsi2_parse_v4l2(struct rcar_csi2 *priv, > static int rcsi2_parse_dt(struct rcar_csi2 *priv) > { > struct v4l2_async_connection *asc; > - struct fwnode_handle *fwnode; > - struct fwnode_handle *ep; > + struct fwnode_handle *fwnode __free(fwnode_handle) = NULL; > + struct fwnode_handle *ep __free(fwnode_handle); > struct v4l2_fwnode_endpoint v4l2_ep = { > .bus_type = V4L2_MBUS_UNKNOWN, > }; I suggest to reconsider the position for the adjusted variable declarations a bit more. > @@ -1388,18 +1388,14 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) > ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep); > if (ret) { > dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); > - fwnode_handle_put(ep); > return -EINVAL; > } > > ret = rcsi2_parse_v4l2(priv, &v4l2_ep); > - if (ret) { > - fwnode_handle_put(ep); > + if (ret) > return ret; > - } > > fwnode = fwnode_graph_get_remote_endpoint(ep); > - fwnode_handle_put(ep); > > dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode)); > > @@ -1408,7 +1404,6 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) > > asc = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode, > struct v4l2_async_connection); > - fwnode_handle_put(fwnode); > if (IS_ERR(asc)) > return PTR_ERR(asc); > I find that two function calls marked the end of scopes here which obviously are not at the end of the discussed function implementation. Thus I imagine that the known source code transformation “Reduce scope for variables” will become relevant. https://refactoring.com/catalog/reduceScopeOfVariable.html Regards, Markus
Hi Dan, On Fri, Mar 01, 2024 at 04:42:01PM +0300, Dan Carpenter wrote: > Sakari Ailus pointed out in another thread that we could use __free() > instead. Something like this: > Looks good to me. We could merge this with your SoB (pending Niklas's review). :-) The driver has been since moved under drivers/media/platform/renesas/rcar-vin/ . > diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c > index 582d5e35db0e..c569df6057b7 100644 > --- a/drivers/media/platform/renesas/rcar-csi2.c > +++ b/drivers/media/platform/renesas/rcar-csi2.c > @@ -1372,8 +1372,8 @@ static int rcsi2_parse_v4l2(struct rcar_csi2 *priv, > static int rcsi2_parse_dt(struct rcar_csi2 *priv) > { > struct v4l2_async_connection *asc; > - struct fwnode_handle *fwnode; > - struct fwnode_handle *ep; > + struct fwnode_handle *fwnode __free(fwnode_handle) = NULL; > + struct fwnode_handle *ep __free(fwnode_handle); > struct v4l2_fwnode_endpoint v4l2_ep = { > .bus_type = V4L2_MBUS_UNKNOWN, > }; > @@ -1388,18 +1388,14 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) > ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep); > if (ret) { > dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); > - fwnode_handle_put(ep); > return -EINVAL; > } > > ret = rcsi2_parse_v4l2(priv, &v4l2_ep); > - if (ret) { > - fwnode_handle_put(ep); > + if (ret) > return ret; > - } > > fwnode = fwnode_graph_get_remote_endpoint(ep); > - fwnode_handle_put(ep); > > dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode)); > > @@ -1408,7 +1404,6 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) > > asc = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode, > struct v4l2_async_connection); > - fwnode_handle_put(fwnode); > if (IS_ERR(asc)) > return PTR_ERR(asc); > >
On Mon, Mar 04, 2024 at 10:48:47AM +0000, Sakari Ailus wrote: > Hi Dan, > > On Fri, Mar 01, 2024 at 04:42:01PM +0300, Dan Carpenter wrote: > > Sakari Ailus pointed out in another thread that we could use __free() > > instead. Something like this: > > > > Looks good to me. Thanks for checking! I've never used these before. > > We could merge this with your SoB (pending Niklas's review). :-) The driver > has been since moved under drivers/media/platform/renesas/rcar-vin/ . Alright. I can resend this as a proper patch. regards, dan carpenter
diff --git a/drivers/media/platform/renesas/rcar-csi2.c b/drivers/media/platform/renesas/rcar-csi2.c index 582d5e35db0e..621c92c31965 100644 --- a/drivers/media/platform/renesas/rcar-csi2.c +++ b/drivers/media/platform/renesas/rcar-csi2.c @@ -1388,12 +1388,13 @@ static int rcsi2_parse_dt(struct rcar_csi2 *priv) ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep); if (ret) { dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); - fwnode_handle_put(ep); - return -EINVAL; + ret = -EINVAL; + goto put_fwnode_ep; } ret = rcsi2_parse_v4l2(priv, &v4l2_ep); if (ret) { +put_fwnode_ep: fwnode_handle_put(ep); return ret; }