Thread (32 messages) 32 messages, 8 authors, 2017-09-21

Re: [PATCH v13 06/25] omap3isp: Use generic parser for parsing fwnode endpoints

From: Sakari Ailus <hidden>
Date: 2017-09-21 08:46:21
Also in: linux-media

Hi Laurent,

On Tue, Sep 19, 2017 at 07:12:14PM +0300, Laurent Pinchart wrote:
Hi Sakari,

On Tuesday, 19 September 2017 17:47:22 EEST Sakari Ailus wrote:
quoted
On Tue, Sep 19, 2017 at 03:46:18PM +0300, Laurent Pinchart wrote:
quoted
On Tuesday, 19 September 2017 15:43:26 EEST Sakari Ailus wrote:
quoted
On Tue, Sep 19, 2017 at 02:40:29PM +0300, Laurent Pinchart wrote:
quoted
quoted
@@ -2256,7 +2210,9 @@ static int isp_probe(struct platform_device
*pdev)
 	if (ret)
 		return ret;

-	ret = isp_fwnodes_parse(&pdev->dev, &isp->notifier);
+	ret = v4l2_async_notifier_parse_fwnode_endpoints(
+		&pdev->dev, &isp->notifier, sizeof(struct isp_async_subdev),
+		isp_fwnode_parse);
 	if (ret < 0)
The documentation in patch 05/25 states that
v4l2_async_notifier_release() should be called even if
v4l2_async_notifier_parse_fwnode_endpoints() fails. I don't think that's
needed here, so you might want to update the documentation (and possibly
the implementation of the function).
It is. If parsing fails, async sub-devices may have been already set up.
This happens e.g. when the parsing fails after the first one has been
successfully set up already.
But for v4l2_async_notifier_parse_fwnode_endpoints() we could clean up
internally when an error occurs. Otherwise you need to call
v4l2_async_notifier_release() here.
The functions that set up async sub-devices can be called multiple times
(on separate references). This is quite alike setting up a control handler
really, so I adopted the same pattern.

If there is a failure, how many async sub-devices should be cleaned up, if
there have been async sub-devices already set up before calling this
function?
I'm not opposed to that pattern, I just thought that cleanup could be 
automated for v4l2_async_notifier_parse_fwnode_endpoints() failures, as 
opposed to v4l2_async_notifier_parse_fwnode_endpoints_by_port() failures.

As this patch, written by the author of 
v4l2_async_notifier_parse_fwnode_endpoints() and part of the same patch 
series, is missing a call to v4l2_async_notifier_release(), I expect driver 
authors to make the same mistake and was thus wondering how to prevent that.

I believe that the issue here is that initialization of the notifier is done 
implicitly by the first call to a parsing function. With explicit notification 
it should be clear to driver authors that they need to call the cleanup 
function:

ret = init()
if (ret)
	return ret;

ret = parse()
if (ret) {
	cleanup();
	return ret;
}

ret = parse()
if (ret) {
	cleanup();
	return ret;
}

ret = parse()
if (ret) {
	cleanup();
	return ret;
}

But with an implicit initialization it's easy to miss cleanup when 
v4l2_async_notifier_parse_fwnode_endpoints() fails, as that function can be 
considered as an initilization function that performs cleanup internally.

I'm not sure what the best pattern would be. At the very least you need to fix 
this patch, but that wouldn't prevent future mistakes.
The patch was actually originally written before this was apparent. I agree
that it is not a common pattern to require cleanup function to be called on
a failure.

I'll fix the patch for v14.

Going forward, I see no reason why we couldn't automate much of this for
drivers: the bindings are generic after all. The notifier could be
registered through registration of the v4l2_device. It could be simply
released immediately if there would be no async sub-devices around.

It's not a trivial change, and I'd think well out of scope of this set:
we'll need to move link creation to the framework and detach async
sub-deviecs from parsing the endpoint properties as well.

-- 
Kind regards,

Sakari Ailus
e-mail: sakari.ailus-X3B1VOXEql0@public.gmane.org
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help