[libcamera-devel] [PATCH] libcamera: Release all devices on shutdown

Umang Jain umang.jain at ideasonboard.com
Mon Oct 10 13:33:46 CEST 2022


Hi Christian,

On 10/9/22 3:44 PM, Christian Rauch via libcamera-devel wrote:
> Hi,
>
> For some reason, I did not receive the original response.
>
> Am 08.10.22 um 15:12 schrieb Kieran Bingham:
>> Quoting Umang Jain via libcamera-devel (2022-10-08 18:34:43)
>>> Hi Christian
>>>
>>> On 10/8/22 4:45 PM, Christian Rauch via libcamera-devel wrote:
>>>> Some devices may not be released via their 'PipelineHandler'. This 
>>>> results
>>>
>>> Can you explain better which are those devices / platform for which
>>> PipelineHandler does not release the devices? Do you have any 
>>> particular
>>> case in mind?
>
> Specifically, it's https://bugs.libcamera.org/show_bug.cgi?id=155.

The bug doesn't tell which platform is used (sensor + pipeline-handler). 
Can you provide addiitional information on the bug itself

It would be good to inspect further using the debug logs.

       ($) LIBCAMERA_LOG_LEVELS=0  cam -c1 -C

would be first step to know what's going on...
>
>>>
>>> It's the job of the pipeline handler to correctly release the device,
>>> since it's the one acquired it in the first place.
>
> The PipelineHandler does release the device when it is deconstructed,
> but the issue is here that not all PipelineHandler are deconstructed.

We need instances of such use-cases (if they are happening in the wild)

I think DeviceEnumerator getting  destroyed without getting 
PipelineHandler destroy - is quite ab-normal to me.


> Hence, devices are left acquired.

Maybe what your are experiencing is the crash before cleanup / destroy 
functions are invoked. Hence you see media devices are released etc stuff.

But again, only can be ensured once we have additional information
>
>>>> in these devices still being acquired or busy on shutdown. Make 
>>>> sure that
>>>> all devices are released when DeviceEnumerator is deconstructed.
>>>>
>>>> Signed-off-by: Christian Rauch <Rauch.Christian at gmx.de>
>>>> ---
>>>>    src/libcamera/device_enumerator.cpp | 8 ++------
>>>>    1 file changed, 2 insertions(+), 6 deletions(-)
>>>>
>>>> diff --git a/src/libcamera/device_enumerator.cpp 
>>>> b/src/libcamera/device_enumerator.cpp
>>>> index f2e055de..d0968a0a 100644
>>>> --- a/src/libcamera/device_enumerator.cpp
>>>> +++ b/src/libcamera/device_enumerator.cpp
>>>> @@ -161,12 +161,8 @@ std::unique_ptr<DeviceEnumerator> 
>>>> DeviceEnumerator::create()
>>>>
>>>>    DeviceEnumerator::~DeviceEnumerator()
>>>>    {
>>>> -     for (const std::shared_ptr<MediaDevice> &media : devices_) {
>>>> -             if (media->busy())
>>>> -                     LOG(DeviceEnumerator, Error)
>>>> -                             << "Removing media device " << 
>>>> media->deviceNode()
>>>> -                             << " while still in use";
>>>> -     }
>>>> +     for (const std::shared_ptr<MediaDevice> &media : devices_)
>>>> +             media->release();
>>>
>>> I believe this shadows  a bug and forcibly releases a device here, 
>>> which
>>> should ideally be released by the pipeline handler in the first place.
>>> The Error log is present there to catch such instances I think!
>>
>> This is my worry too. I wonder if we can record who/where the media
>> device is opened, and report that here?
>>
>> If this releases the media device, does that leave the pipeline handler
>> still accessing it? (thus leading on to a new bug / use after free)
>
> Are PipelineHandler expected to still access devices after the
> DeviceEnumerator has been deconstructed?
>
>>
>> -- 
>> Kieran
>>
>>
>>>>    }
>>>>
>>>>    /**
>>>> -- 
>>>> 2.34.1
>>>>
>>>



More information about the libcamera-devel mailing list