[libcamera-devel] [PATCH v3 2/4] libcamera: ipa: raspberrypi: ALSC: Improve locking in a few places

David Plowman david.plowman at raspberrypi.com
Thu Aug 6 12:18:26 CEST 2020


Hi Kieran

Yes, I agree, it looks like a false positive to me. According to my
(limited!) understanding of C++, the lock is taken straight back as we
come out of the wait, so async_start_ is written to with the mutex
held.

Thanks!
David

On Thu, 6 Aug 2020 at 11:06, Kieran Bingham
<kieran.bingham at ideasonboard.com> wrote:
>
> Hi David,
>
> I believe this patch has introduced the following coverity warning. If
> you supply a patch to fix this issue, please add the following tag:
>
> Reported-by: Coverity CID=298183
>
> Alternatively, if you believe it's a false positive, let me know and
> I'll close it.
>
> ** CID 298183:  Concurrent data access violations  (MISSING_LOCK)
> /home/linuxembedded/iob/libcamera/libcamera-daily/src/ipa/raspberrypi/controller/rpi/alsc.cpp:
> 369 in RPi::Alsc::asyncFunc()()
>
>
> ________________________________________________________________________________________________________
> *** CID 298183:  Concurrent data access violations  (MISSING_LOCK)
> /home/linuxembedded/iob/libcamera/libcamera-daily/src/ipa/raspberrypi/controller/rpi/alsc.cpp:
> 369 in RPi::Alsc::asyncFunc()()
> 363             while (true) {
> 364                     {
> 365                             std::unique_lock<std::mutex> lock(mutex_);
> 366                             async_signal_.wait(lock, [&] {
> 367                                     return async_start_ || async_abort_;
> 368                             });
> >>>     CID 298183:  Concurrent data access violations  (MISSING_LOCK)
> >>>     Accessing "this->async_start_" without holding lock
> "RPi::Alsc.mutex_". Elsewhere, "_ZN3RPi4AlscE.async_start_" is accessed
> with "RPi::Alsc.mutex_" held 1 out of 2 times (1 of these accesses
> strongly imply that it is necessary).
> 369                             async_start_ = false;
> 370                             if (async_abort_)
> 371                                     break;
> 372                     }
> 373                     doAlsc();
> 374                     {
>
>
>
> Briefly looking, I think that the call to async_signal_.wait(lock...)
> means that the lock is held for the remainder of the scope, so in fact
> this is likely a false positive. Is that interpretation accurate?
>
>
> --
> Regards
>
> Kieran
>
>
> On 01/08/2020 09:01, David Plowman wrote:
> > Fix up a few locations where we call notify_one() with the lock
> > held. In particular, restartAsync does not need to be called with the
> > lock held for its entire duration.
> >
> > Signed-off-by: David Plowman <david.plowman at raspberrypi.com>
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> > ---
> >  src/ipa/raspberrypi/controller/rpi/alsc.cpp | 10 ++++++----
> >  1 file changed, 6 insertions(+), 4 deletions(-)
> >
> > diff --git a/src/ipa/raspberrypi/controller/rpi/alsc.cpp b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
> > index 76e2f04..12359dc 100644
> > --- a/src/ipa/raspberrypi/controller/rpi/alsc.cpp
> > +++ b/src/ipa/raspberrypi/controller/rpi/alsc.cpp
> > @@ -32,8 +32,8 @@ Alsc::~Alsc()
> >       {
> >               std::lock_guard<std::mutex> lock(mutex_);
> >               async_abort_ = true;
> > -             async_signal_.notify_one();
> >       }
> > +     async_signal_.notify_one();
> >       async_thread_.join();
> >  }
> >
> > @@ -268,8 +268,11 @@ void Alsc::restartAsync(StatisticsPtr &stats, Metadata *image_metadata)
> >       frame_phase_ = 0;
> >       // copy the camera mode so it won't change during the calculations
> >       async_camera_mode_ = camera_mode_;
> > -     async_start_ = true;
> >       async_started_ = true;
> > +     {
> > +             std::lock_guard<std::mutex> lock(mutex_);
> > +             async_start_ = true;
> > +     }
> >       async_signal_.notify_one();
> >  }
> >
> > @@ -315,7 +318,6 @@ void Alsc::Process(StatisticsPtr &stats, Metadata *image_metadata)
> >       RPI_LOG("Alsc: frame_phase " << frame_phase_);
> >       if (frame_phase_ >= (int)config_.frame_period ||
> >           frame_count2_ < (int)config_.startup_frames) {
> > -             std::unique_lock<std::mutex> lock(mutex_);
> >               if (async_started_ == false) {
> >                       RPI_LOG("ALSC thread starting");
> >                       restartAsync(stats, image_metadata);
> > @@ -339,8 +341,8 @@ void Alsc::asyncFunc()
> >               {
> >                       std::lock_guard<std::mutex> lock(mutex_);
> >                       async_finished_ = true;
> > -                     sync_signal_.notify_one();
> >               }
> > +             sync_signal_.notify_one();
> >       }
> >  }
> >
> >
>
> --
> Regards
> --
> Kieran


More information about the libcamera-devel mailing list