[v3,1/6] libcamera: software_isp: Emit ispStatsReady only if IPA is running
diff mbox series

Message ID 20250225150614.20195-2-mzamazal@redhat.com
State Accepted
Headers show
Series
  • Fix occasional software ISP assertion error on stop
Related show

Commit Message

Milan Zamazal Feb. 25, 2025, 3:06 p.m. UTC
Software ISP runs debayering in a separate thread and debayering may
emit statsReady when software ISP (including the IPA) is being stopped.
The signal waits in a queue and gets invoked later, resulting in an
assertion error when attempting to invoke a method on the stopped IPA:

  FATAL default soft_ipa_proxy.cpp:456 assertion
  "state_ == ProxyRunning" failed in processStatsThread()

Let's prevent this problem by forwarding the ISP stats signal from
software ISP only when the IPA is running.  To track this,
SoftwareISP::running_ variable is introduced.

Making processing of the other signals in SoftwareISP more robust is
addressed in the followup patches.

Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
Reported-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/internal/software_isp/software_isp.h | 1 +
 src/libcamera/software_isp/software_isp.cpp            | 5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

Comments

Kieran Bingham March 1, 2025, 11:01 p.m. UTC | #1
Quoting Milan Zamazal (2025-02-25 15:06:07)
> Software ISP runs debayering in a separate thread and debayering may
> emit statsReady when software ISP (including the IPA) is being stopped.
> The signal waits in a queue and gets invoked later, resulting in an
> assertion error when attempting to invoke a method on the stopped IPA:
> 
>   FATAL default soft_ipa_proxy.cpp:456 assertion
>   "state_ == ProxyRunning" failed in processStatsThread()
> 
> Let's prevent this problem by forwarding the ISP stats signal from
> software ISP only when the IPA is running.  To track this,
> SoftwareISP::running_ variable is introduced.
> 
> Making processing of the other signals in SoftwareISP more robust is
> addressed in the followup patches.
> 
> Signed-off-by: Milan Zamazal <mzamazal@redhat.com>
> Reported-by: Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

I see this gets removed later, but I think it's part of the journey ...

And I haven't had any crashes testing tonight - so lets get these
merged.

Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>

--
Kieran

> ---
>  include/libcamera/internal/software_isp/software_isp.h | 1 +
>  src/libcamera/software_isp/software_isp.cpp            | 5 ++++-
>  2 files changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
> index 440a296d..af0dcc24 100644
> --- a/include/libcamera/internal/software_isp/software_isp.h
> +++ b/include/libcamera/internal/software_isp/software_isp.h
> @@ -100,6 +100,7 @@ private:
>         DmaBufAllocator dmaHeap_;
>  
>         std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
> +       bool running_;
>  };
>  
>  } /* namespace libcamera */
> diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
> index 44baf200..1a39f4d8 100644
> --- a/src/libcamera/software_isp/software_isp.cpp
> +++ b/src/libcamera/software_isp/software_isp.cpp
> @@ -315,6 +315,7 @@ int SoftwareIsp::start()
>         int ret = ipa_->start();
>         if (ret)
>                 return ret;
> +       running_ = true;
>  
>         ispWorkerThread_.start();
>         return 0;
> @@ -328,6 +329,7 @@ void SoftwareIsp::stop()
>         ispWorkerThread_.exit();
>         ispWorkerThread_.wait();
>  
> +       running_ = false;
>         ipa_->stop();
>  }
>  
> @@ -356,7 +358,8 @@ void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)
>  
>  void SoftwareIsp::statsReady(uint32_t frame, uint32_t bufferId)
>  {
> -       ispStatsReady.emit(frame, bufferId);
> +       if (running_)
> +               ispStatsReady.emit(frame, bufferId);
>  }
>  
>  void SoftwareIsp::inputReady(FrameBuffer *input)
> -- 
> 2.48.1
>

Patch
diff mbox series

diff --git a/include/libcamera/internal/software_isp/software_isp.h b/include/libcamera/internal/software_isp/software_isp.h
index 440a296d..af0dcc24 100644
--- a/include/libcamera/internal/software_isp/software_isp.h
+++ b/include/libcamera/internal/software_isp/software_isp.h
@@ -100,6 +100,7 @@  private:
 	DmaBufAllocator dmaHeap_;
 
 	std::unique_ptr<ipa::soft::IPAProxySoft> ipa_;
+	bool running_;
 };
 
 } /* namespace libcamera */
diff --git a/src/libcamera/software_isp/software_isp.cpp b/src/libcamera/software_isp/software_isp.cpp
index 44baf200..1a39f4d8 100644
--- a/src/libcamera/software_isp/software_isp.cpp
+++ b/src/libcamera/software_isp/software_isp.cpp
@@ -315,6 +315,7 @@  int SoftwareIsp::start()
 	int ret = ipa_->start();
 	if (ret)
 		return ret;
+	running_ = true;
 
 	ispWorkerThread_.start();
 	return 0;
@@ -328,6 +329,7 @@  void SoftwareIsp::stop()
 	ispWorkerThread_.exit();
 	ispWorkerThread_.wait();
 
+	running_ = false;
 	ipa_->stop();
 }
 
@@ -356,7 +358,8 @@  void SoftwareIsp::setSensorCtrls(const ControlList &sensorControls)
 
 void SoftwareIsp::statsReady(uint32_t frame, uint32_t bufferId)
 {
-	ispStatsReady.emit(frame, bufferId);
+	if (running_)
+		ispStatsReady.emit(frame, bufferId);
 }
 
 void SoftwareIsp::inputReady(FrameBuffer *input)