component_unbind_all() splat..
Rob Clark
robdclark at gmail.com
Wed May 6 09:45:04 PDT 2015
On Wed, May 6, 2015 at 12:01 PM, Russell King - ARM Linux
<linux at arm.linux.org.uk> wrote:
> On Wed, May 06, 2015 at 10:22:22AM -0400, Rob Clark wrote:
>> Hey Russell,
>>
>> I just noticed a splat triggered by component_unbind_all() called from
>> ->bind().. any opinions about whether component stuff should handle
>> that case, or whether I should rearrange my error cleanup path to not
>> component_unbind_all() in this case?
>
> Essentially, if component_bind_all() returned an error, you should not
> call component_unbind_all() - component_bind_all() has the effect that
> it's either successful and all components have been bound, or when it
> fails, no components are bound.
>
> component_unbind_all() assumes that the components were previously
> successfully bound.
>
> When I look at the MSM code, I can see why this happens, and it's
> basically because of broken error cleanup handling caused by this
> commit:
Right, what to do to fix it in msm is clear enough.. what I was
(trying to) get at was, since error paths are perpetually undertested,
would it make more sense to handle component_unbind_all() called from
->bind().. (although I also didn't go audit the other component users
yet to see if any might have the same issue)
BR,
-R
> commit 5bf9c0b614542d69fb9a8681a0411715cc3e8ba8
> Author: Rob Clark <robdclark at gmail.com>
> Date: Tue Mar 3 15:04:24 2015 -0500
>
> drm/msm: split out vram initialization
>
> We'll want to extend this a bit to handle also a reserved-memory
> ("stolen") region, so that drm/msm can take-over bootloader splash
> screen. First split it out into it's own fxn to reduce noise in
> the following patch.
>
> Signed-off-by: Rob Clark <robdclark at gmail.com>
>
> Let's look at the clean-up paths:
>
> priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> if (!priv) {
> dev_err(dev->dev, "failed to allocate private data\n");
> return -ENOMEM;
>
> returns immediately.
>
> ret = msm_init_vram(dev);
> if (ret)
> goto fail;
>
> calls msm_unload.
>
> /* Bind all our sub-components: */
> ret = component_bind_all(dev->dev, dev);
> if (ret)
> return ret;
>
> doesn't call msm_unload.
>
> Why would the second not need to run any cleanup if failing at
> msm_init_vram() does? This is totally mad.
>
> I think you need to fix this driver to have a sane error cleanup
> implementation...
>
> --
> FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up
> according to speedtest.net.
More information about the dri-devel
mailing list