Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9254DC433F5 for ; Mon, 22 Nov 2021 15:27:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239836AbhKVPad convert rfc822-to-8bit (ORCPT ); Mon, 22 Nov 2021 10:30:33 -0500 Received: from aposti.net ([89.234.176.197]:42842 "EHLO aposti.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231883AbhKVPac (ORCPT ); Mon, 22 Nov 2021 10:30:32 -0500 Date: Mon, 22 Nov 2021 15:27:14 +0000 From: Paul Cercueil Subject: Re: [PATCH 01/15] iio: buffer-dma: Get rid of incoming/outgoing queues To: Lars-Peter Clausen Cc: Jonathan Cameron , Alexandru Ardelean , Michael Hennerich , Sumit Semwal , Christian =?iso-8859-1?b?S/ZuaWc=?= , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linaro-mm-sig@lists.linaro.org Message-Id: In-Reply-To: References: <20211115141925.60164-1-paul@crapouillou.net> <20211115141925.60164-2-paul@crapouillou.net> <0COX2R.BSNX3NW8N48T@crapouillou.net> <332d001d-8b5a-bba2-c490-ed2e5efd0b1d@metafoo.de> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1; format=flowed Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le lun., nov. 22 2021 at 16:17:59 +0100, Lars-Peter Clausen a ?crit : > On 11/22/21 4:16 PM, Paul Cercueil wrote: >> Hi Lars, >> >> Le lun., nov. 22 2021 at 16:08:51 +0100, Lars-Peter Clausen >>  a ?crit : >>> On 11/21/21 9:08 PM, Paul Cercueil wrote: >>>> >>>> >>>> Le dim., nov. 21 2021 at 19:49:03 +0100, Lars-Peter Clausen >>>>  a ?crit : >>>>> On 11/21/21 6:52 PM, Paul Cercueil wrote: >>>>>> Hi Lars, >>>>>> >>>>>> Le dim., nov. 21 2021 at 17:23:35 +0100, Lars-Peter Clausen >>>>>>  a ?crit : >>>>>>> On 11/15/21 3:19 PM, Paul Cercueil wrote: >>>>>>>> The buffer-dma code was using two queues, incoming and >>>>>>>> outgoing, to >>>>>>>> manage the state of the blocks in use. >>>>>>>> >>>>>>>> While this totally works, it adds some complexity to the code, >>>>>>>> especially since the code only manages 2 blocks. It is much >>>>>>>> easier to >>>>>>>> just check each block's state manually, and keep a counter for >>>>>>>> the next >>>>>>>> block to dequeue. >>>>>>>> >>>>>>>> Since the new DMABUF based API wouldn't use these incoming and >>>>>>>> outgoing >>>>>>>> queues anyway, getting rid of them now makes the upcoming >>>>>>>> changes >>>>>>>> simpler. >>>>>>>> >>>>>>>> Signed-off-by: Paul Cercueil >>>>>>> The outgoing queue is going to be replaced by fences, but I >>>>>>> think we need to keep the incoming queue. >>>>>> >>>>>> Blocks are always accessed in sequential order, so we now have a >>>>>> "queue->next_dequeue" that cycles between the buffers >>>>>> allocated for fileio. >>>>>> >>>>>>>> [...] >>>>>>>> @@ -442,28 +435,33 @@ >>>>>>>> EXPORT_SYMBOL_GPL(iio_dma_buffer_disable); >>>>>>>> static void iio_dma_buffer_enqueue(struct >>>>>>>> iio_dma_buffer_queue *queue, >>>>>>>> struct iio_dma_buffer_block *block) >>>>>>>> { >>>>>>>> - if (block->state == IIO_BLOCK_STATE_DEAD) { >>>>>>>> + if (block->state == IIO_BLOCK_STATE_DEAD) >>>>>>>> iio_buffer_block_put(block); >>>>>>>> - } else if (queue->active) { >>>>>>>> + else if (queue->active) >>>>>>>> iio_dma_buffer_submit_block(queue, block); >>>>>>>> - } else { >>>>>>>> + else >>>>>>>> block->state = IIO_BLOCK_STATE_QUEUED; >>>>>>>> - list_add_tail(&block->head, &queue->incoming); >>>>>>> If iio_dma_buffer_enqueue() is called with a dmabuf and the >>>>>>> buffer is not active, it will be marked as queued, >>>>>>> but we don't actually keep a reference to it >>>>>>> anywhere. It will never be submitted to the DMA, and >>>>>>> it will never be signaled as completed. >>>>>> >>>>>> We do keep a reference to the buffers, in the >>>>>> queue->fileio.blocks array. When the buffer is enabled, >>>>>> all the blocks in that array that are in the "queued" >>>>>> state will be submitted to the DMA. >>>>>> >>>>> But not when used in combination with the DMA buf changes later >>>>> in this series. >>>>> >>>> >>>> That's still the case after the DMABUF changes of the series. Or >>>> can you point me exactly what you think is broken? >>>> >>> When you allocate a DMABUF with the allocate IOCTL and then submit >>> it with the enqueue IOCTL before the buffer is enabled it will >>> end up marked as queued, but not actually be queued anywhere. >>> >> >> Ok, it works for me because I never enqueue blocks before enabling >> the buffer. I can add a requirement that blocks must be enqueued >> only after the buffer is enabled. > > I don't think that is a good idea. This way you are going to > potentially drop data at the begining of your stream when the DMA > isn't ready yet. > You wouldn't drop data, but it could cause an underrun, yes. Is it such a big deal, knowing that the buffer was just enabled? I don't think you can disable then enable the buffer without causing a discontinuity in the stream. -Paul