Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp1056769pxm; Wed, 23 Feb 2022 17:01:49 -0800 (PST) X-Google-Smtp-Source: ABdhPJxvg1vJZ/OTam7S7grjYvnP4H0mJjdN4ULSuYD8/L4fXwqbKvkWUi5hxM0WdNBOSaUP6j2Z X-Received: by 2002:a17:902:c943:b0:150:625:a5c5 with SMTP id i3-20020a170902c94300b001500625a5c5mr433044pla.144.1645664509496; Wed, 23 Feb 2022 17:01:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645664509; cv=none; d=google.com; s=arc-20160816; b=ZY/Sqd6beduXkOnxAuITrojlPgke0Q4rmMzwfkvJQxmfidTS+qQoQu6y/s0BLcy6uY ZN5XD4/JoWG6aaVfPaxLtBhLn8idgdaS84frtCW3rLTtKoeLi4Cjj9Uw3z9Mme93LO/o bU4loiL3wLrDOsFm8GcYqPFs4YcBW/BgFBn5L1p9cyeki8CBnORqt0NQyK3WjC8R5vKq J/0L1AWaqXL4azyzQMtY5HUDwMiv5n3K2yWAKLZy8MeMVNP9Dj8JwDgzAAUJr2Rrs3qQ tkpSBC7VgubbWq4bLkuFEPbmS53emBOrrzdBDwGQTHWONNcgv44KZZ386wTmJs1ZWeqr c4Yg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=bJkJL/5TA4WKChqueRaRxyqzFM2Ab+NOG7Nphd2685o=; b=Y8dU8ZssNnMYqW+8dmzKrA4BzHTfdVH1IeqzOceF+ws2wGFXhlAjUrpf2oJFPWMk8n k0k/oUgpT+6o4Wm//YGYlySx/njBK2xXJUzPpOvjUBB+liu7JnQxfhJwMYiv7a0TOyjG yAxd3hd+Ttrn00Bq+43HR6Vv/sQc07IfE8VYgM7bi/aPnqJ8D232ISKyDnSwSaFYp6So WQyrlvZn0RuGkrJyhGtZ3mDi4rHvLAK5rjgkFMSqq7WVjUvH7V0FHRjSJDawUJeEJD2Z TjmRcNozFp/vEAJn7Th3+fGRNanCiswYCUgcAr560byJgpsbbbPGJIcduYlVSqbf38NY FvCQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [2620:137:e000::1:18]) by mx.google.com with ESMTPS id s5si1109149pfk.218.2022.02.23.17.01.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Feb 2022 17:01:49 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) client-ip=2620:137:e000::1:18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 2B0E4136879; Wed, 23 Feb 2022 16:52:32 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243236AbiBWRIO (ORCPT + 99 others); Wed, 23 Feb 2022 12:08:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34754 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243274AbiBWRH4 (ORCPT ); Wed, 23 Feb 2022 12:07:56 -0500 Received: from relay8-d.mail.gandi.net (relay8-d.mail.gandi.net [IPv6:2001:4b98:dc4:8::228]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D794511A21; Wed, 23 Feb 2022 09:07:27 -0800 (PST) Received: (Authenticated sender: jacopo@jmondi.org) by mail.gandi.net (Postfix) with ESMTPSA id 4E1191BF206; Wed, 23 Feb 2022 17:07:24 +0000 (UTC) Date: Wed, 23 Feb 2022 18:07:22 +0100 From: Jacopo Mondi To: Eugen Hristev Cc: linux-media@vger.kernel.org, hverkuil-cisco@xs4all.nl, nicolas.ferre@microchip.com, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, claudiu.beznea@microchip.com Subject: Re: [PATCH v5 06/13] media: atmel: atmel-isc-base: use mutex to lock awb workqueue from streaming Message-ID: <20220223170722.lmi6727vjnhf6zwd@uno.localdomain> References: <20220217135645.1427466-1-eugen.hristev@microchip.com> <20220217135645.1427466-7-eugen.hristev@microchip.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20220217135645.1427466-7-eugen.hristev@microchip.com> X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RDNS_NONE, SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Eugen On Thu, Feb 17, 2022 at 03:56:38PM +0200, Eugen Hristev wrote: > The AWB workqueue runs in a kernel thread and needs to be synchronized > w.r.t. the streaming status. > It is possible that streaming is stopped while the AWB workq is running. > In this case it is likely that the check for vb2_start_streaming_called is done > at one point in time, but the AWB computations are done later, including a call > to isc_update_profile, which requires streaming to be started. > Thus , isc_update_profile will fail if during this operation sequence the > streaming was stopped. > To solve this issue, a mutex is added, that will serialize the awb work and > streaming stopping, with the mention that either streaming is stopped > completely including termination of the last frame is done, and after that > the AWB work can check stream status and stop; either first AWB work is > completed and after that the streaming can stop correctly. > The awb spin lock cannot be used since this spinlock is taken in the same > context and using it in the stop streaming will result in a recursion BUG. > > Signed-off-by: Eugen Hristev I trust this doesn't deadlock :) Reviewed-by: Jacopo Mondi Thanks j > --- > drivers/media/platform/atmel/atmel-isc-base.c | 29 ++++++++++++++++--- > drivers/media/platform/atmel/atmel-isc.h | 2 ++ > 2 files changed, 27 insertions(+), 4 deletions(-) > > diff --git a/drivers/media/platform/atmel/atmel-isc-base.c b/drivers/media/platform/atmel/atmel-isc-base.c > index 74f575544e09..37c59bb4dc18 100644 > --- a/drivers/media/platform/atmel/atmel-isc-base.c > +++ b/drivers/media/platform/atmel/atmel-isc-base.c > @@ -401,6 +401,7 @@ static void isc_stop_streaming(struct vb2_queue *vq) > struct isc_buffer *buf; > int ret; > > + mutex_lock(&isc->awb_mutex); > v4l2_ctrl_activate(isc->do_wb_ctrl, false); > > isc->stop = true; > @@ -410,6 +411,8 @@ static void isc_stop_streaming(struct vb2_queue *vq) > v4l2_err(&isc->v4l2_dev, > "Timeout waiting for end of the capture\n"); > > + mutex_unlock(&isc->awb_mutex); > + > /* Disable DMA interrupt */ > regmap_write(isc->regmap, ISC_INTDIS, ISC_INT_DDONE); > > @@ -1397,10 +1400,6 @@ static void isc_awb_work(struct work_struct *w) > u32 min, max; > int ret; > > - /* streaming is not active anymore */ > - if (isc->stop) > - return; > - > if (ctrls->hist_stat != HIST_ENABLED) > return; > > @@ -1455,7 +1454,24 @@ static void isc_awb_work(struct work_struct *w) > } > regmap_write(regmap, ISC_HIS_CFG + isc->offsets.his, > hist_id | baysel | ISC_HIS_CFG_RAR); > + > + /* > + * We have to make sure the streaming has not stopped meanwhile. > + * ISC requires a frame to clock the internal profile update. > + * To avoid issues, lock the sequence with a mutex > + */ > + mutex_lock(&isc->awb_mutex); > + > + /* streaming is not active anymore */ > + if (isc->stop) { > + mutex_unlock(&isc->awb_mutex); > + return; > + }; > + > isc_update_profile(isc); > + > + mutex_unlock(&isc->awb_mutex); > + > /* if awb has been disabled, we don't need to start another histogram */ > if (ctrls->awb) > regmap_write(regmap, ISC_CTRLEN, ISC_CTRL_HISREQ); > @@ -1548,6 +1564,7 @@ static int isc_s_awb_ctrl(struct v4l2_ctrl *ctrl) > */ > v4l2_ctrl_activate(isc->do_wb_ctrl, false); > } > + mutex_unlock(&isc->awb_mutex); > > /* if we have autowhitebalance on, start histogram procedure */ > if (ctrls->awb == ISC_WB_AUTO && > @@ -1740,6 +1757,7 @@ static void isc_async_unbind(struct v4l2_async_notifier *notifier, > { > struct isc_device *isc = container_of(notifier->v4l2_dev, > struct isc_device, v4l2_dev); > + mutex_destroy(&isc->awb_mutex); > cancel_work_sync(&isc->awb_work); > video_unregister_device(&isc->video_dev); > v4l2_ctrl_handler_free(&isc->ctrls.handler); > @@ -1850,6 +1868,8 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier) > isc->current_subdev = container_of(notifier, > struct isc_subdev_entity, notifier); > mutex_init(&isc->lock); > + mutex_init(&isc->awb_mutex); > + > init_completion(&isc->comp); > > /* Initialize videobuf2 queue */ > @@ -1929,6 +1949,7 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier) > video_unregister_device(vdev); > > isc_async_complete_err: > + mutex_destroy(&isc->awb_mutex); > mutex_destroy(&isc->lock); > return ret; > } > diff --git a/drivers/media/platform/atmel/atmel-isc.h b/drivers/media/platform/atmel/atmel-isc.h > index c1ca3916700e..ac8c8679dd53 100644 > --- a/drivers/media/platform/atmel/atmel-isc.h > +++ b/drivers/media/platform/atmel/atmel-isc.h > @@ -229,6 +229,7 @@ enum isc_scaler_pads { > * > * @lock: lock for serializing userspace file operations > * with ISC operations > + * @awb_mutex: serialize access to streaming status from awb work queue > * @awb_lock: lock for serializing awb work queue operations > * with DMA/buffer operations > * > @@ -309,6 +310,7 @@ struct isc_device { > struct work_struct awb_work; > > struct mutex lock; > + struct mutex awb_mutex; > spinlock_t awb_lock; > > struct regmap_field *pipeline[ISC_PIPE_LINE_NODE_NUM]; > -- > 2.25.1 >