Re: [PATCH] media:staging/intel-ipu3: parameter buffer refactoring

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 3/26/19 12:03 PM, Tomasz Figa wrote:
> On Mon, Mar 25, 2019 at 6:52 PM Bingbu Cao <bingbu.cao@xxxxxxxxxxxxxxx> wrote:
>>
>>
>>
>> On 3/25/19 12:20 PM, Tomasz Figa wrote:
>>> On Mon, Mar 25, 2019 at 1:12 PM Bingbu Cao <bingbu.cao@xxxxxxxxxxxxxxx> wrote:
>>>>
>>>>
>>>>
>>>> On 3/25/19 11:16 AM, Tomasz Figa wrote:
>>>>> Hi Bingbu,
>>>>>
>>>>> On Wed, Mar 13, 2019 at 1:25 PM Bingbu Cao <bingbu.cao@xxxxxxxxxxxxxxx> wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>> On 03/12/2019 04:54 PM, Tomasz Figa wrote:
>>>>>>> On Tue, Mar 12, 2019 at 5:48 PM Bingbu Cao <bingbu.cao@xxxxxxxxxxxxxxx> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 03/12/2019 03:43 PM, Tomasz Figa wrote:
>>>>>>>>> On Tue, Mar 12, 2019 at 3:48 PM Bingbu Cao <bingbu.cao@xxxxxxxxxxxxxxx> wrote:
>>>>>>>>>>
>>>>>>>>>> On 03/12/2019 01:33 PM, Tomasz Figa wrote:
>>>>>>>>>>> Hi Bingbu,
>>>>>>>>>>>
>>>>>>>>>>> On Fri, Feb 15, 2019 at 6:02 PM <bingbu.cao@xxxxxxxxx> wrote:
>>>>>>>>>>>> From: Bingbu Cao <bingbu.cao@xxxxxxxxx>
>>>>>>>>>>>>
>>>>>>>>>>>> Current ImgU driver processes and releases the parameter buffer
>>>>>>>>>>>> immediately after queued from user. This does not align with other
>>>>>>>>>>>> image buffers which are grouped in sets and used for the same frame.
>>>>>>>>>>>> If user queues multiple parameter buffers continuously, only the last
>>>>>>>>>>>> one will take effect.
>>>>>>>>>>>> To make consistent buffers usage, this patch changes the parameter
>>>>>>>>>>>> buffer handling and group parameter buffer with other image buffers
>>>>>>>>>>>> for each frame.
>>>>>>>>>>> Thanks for the patch. Please see my comments inline.
>>>>>>>>>>>
>>>>>>>>>>>> Signed-off-by: Tianshu Qiu <tian.shu.qiu@xxxxxxxxx>
>>>>>>>>>>>> Signed-off-by: Bingbu Cao <bingbu.cao@xxxxxxxxx>
>>>>>>>>>>>> ---
>>>>>>>>>>>>     drivers/staging/media/ipu3/ipu3-css.c  |  5 -----
>>>>>>>>>>>>     drivers/staging/media/ipu3/ipu3-v4l2.c | 41 ++++++++--------------------------
>>>>>>>>>>>>     drivers/staging/media/ipu3/ipu3.c      | 24 ++++++++++++++++++++
>>>>>>>>>>>>     3 files changed, 33 insertions(+), 37 deletions(-)
>>>>>>>>>>>>
>>>>>>>>>>>> diff --git a/drivers/staging/media/ipu3/ipu3-css.c b/drivers/staging/media/ipu3/ipu3-css.c
>>>>>>>>>>>> index b9354d2bb692..bcb1d436bc98 100644
>>>>>>>>>>>> --- a/drivers/staging/media/ipu3/ipu3-css.c
>>>>>>>>>>>> +++ b/drivers/staging/media/ipu3/ipu3-css.c
>>>>>>>>>>>> @@ -2160,11 +2160,6 @@ int ipu3_css_set_parameters(struct ipu3_css *css, unsigned int pipe,
>>>>>>>>>>>>            obgrid_size = ipu3_css_fw_obgrid_size(bi);
>>>>>>>>>>>>            stripes = bi->info.isp.sp.iterator.num_stripes ? : 1;
>>>>>>>>>>>>
>>>>>>>>>>>> -       /*
>>>>>>>>>>>> -        * TODO(b/118782861): If userspace queues more than 4 buffers, the
>>>>>>>>>>>> -        * parameters from previous buffers will be overwritten. Fix the driver
>>>>>>>>>>>> -        * not to allow this.
>>>>>>>>>>>> -        */
>>>>>>>>>>> Wouldn't this still happen even with current patch?
>>>>>>>>>>> imgu_queue_buffers() supposedly queues "as many buffers to CSS as
>>>>>>>>>>> possible". This means that if the userspace queues more than 4
>>>>>>>>>>> complete frames, we still end up overwriting the parameter buffers in
>>>>>>>>>>> the pool. Please correct me if I'm wrong.
>>>>>>>>>> The parameter buffers are queued to CSS sequentially and queue one
>>>>>>>>>> parameter along with one input buffer once ready, all the data and
>>>>>>>>>> parameter buffers are tied together to queue to the CSS. If userspace
>>>>>>>>>> queue more parameter buffers then input buffer, they are pending on the
>>>>>>>>>> buffer list.
>>>>>>>>> It doesn't seem to be what the code does. I'm talking about the
>>>>>>>>> following example:
>>>>>>>>>
>>>>>>>>> Queue OUT buffer 1
>>>>>>>>> Queue PARAM buffer 1
>>>>>>>>> Queue IN buffer 1
>>>>>>>>> Queue OUT buffer 2
>>>>>>>>> Queue PARAM buffer 2
>>>>>>>>> Queue IN buffer 2
>>>>>>>>> Queue OUT buffer 3
>>>>>>>>> Queue PARAM buffer 3
>>>>>>>>> Queue IN buffer 3
>>>>>>>>> Queue OUT buffer 4
>>>>>>>>> Queue PARAM buffer 4
>>>>>>>>> Queue IN buffer 4
>>>>>>>>> Queue OUT buffer 5
>>>>>>>>> Queue PARAM buffer 5
>>>>>>>>> Queue IN buffer 5
>>>>>>>>>
>>>>>>>>> All the operations happening exactly one after each other. How would
>>>>>>>>> the code prevent the 5th PARAM buffer to be queued to the IMGU, after
>>>>>>>>> the 5th IN buffer is queued? As I said, imgu_queue_buffers() just
>>>>>>>>> queues as many buffers of each type as there are IN buffers available.
>>>>>>>> So the parameter pool now is only used as record last valid parameter not
>>>>>>>> used as a list or cached, all the parameters will be queued to CSS as soon as
>>>>>>>> possible(if queue for CSS is not full).
>>>>>>>> As the size of pool now is a bit confusing, I think we can shrink the its value
>>>>>>>> for each pipe to 2.
>>>>>>> I don't follow. Don't we take one buffer from the pool, fill in the
>>>>>>> parameters in hardware format there and then queue that buffer from
>>>>>>> the pool to the ISP? The ISP wouldn't read those parameters from the
>>>>>>> buffer until the previous frame is processed, would it?
>>>>>> Hi, Tomasz,
>>>>>>
>>>>>> Currently, driver did not take the buffer from pool to queue to ISP,
>>>>>> it just queue the parameter buffer along with input frame buffer depends
>>>>>> on each user queue request.
>>>>>>
>>>>>> You are right, if user queue massive buffers one time, it will cause
>>>>>> the firmware queue full. Driver should keep the buffer in its list
>>>>>> instead of returning back to user irresponsibly.
>>>>>>
>>>>>> We are thinking about queue one group of buffers(input, output and params)
>>>>>> to ISP one time and wait the pipeline finished and then queue next group
>>>>>> of buffers. All the buffers are pending on the buffer list.
>>>>>> What do you think about this behavior?
>>>>>
>>>>> Sorry, I was sure I replied to your email, but apparently I didn't.
>>>>>
>>>>> Yes, that would certainly work, but wouldn't it introduce pipeline
>>>>> bubbles, potentially affecting the performance?
>>>> Hi, Tomasz,
>>>>
>>>> Thanks for your reply.
>>>>
>>>> The driver will queue the buffers to CSS immediately after previous
>>>> pipeline finished which is invoked in imgu_isr_threaded.
>>>>
>>>> The bubbles compared from before should be very small since current
>>>> camera HAL implementation in production will queue new buffers IFF all
>>>> the buffers dequeued from driver, as I know.
>>>
>>> If the firmware has a queue depth of 4, I think it would still be much
>>> better to use it. Would it really make the code much more complicated?
>>> I think you could just maintain a counter of queued buffers and keep
>>> refilling the queue whenever it's less than 4 and there are any
>>> buffers to queue.
>> Actually, firmware will use latest parameter queued and apply to frame,
>> they are not consumed frame by frame.
>> The parameter buffers are not used same way as frame buffers, so the
>> pool in driver is just used for storing previous parameter and refilling
>> fields within new coming parameter from user and combine with previous
>> ones into a whole parameter.
> 
> Hmm, that's a rather strange design.
> 
> Well, in that case we can't queue more than 1 frame indeed, as
> otherwise we wouldn't be able to synchronize the parameters with the
> right frames.
Hi, Tomasz

Yes, the parameter queue handling is a little different from other
queues. Group the buffers together is one way to bind the parameter to
frame. Do you have any other ideas?
> 
> Best regards,
> Tomasz
> 



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux