From patchwork Mon Jun 29 16:29:26 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= X-Patchwork-Id: 27082 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7E222C3261 for ; Mon, 29 Jun 2026 16:30:40 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id E14C865F54; Mon, 29 Jun 2026 18:30:27 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="oI1s+ba7"; dkim-atps=neutral Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 5B17B65F23 for ; Mon, 29 Jun 2026 18:30:21 +0200 (CEST) Received: from pb-laptop.local (185.221.140.128.nat.pool.zt.hu [185.221.140.128]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2E5698D4; Mon, 29 Jun 2026 18:29:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1782750578; bh=V8zgSlNix/rpOp6s0TRutadeoRTwLqXW+pcnKTgSjCA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oI1s+ba7TszZfRMR1TxDd3Ia5HRB7G/D8l1JSNwU4ImthHJfZqa70NbQFrVGAsDzZ N0/JFSbsLsm5WyXM/PQdvEl8ivySmKJqtimNIcZowFeBL3q+LDoUNzId16a5fiYlj0 NJuFMhzu3oG/p5VT5b1UomzUrkdQTFoDUARjsn3s= From: =?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= To: libcamera-devel@lists.libcamera.org Cc: Laurent Pinchart Subject: [RFC PATCH v1 03/54] libcamera: pipeline: Replace open-coded request cancellation Date: Mon, 29 Jun 2026 18:29:26 +0200 Message-ID: <20260629163017.863145-4-barnabas.pocze@ideasonboard.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260629163017.863145-1-barnabas.pocze@ideasonboard.com> References: <20260629163017.863145-1-barnabas.pocze@ideasonboard.com> MIME-Version: 1.0 X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Use `PipelineHander::cancelRequest()` instead of manually cancelling, completing each buffer, then completing the request. This has the same behaviour unless the request has no pending buffers. In which case the new behaviour is to always mark the request as cancelled, while it would not have been marked as cancelled previously. This affects e.g. requests waiting for metadata after all buffers have completed. Signed-off-by: Barnabás Pőcze Reviewed-by: Laurent Pinchart --- src/libcamera/pipeline/ipu3/ipu3.cpp | 14 ++------------ .../pipeline/rpi/common/pipeline_base.cpp | 16 +--------------- src/libcamera/pipeline/vimc/vimc.cpp | 7 +------ 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 0f3e169d3b..af1b79d708 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -790,12 +790,7 @@ void IPU3CameraData::cancelPendingRequests() while (!pendingRequests_.empty()) { Request *request = pendingRequests_.front(); - for (const auto &[stream, buffer] : request->buffers()) { - buffer->_d()->cancel(); - pipe()->completeBuffer(request, buffer); - } - - pipe()->completeRequest(request); + pipe()->cancelRequest(request); pendingRequests_.pop(); } } @@ -1299,13 +1294,8 @@ void IPU3CameraData::cio2BufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (const auto &[stream, b] : request->buffers()) { - b->_d()->cancel(); - pipe()->completeBuffer(request, b); - } - frameInfos_.remove(info); - pipe()->completeRequest(request); + pipe()->cancelRequest(request); return; } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index 5a5acf6a16..6a6be5c820 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -1401,21 +1401,7 @@ void CameraData::clearIncompleteRequests() * back to the application. */ while (!requestQueue_.empty()) { - Request *request = requestQueue_.front(); - - for (auto &b : request->buffers()) { - FrameBuffer *buffer = b.second; - /* - * Has the buffer already been handed back to the - * request? If not, do so now. - */ - if (buffer->request()) { - buffer->_d()->cancel(); - pipe()->completeBuffer(request, buffer); - } - } - - pipe()->completeRequest(request); + pipe()->cancelRequest(requestQueue_.front()); requestQueue_.pop(); } } diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 01d8fb25a2..99ae60785b 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -605,12 +605,7 @@ void VimcCameraData::imageBufferReady(FrameBuffer *buffer) /* If the buffer is cancelled force a complete of the whole request. */ if (buffer->metadata().status == FrameMetadata::FrameCancelled) { - for (const auto &[stream, b] : request->buffers()) { - b->_d()->cancel(); - pipe->completeBuffer(request, b); - } - - pipe->completeRequest(request); + pipe->cancelRequest(request); return; }