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