From patchwork Wed Nov 15 17:10:51 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Gustavo F. Padovan" X-Patchwork-Id: 45466 Received: from vger.kernel.org ([209.132.180.67]) by www.linuxtv.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eF1E3-0006o7-Os; Wed, 15 Nov 2017 17:11:48 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933323AbdKORLm (ORCPT + 1 other); Wed, 15 Nov 2017 12:11:42 -0500 Received: from mail-qt0-f195.google.com ([209.85.216.195]:53220 "EHLO mail-qt0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932660AbdKORLZ (ORCPT ); Wed, 15 Nov 2017 12:11:25 -0500 Received: by mail-qt0-f195.google.com with SMTP id 31so35964041qtz.9; Wed, 15 Nov 2017 09:11:25 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=aDNbC454OgyVZ4naQk975483pQW7ajNRjwobxgdNPsY=; b=nc3XjVbnZepH4qc87eN7P4ApjYmmMBWQhRm5zggMj9/hB5Unr8hiAgsSczDVryi9lP PagrVB3sRXcnvvATJ5BWgCz3NaUkqGSafBQJUaDZ+JkISO9puEdYQUThE+/DVLstqzll PK8QFVKnM+Rll/2M4a8g5+PWmKi1Jz2O50UyWfCT1BIgYel2O+M+zfpITl7uDEulSsoD Q8tPVAYa94pDzRte1jxRSYRHzB0MiHWDv3NCcMjgEwIuLVKTItfl4XDm9/pXeNqd3LpY fQyAwNCaTcvM3O9d0WfB8V5OW7PpqziTwupRZsvd0Se2nZUFfZZc7Cx7UmBjT4sEyeAL tUkw== X-Gm-Message-State: AJaThX5Fpw14Z3K4nUHrBeb/MjPsPZS1/5s4lq8Rl183LCo9uy3juYIl kh3WoNPhge2a0kd/30YgT4QhQyXW X-Google-Smtp-Source: AGs4zMb0H3/kSQxVGurV0FvBc5KfvFjVWEvgUU8yIRpFcJCRL8JtgG8+mgEpdaEkl/iTbVfPbmJWpA== X-Received: by 10.237.47.228 with SMTP id m91mr2319465qtd.205.1510765884306; Wed, 15 Nov 2017 09:11:24 -0800 (PST) Received: from localhost.localdomain ([179.110.36.75]) by smtp.gmail.com with ESMTPSA id p85sm15211633qkp.94.2017.11.15.09.11.21 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 15 Nov 2017 09:11:23 -0800 (PST) From: Gustavo Padovan To: linux-media@vger.kernel.org Cc: Hans Verkuil , Mauro Carvalho Chehab , Shuah Khan , Pawel Osciak , Alexandre Courbot , Sakari Ailus , Brian Starkey , Thierry Escande , linux-kernel@vger.kernel.org, Gustavo Padovan Subject: [RFC v5 05/11] [media] vb2: check earlier if stream can be started Date: Wed, 15 Nov 2017 15:10:51 -0200 Message-Id: <20171115171057.17340-6-gustavo@padovan.org> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20171115171057.17340-1-gustavo@padovan.org> References: <20171115171057.17340-1-gustavo@padovan.org> Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org From: Gustavo Padovan To support explicit synchronization we need to run all operations that can fail before we queue the buffer to the driver. With fences the queueing will be delayed if the fence is not signaled yet and it will be better if such callback do not fail. For that we move the vb2_start_streaming() before the queuing for the buffer may happen. Signed-off-by: Gustavo Padovan --- drivers/media/v4l2-core/videobuf2-core.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/drivers/media/v4l2-core/videobuf2-core.c b/drivers/media/v4l2-core/videobuf2-core.c index cb115ba6a1d2..60f8b582396a 100644 --- a/drivers/media/v4l2-core/videobuf2-core.c +++ b/drivers/media/v4l2-core/videobuf2-core.c @@ -1399,29 +1399,27 @@ int vb2_core_qbuf(struct vb2_queue *q, unsigned int index, void *pb) trace_vb2_qbuf(q, vb); /* - * If already streaming, give the buffer to driver for processing. - * If not, the buffer will be given to driver on next streamon. - */ - if (q->start_streaming_called) - __enqueue_in_driver(vb); - - /* Fill buffer information for the userspace */ - if (pb) - call_void_bufop(q, fill_user_buffer, vb, pb); - - /* * If streamon has been called, and we haven't yet called * start_streaming() since not enough buffers were queued, and * we now have reached the minimum number of queued buffers, * then we can finally call start_streaming(). + * + * If already streaming, give the buffer to driver for processing. + * If not, the buffer will be given to driver on next streamon. */ if (q->streaming && !q->start_streaming_called && q->queued_count >= q->min_buffers_needed) { ret = vb2_start_streaming(q); if (ret) return ret; + } else if (q->start_streaming_called) { + __enqueue_in_driver(vb); } + /* Fill buffer information for the userspace */ + if (pb) + call_void_bufop(q, fill_user_buffer, vb, pb); + dprintk(2, "qbuf of buffer %d succeeded\n", vb->index); return 0; }