RE: [PATCH 2/3] media: ivsc: csi: add separate lock for v4l2 control handler

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> From: Sakari Ailus <sakari.ailus@xxxxxxxxxxxxxxx>
> 
> Hi Wentong,
> 
> Thanks for the patchset.
> 
> On Mon, Jun 03, 2024 at 04:26:13PM +0800, Wentong Wu wrote:
> > There're possibilities that privacy status change notification happens
> > in the middle of the ongoing mei command which already takes the
> > command lock, but v4l2_ctrl_s_ctrl() would also need the same lock
> > prior to this patch, so this may results in circular locking problem.
> > This patch adds one dedicated lock for v4l2 control handler to avoid
> described issue.
> 
> Before this patch, wouldn't the ongoing MEI command simply complete
> before
> v4l2_ctrl_s_ctrl() could proceed?

it can, but every function calling mei_csi_send() would check the return
value and call v4l2_ctrl_s_ctrl(), probably the code would be duplicated.

BR,
Wentong
> 
> >
> > Reported-by: Hao Yao <hao.yao@xxxxxxxxx>
> > Signed-off-by: Wentong Wu <wentong.wu@xxxxxxxxx>
> > Tested-by: Jason Chen <jason.z.chen@xxxxxxxxx>
> > ---
> >  drivers/media/pci/intel/ivsc/mei_csi.c | 8 +++++++-
> >  1 file changed, 7 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/media/pci/intel/ivsc/mei_csi.c
> > b/drivers/media/pci/intel/ivsc/mei_csi.c
> > index 004ebab0b814..d6ba0d9efca1 100644
> > --- a/drivers/media/pci/intel/ivsc/mei_csi.c
> > +++ b/drivers/media/pci/intel/ivsc/mei_csi.c
> > @@ -126,6 +126,8 @@ struct mei_csi {
> >  	struct v4l2_ctrl_handler ctrl_handler;
> >  	struct v4l2_ctrl *freq_ctrl;
> >  	struct v4l2_ctrl *privacy_ctrl;
> > +	/* lock for v4l2 controls */
> > +	struct mutex ctrl_lock;
> >  	unsigned int remote_pad;
> >  	/* start streaming or not */
> >  	int streaming;
> > @@ -563,11 +565,13 @@ static int mei_csi_init_controls(struct mei_csi *csi)
> >  	u32 max;
> >  	int ret;
> >
> > +	mutex_init(&csi->ctrl_lock);
> > +
> >  	ret = v4l2_ctrl_handler_init(&csi->ctrl_handler, 2);
> >  	if (ret)
> >  		return ret;
> >
> > -	csi->ctrl_handler.lock = &csi->lock;
> > +	csi->ctrl_handler.lock = &csi->ctrl_lock;
> >
> >  	max = ARRAY_SIZE(link_freq_menu_items) - 1;
> >  	csi->freq_ctrl = v4l2_ctrl_new_int_menu(&csi->ctrl_handler,
> > @@ -756,6 +760,7 @@ static int mei_csi_probe(struct mei_cl_device
> > *cldev,
> >
> >  err_ctrl_handler:
> >  	v4l2_ctrl_handler_free(&csi->ctrl_handler);
> > +	mutex_destroy(&csi->ctrl_lock);
> >  	v4l2_async_nf_unregister(&csi->notifier);
> >  	v4l2_async_nf_cleanup(&csi->notifier);
> >
> > @@ -775,6 +780,7 @@ static void mei_csi_remove(struct mei_cl_device
> *cldev)
> >  	v4l2_async_nf_unregister(&csi->notifier);
> >  	v4l2_async_nf_cleanup(&csi->notifier);
> >  	v4l2_ctrl_handler_free(&csi->ctrl_handler);
> > +	mutex_destroy(&csi->ctrl_lock);
> >  	v4l2_async_unregister_subdev(&csi->subdev);
> >  	v4l2_subdev_cleanup(&csi->subdev);
> >  	media_entity_cleanup(&csi->subdev.entity);
> 
> --
> Kind regards,
> 
> Sakari Ailus





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux