Received: by 2002:a05:7412:37c9:b0:e2:908c:2ebd with SMTP id jz9csp614557rdb; Tue, 19 Sep 2023 05:37:49 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH9/+e67v29NG5QUiNr+3P9/KLUds9i93uUYI8FirS5CkkRNm2F7wmdxg0cwNTl94d8vI66 X-Received: by 2002:a17:903:187:b0:1b8:5b70:2988 with SMTP id z7-20020a170903018700b001b85b702988mr11133264plg.30.1695127068964; Tue, 19 Sep 2023 05:37:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695127068; cv=none; d=google.com; s=arc-20160816; b=Ll/8jN6DPTPzwvaDMRQX90Ge86OmIWn6ta4+eacPFos3l/ENhHdREcTTCVU4SUK9Mg QAm22IuHHA43aQkxecTSzdYmfxZMXP8eU1IRp3L0Hs+cVKS95Kt9OSEBLTE+8va9t/eO Nm+1IHKZHE31vjYUd65u5g5A8xVdjn6UL/xYhlEsNUZTfi3xPiy7DWxkm6PT1reSKsmp nz2qL9VWKnyQr0+1NWLYdqnzR2vKcRAxtXk7B7BdXGy1d5+GWLai7O46HUsvCDVJj1iL pN1p6qxOUOn2pn6pXvvvk7qg+7/OL5IIS0DMUIW6RE00EMnLHbYXemJ2WV1zdfjDm57n VmbA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id; bh=4uVz+80h/nSv9XGpMNd/4a1ZIXrLIps1dac6iRJIFgc=; fh=rvfjkWKWQ7H3dxwU/Mrzlf1SBsZ3Tuo/EBElQFetDNM=; b=mVNJZdeFRTWRSn9sfyy1r+vLp7I2I7doSAiAtVc8wynurcnqSUMlLCsPZKm9FJxuUz 7Db4vdH3CfcjPYaz143qOZC+z+A4mQwaJGAO1Kd4s2+NOrWAVwVv8XWbBs5QIjWV8ODc 32f5Q7mRudfFZtrm2X1vPwXfo1pJpCg8itYuYBuK0zE42SqMVHUvjkOaT2kdhtNYkrS2 dzaK6tP957zGoxX2wMtvmSVLB73dctuhil47zB3qjUxpQQojN47tHJzrEwGCH9dGS/6B jq4tez0b2p2RiESx/td/7xQSizlHC2Q4M64PbduCnIxadxTs5hRZGyKzayymuXhUs49Y sSVw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=xs4all.nl Return-Path: Received: from fry.vger.email (fry.vger.email. [2620:137:e000::3:8]) by mx.google.com with ESMTPS id q14-20020a170902a3ce00b001c566ea86efsi3734588plb.31.2023.09.19.05.37.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Sep 2023 05:37:48 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) client-ip=2620:137:e000::3:8; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:8 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=xs4all.nl Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by fry.vger.email (Postfix) with ESMTP id 129358250DF8; Tue, 19 Sep 2023 05:35:05 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at fry.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231428AbjISMe4 (ORCPT + 99 others); Tue, 19 Sep 2023 08:34:56 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231320AbjISMey (ORCPT ); Tue, 19 Sep 2023 08:34:54 -0400 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E98FDF5; Tue, 19 Sep 2023 05:34:45 -0700 (PDT) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 36D65C433C9; Tue, 19 Sep 2023 12:34:42 +0000 (UTC) Message-ID: <50e4bc29-2c2d-48ae-aafc-bcedcba9c104@xs4all.nl> Date: Tue, 19 Sep 2023 14:34:40 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v7 20/49] media: core: Rework how create_buf index returned value is computed Content-Language: en-US, nl To: Benjamin Gaignard , mchehab@kernel.org, tfiga@chromium.org, m.szyprowski@samsung.com, ming.qian@nxp.com, ezequiel@vanguardiasur.com.ar, p.zabel@pengutronix.de, gregkh@linuxfoundation.org, nicolas.dufresne@collabora.com Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-rockchip@lists.infradead.org, linux-staging@lists.linux.dev, kernel@collabora.com References: <20230914133323.198857-1-benjamin.gaignard@collabora.com> <20230914133323.198857-21-benjamin.gaignard@collabora.com> From: Hans Verkuil In-Reply-To: <20230914133323.198857-21-benjamin.gaignard@collabora.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on fry.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (fry.vger.email [0.0.0.0]); Tue, 19 Sep 2023 05:35:05 -0700 (PDT) This patch is too early, it should be moved to after 44/49. Up to 44/49 (and excluding this patch), it is all internal rework that can fairly easily be merged. This patch + 45-49 is where the actual delete_buf implementation happens. I would like to get all the prep work merged fairly soon (ideally for 6.7). At that point we support more than 32 buffers, but not yet deleting buffers. That last step can be worked on separately. But we're dealing with a much shorter patch series at that point. I'll get back to this patch later for a proper review. Regards, Hans On 14/09/2023 15:32, Benjamin Gaignard wrote: > When DELETE_BUFS will be introduced holes could created in bufs array. > To be able to reuse these unused indices reworking how create->index > is set is mandatory. > Let __vb2_queue_alloc() decide which first index is correct and > forward this to the caller. > > Signed-off-by: Benjamin Gaignard > --- > .../media/common/videobuf2/videobuf2-core.c | 24 +++++++++++++------ > .../media/common/videobuf2/videobuf2-v4l2.c | 17 +++++++------ > include/media/videobuf2-core.h | 4 +++- > 3 files changed, 30 insertions(+), 15 deletions(-) > > diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c > index 70b6b8f8c390..a4c2fae8705d 100644 > --- a/drivers/media/common/videobuf2/videobuf2-core.c > +++ b/drivers/media/common/videobuf2/videobuf2-core.c > @@ -443,15 +443,24 @@ static void vb2_queue_remove_buffer(struct vb2_queue *q, struct vb2_buffer *vb) > */ > static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, > unsigned int num_buffers, unsigned int num_planes, > - const unsigned plane_sizes[VB2_MAX_PLANES]) > + const unsigned plane_sizes[VB2_MAX_PLANES], > + unsigned int *first) > { > unsigned int buffer, plane; > struct vb2_buffer *vb; > + unsigned long first_index; > int ret; > > /* Ensure that q->num_buffers+num_buffers is below q->max_allowed_buffers */ > num_buffers = min_t(unsigned int, num_buffers, > - q->max_allowed_buffers - q->num_buffers); > + q->max_allowed_buffers - vb2_get_num_buffers(q)); > + > + first_index = vb2_get_num_buffers(q); > + > + if (first_index >= q->max_allowed_buffers) > + return 0; > + > + *first = first_index; > > for (buffer = 0; buffer < num_buffers; ++buffer) { > /* Allocate vb2 buffer structures */ > @@ -472,7 +481,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, > } > call_void_bufop(q, init_buffer, vb); > > - if (!vb2_queue_add_buffer(q, vb, q->num_buffers + buffer)) { > + if (!vb2_queue_add_buffer(q, vb, first_index++)) { > dprintk(q, 1, "failed adding buffer %d to queue\n", buffer); > kfree(vb); > break; > @@ -832,7 +841,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, > unsigned int q_num_bufs = vb2_get_num_buffers(q); > unsigned plane_sizes[VB2_MAX_PLANES] = { }; > bool non_coherent_mem = flags & V4L2_MEMORY_FLAG_NON_COHERENT; > - unsigned int i; > + unsigned int i, first; > int ret = 0; > > if (q->streaming) { > @@ -919,7 +928,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, > > /* Finally, allocate buffers and video memory */ > allocated_buffers = > - __vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes); > + __vb2_queue_alloc(q, memory, num_buffers, num_planes, plane_sizes, &first); > if (allocated_buffers == 0) { > dprintk(q, 1, "memory allocation failed\n"); > ret = -ENOMEM; > @@ -993,7 +1002,8 @@ EXPORT_SYMBOL_GPL(vb2_core_reqbufs); > int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, > unsigned int flags, unsigned int *count, > unsigned int requested_planes, > - const unsigned int requested_sizes[]) > + const unsigned int requested_sizes[], > + unsigned int *first) > { > unsigned int num_planes = 0, num_buffers, allocated_buffers; > unsigned plane_sizes[VB2_MAX_PLANES] = { }; > @@ -1055,7 +1065,7 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, > > /* Finally, allocate buffers and video memory */ > allocated_buffers = __vb2_queue_alloc(q, memory, num_buffers, > - num_planes, plane_sizes); > + num_planes, plane_sizes, first); > if (allocated_buffers == 0) { > dprintk(q, 1, "memory allocation failed\n"); > ret = -ENOMEM; > diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c > index 3eb707abc26b..a88abcea2921 100644 > --- a/drivers/media/common/videobuf2/videobuf2-v4l2.c > +++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c > @@ -762,7 +762,6 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create) > > fill_buf_caps(q, &create->capabilities); > validate_memory_flags(q, create->memory, &create->flags); > - create->index = q->num_buffers; > if (create->count == 0) > return ret != -EBUSY ? ret : 0; > > @@ -804,11 +803,16 @@ int vb2_create_bufs(struct vb2_queue *q, struct v4l2_create_buffers *create) > for (i = 0; i < requested_planes; i++) > if (requested_sizes[i] == 0) > return -EINVAL; > - return ret ? ret : vb2_core_create_bufs(q, create->memory, > - create->flags, > - &create->count, > - requested_planes, > - requested_sizes); > + if (ret) > + return ret; > + > + ret = vb2_core_create_bufs(q, create->memory, > + create->flags, > + &create->count, > + requested_planes, > + requested_sizes, > + &create->index); > + return ret; > } > EXPORT_SYMBOL_GPL(vb2_create_bufs); > > @@ -1036,7 +1040,6 @@ int vb2_ioctl_create_bufs(struct file *file, void *priv, > int res = vb2_verify_memory_type(vdev->queue, p->memory, > p->format.type); > > - p->index = vdev->queue->num_buffers; > fill_buf_caps(vdev->queue, &p->capabilities); > validate_memory_flags(vdev->queue, p->memory, &p->flags); > /* > diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h > index 1ecaf4b5a76f..19c93d8eb7c8 100644 > --- a/include/media/videobuf2-core.h > +++ b/include/media/videobuf2-core.h > @@ -803,6 +803,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, > * @count: requested buffer count. > * @requested_planes: number of planes requested. > * @requested_sizes: array with the size of the planes. > + * @first: index of the first created buffer > * > * Videobuf2 core helper to implement VIDIOC_CREATE_BUFS() operation. It is > * called internally by VB2 by an API-specific handler, like > @@ -819,7 +820,8 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory, > int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory, > unsigned int flags, unsigned int *count, > unsigned int requested_planes, > - const unsigned int requested_sizes[]); > + const unsigned int requested_sizes[], > + unsigned int *first); > > /** > * vb2_core_prepare_buf() - Pass ownership of a buffer from userspace