[libcamera-devel] [PATCH] android: Re-order out-of-order completion path

Umang Jain umang.jain at ideasonboard.com
Fri Oct 15 05:17:32 CEST 2021


Hello,

On 10/15/21 7:32 AM, Laurent Pinchart wrote:
> Hi Jacopo,
>
> Thank you for the patch.
>
> On Thu, Oct 14, 2021 at 12:37:57PM +0200, Jacopo Mondi wrote:
>> When the camera HAL detects an out-of-order completion of a request, it
>> sends to the camera framework a CAMERA3_MSG_ERROR_DEVICE error.
>>
>> Such error not only forces the service to close the camera as prescribed
>> by the camera3 specification, but in some implementation (specifically
>> the ChromeOS one) it causes the camera service to abort and exit.
>>
>> This prevents any error messages to be printed by libcamera, as the
> s/to be printed/from being printed/
>
>> library gets terminated before getting to that point, and also hides the
>> printout of error messages that lead to out-of-order completion, making
>> it impossible to get from the output log what happened.
>>
>> Move the call to notifyError() at the end of the error path and demote
>> the error message to LogLevels::Error from Fatal to let the service
>> implementation decide how to handle CAMERA3_MSG_ERROR_DEVICE errors.
>>
>> Before this patch, when waiting on a fence fails and the capture
>> request is not queued to the Camera, we get an out-of-order completion
>> but no backtrace. With this patch applied the error path is visible:
>>
>> ERROR HAL camera_worker.cpp:122 Failed waiting for fence: 82: Timer expired
>> ERROR HAL camera_device.cpp:1110 '\_SB_.PCI0.I2C2.CAM0': Out-of-order completion for request 0x00007e6de4004c70
>>
>> Signed-off-by: Jacopo Mondi <jacopo at jmondi.org>
>> ---
>>   src/android/camera_device.cpp | 9 +++++----
>>   1 file changed, 5 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/android/camera_device.cpp b/src/android/camera_device.cpp
>> index 901867105085..f60297e13c8b 100644
>> --- a/src/android/camera_device.cpp
>> +++ b/src/android/camera_device.cpp
>> @@ -1104,16 +1104,17 @@ void CameraDevice::requestComplete(Request *request)
>>   	if (descriptor->request_->cookie() != request->cookie()) {
>>   		/*
>>   		 * \todo Clarify if the Camera has to be closed on
>> -		 * ERROR_DEVICE and possibly demote the Fatal to simple
>> -		 * Error.
>> +		 * ERROR_DEVICE.
>>   		 */
>> -		notifyError(0, nullptr, CAMERA3_MSG_ERROR_DEVICE);
>> -		LOG(HAL, Fatal)
>> +		LOG(HAL, Error)
>>   			<< "Out-of-order completion for request "
>>   			<< utils::hex(request->cookie());
>>   
>>   		MutexLocker descriptorsLock(descriptorsMutex_);
>>   		descriptors_.pop();
>> +
>> +		notifyError(0, nullptr, CAMERA3_MSG_ERROR_DEVICE);
> Given that we've removed the descriptor at the head of the queue, which
> doesn't correspond to the request, from this point onwards all hell will
> likely break loose, possibly even in the close() path. It's probably not


Can we use this as an error message, " All hell broke loose, Run!!!" ;-)

> worth than a Fatal though, so
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>


Reviewed-by: Umang Jain <umang.jain at ideasonboard.com>

>
>> +
>>   		return;
>>   	}
>>   


More information about the libcamera-devel mailing list