RE: [RFC PATCH 25/26] s5p-mfc: remove V4L2_FL_LOCK_ALL_FOPS

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

 



Hi Hans,

Thank you for your patch. I have tested it on our hardware and MFC works.

Best wishes,
--
Kamil Debski
Linux Platform Group
Samsung Poland R&D Center

> -----Original Message-----
> From: Hans Verkuil [mailto:hverkuil@xxxxxxxxx]
> Sent: 24 June 2012 13:26
> To: linux-media@xxxxxxxxxxxxxxx
> Cc: Andy Walls; Guennadi Liakhovetski; Mauro Carvalho Chehab; Scott Jiang;
> Manjunatha Halli; Manjunath Hadli; Anatolij Gustschin; Javier Martin;
> Sensoray Linux Development; Sylwester Nawrocki; Kamil Debski; Andrzej
> Pietrasiewicz; Sachin Kamat; Tomasz Stanislawski; mitov@xxxxxxxxxxx; Hans
> Verkuil
> Subject: [RFC PATCH 25/26] s5p-mfc: remove V4L2_FL_LOCK_ALL_FOPS
> 
> From: Hans Verkuil <hans.verkuil@xxxxxxxxx>
> 
> Add proper locking to the file operations, allowing for the removal
> of the V4L2_FL_LOCK_ALL_FOPS flag.
> 
> Signed-off-by: Hans Verkuil <hans.verkuil@xxxxxxxxx>

Acked-by: Kamil Debski <k.debski@xxxxxxxxxxx>

> ---
>  drivers/media/video/s5p-mfc/s5p_mfc.c |   19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/media/video/s5p-mfc/s5p_mfc.c
> b/drivers/media/video/s5p-mfc/s5p_mfc.c
> index 9bb68e7..e3e616d 100644
> --- a/drivers/media/video/s5p-mfc/s5p_mfc.c
> +++ b/drivers/media/video/s5p-mfc/s5p_mfc.c
> @@ -645,6 +645,8 @@ static int s5p_mfc_open(struct file *file)
>  	int ret = 0;
> 
>  	mfc_debug_enter();
> +	if (mutex_lock_interruptible(&dev->mfc_mutex))
> +		return -ERESTARTSYS;
>  	dev->num_inst++;	/* It is guarded by mfc_mutex in vfd */
>  	/* Allocate memory for context */
>  	ctx = kzalloc(sizeof *ctx, GFP_KERNEL);
> @@ -765,6 +767,7 @@ static int s5p_mfc_open(struct file *file)
>  		goto err_queue_init;
>  	}
>  	init_waitqueue_head(&ctx->queue);
> +	mutex_unlock(&dev->mfc_mutex);
>  	mfc_debug_leave();
>  	return ret;
>  	/* Deinit when failure occured */
> @@ -790,6 +793,7 @@ err_no_ctx:
>  	kfree(ctx);
>  err_alloc:
>  	dev->num_inst--;
> +	mutex_unlock(&dev->mfc_mutex);
>  	mfc_debug_leave();
>  	return ret;
>  }
> @@ -802,6 +806,7 @@ static int s5p_mfc_release(struct file *file)
>  	unsigned long flags;
> 
>  	mfc_debug_enter();
> +	mutex_lock(&dev->mfc_mutex);
>  	s5p_mfc_clock_on();
>  	vb2_queue_release(&ctx->vq_src);
>  	vb2_queue_release(&ctx->vq_dst);
> @@ -855,6 +860,7 @@ static int s5p_mfc_release(struct file *file)
>  	v4l2_fh_exit(&ctx->fh);
>  	kfree(ctx);
>  	mfc_debug_leave();
> +	mutex_unlock(&dev->mfc_mutex);
>  	return 0;
>  }
> 
> @@ -869,6 +875,7 @@ static unsigned int s5p_mfc_poll(struct file *file,
>  	unsigned int rc = 0;
>  	unsigned long flags;
> 
> +	mutex_lock(&dev->mfc_mutex);
>  	src_q = &ctx->vq_src;
>  	dst_q = &ctx->vq_dst;
>  	/*
> @@ -902,6 +909,7 @@ static unsigned int s5p_mfc_poll(struct file *file,
>  		rc |= POLLIN | POLLRDNORM;
>  	spin_unlock_irqrestore(&dst_q->done_lock, flags);
>  end:
> +	mutex_unlock(&dev->mfc_mutex);
>  	return rc;
>  }
> 
> @@ -909,8 +917,12 @@ end:
>  static int s5p_mfc_mmap(struct file *file, struct vm_area_struct *vma)
>  {
>  	struct s5p_mfc_ctx *ctx = fh_to_ctx(file->private_data);
> +	struct s5p_mfc_dev *dev = ctx->dev;
>  	unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
>  	int ret;
> +
> +	if (mutex_lock_interruptible(&dev->mfc_mutex))
> +		return -ERESTARTSYS;
>  	if (offset < DST_QUEUE_OFF_BASE) {
>  		mfc_debug(2, "mmaping source\n");
>  		ret = vb2_mmap(&ctx->vq_src, vma);
> @@ -919,6 +931,7 @@ static int s5p_mfc_mmap(struct file *file, struct
> vm_area_struct *vma)
>  		vma->vm_pgoff -= (DST_QUEUE_OFF_BASE >> PAGE_SHIFT);
>  		ret = vb2_mmap(&ctx->vq_dst, vma);
>  	}
> +	mutex_unlock(&dev->mfc_mutex);
>  	return ret;
>  }
> 
> @@ -1034,10 +1047,6 @@ static int s5p_mfc_probe(struct platform_device
> *pdev)
>  	vfd->ioctl_ops	= get_dec_v4l2_ioctl_ops();
>  	vfd->release	= video_device_release,
>  	vfd->lock	= &dev->mfc_mutex;
> -	/* Locking in file operations other than ioctl should be done
> -	   by the driver, not the V4L2 core.
> -	   This driver needs auditing so that this flag can be removed. */
> -	set_bit(V4L2_FL_LOCK_ALL_FOPS, &vfd->flags);
>  	vfd->v4l2_dev	= &dev->v4l2_dev;
>  	snprintf(vfd->name, sizeof(vfd->name), "%s", S5P_MFC_DEC_NAME);
>  	dev->vfd_dec	= vfd;
> @@ -1062,8 +1071,6 @@ static int s5p_mfc_probe(struct platform_device
> *pdev)
>  	vfd->ioctl_ops	= get_enc_v4l2_ioctl_ops();
>  	vfd->release	= video_device_release,
>  	vfd->lock	= &dev->mfc_mutex;
> -	/* This should not be necessary */
> -	set_bit(V4L2_FL_LOCK_ALL_FOPS, &vfd->flags);
>  	vfd->v4l2_dev	= &dev->v4l2_dev;
>  	snprintf(vfd->name, sizeof(vfd->name), "%s", S5P_MFC_ENC_NAME);
>  	dev->vfd_enc	= vfd;
> --
> 1.7.10

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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