All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hans Verkuil <hverkuil@xs4all.nl>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Sasha Levin <sasha.levin@oracle.com>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
	linux-media@vger.kernel.org, Sakari Ailus <sakari.ailus@iki.fi>,
	Katsuya MATSUBARA <matsu@igel.co.jp>,
	Sylwester Nawrocki <sylvester.nawrocki@gmail.com>,
	linux-sh@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>,
	Dave Jones <davej@redhat.com>
Subject: Re: [PATCH v7] media: vb2: Take queue or device lock in mmap-related vb2 ioctl handlers
Date: Wed, 02 Jul 2014 06:33:47 +0000	[thread overview]
Message-ID: <53B3A7CB.8020901@xs4all.nl> (raw)
In-Reply-To: <2051293.PjTd9YAWz0@avalon>

For now it is -ENOTIME for me. It's on my TODO list, but there are a number of
other things I want to finish first.

Regards,

	Hans

On 07/01/2014 11:08 PM, Laurent Pinchart wrote:
> On Wednesday 25 June 2014 12:58:03 Sasha Levin wrote:
>> Ping?
> 
> Hans, I've replied to your previous e-mail with
> 
> I'm of course fine with a different way to solve the race condition, if we can 
> find a good one. Do you already know how you would like to solve this ?
> 
>> On 05/23/2014 09:54 AM, Hans Verkuil wrote:
>>> Hi Laurent,
>>>
>>> This patch caused a circular locking dependency as reported by Sasha
>>> Levin:
>>>
>>> https://lkml.org/lkml/2014/5/5/366
>>>
>>> The reason is that copy_to/from_user is called in video_usercopy() with
>>> the
>>> core lock held. The copy functions can fault which takes the mmap_sem. If
>>> it was just video_usercopy() then it would be fairly easy to solve this,
>>> but the copy_to_/from_user functions are also called from read and write
>>> and they can be used in other unexpected places.
>>>
>>> I'm not sure if vb2_fop_get_unmapped_area() is a problem. I suspect (but
>>> I'm not sure) that when that one is called the mmap_sem isn't taken, in
>>> which case taking the lock is fine.
>>>
>>> But taking the lock in vb2_fop_mmap() does cause lockdep problems.
>>>
>>> Ideally I would like to drop taking that lock in vb2_fop_mmap and resolve
>>> the race condition that it intended to fix in a different way.
>>>
>>> Regards,
>>>
>>> 	Hans
>>>
>>> On 08/06/2013 10:10 PM, Laurent Pinchart wrote:
>>>> The vb2_fop_mmap() and vb2_fop_get_unmapped_area() functions are plug-in
>>>> implementation of the mmap() and get_unmapped_area() file operations
>>>> that calls vb2_mmap() and vb2_get_unmapped_area() on the queue
>>>> associated with the video device. Neither the
>>>> vb2_fop_mmap/vb2_fop_get_unmapped_area nor the
>>>> v4l2_mmap/vb2_get_unmapped_area functions in the V4L2 core take any
>>>> lock, leading to race conditions between mmap/get_unmapped_area and
>>>> other buffer-related ioctls such as VIDIOC_REQBUFS.
>>>>
>>>> Fix it by taking the queue or device lock around the vb2_mmap() and
>>>> vb2_get_unmapped_area() calls.
>>>>
>>>> Signed-off-by: Laurent Pinchart
>>>> <laurent.pinchart+renesas@ideasonboard.com>
>>>> ---
>>>>
>>>>  drivers/media/v4l2-core/videobuf2-core.c | 18 ++++++++++++++++--
>>>>  1 file changed, 16 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/media/v4l2-core/videobuf2-core.c
>>>> b/drivers/media/v4l2-core/videobuf2-core.c index 9fc4bab..c9b50c7 100644
>>>> --- a/drivers/media/v4l2-core/videobuf2-core.c
>>>> +++ b/drivers/media/v4l2-core/videobuf2-core.c
>>>> @@ -2578,8 +2578,15 @@ EXPORT_SYMBOL_GPL(vb2_ioctl_expbuf);
>>>>  int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma)
>>>>  {
>>>>  	struct video_device *vdev = video_devdata(file);
>>>> +	struct mutex *lock = vdev->queue->lock ? vdev->queue->lock :
>>>> vdev->lock;
>>>> +	int err;
>>>>
>>>> -	return vb2_mmap(vdev->queue, vma);
>>>> +	if (lock && mutex_lock_interruptible(lock))
>>>> +		return -ERESTARTSYS;
>>>> +	err = vb2_mmap(vdev->queue, vma);
>>>> +	if (lock)
>>>> +		mutex_unlock(lock);
>>>> +	return err;
>>>>  }
>>>>  EXPORT_SYMBOL_GPL(vb2_fop_mmap);
>>>>
>>>> @@ -2685,8 +2692,15 @@ unsigned long vb2_fop_get_unmapped_area(struct
>>>> file *file, unsigned long addr,>> 
>>>>  		unsigned long len, unsigned long pgoff, unsigned long flags)
>>>>  {
>>>>  	struct video_device *vdev = video_devdata(file);
>>>> +	struct mutex *lock = vdev->queue->lock ? vdev->queue->lock :
>>>> vdev->lock;
>>>> +	int ret;
>>>>
>>>> -	return vb2_get_unmapped_area(vdev->queue, addr, len, pgoff, flags);
>>>> +	if (lock && mutex_lock_interruptible(lock))
>>>> +		return -ERESTARTSYS;
>>>> +	ret = vb2_get_unmapped_area(vdev->queue, addr, len, pgoff, flags);
>>>> +	if (lock)
>>>> +		mutex_unlock(lock);
>>>> +	return ret;
>>>>
>>>>  }
>>>>  EXPORT_SYMBOL_GPL(vb2_fop_get_unmapped_area);
>>>>  #endif
> 


WARNING: multiple messages have this Message-ID (diff)
From: Hans Verkuil <hverkuil@xs4all.nl>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Sasha Levin <sasha.levin@oracle.com>
Cc: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
	linux-media@vger.kernel.org, Sakari Ailus <sakari.ailus@iki.fi>,
	Katsuya MATSUBARA <matsu@igel.co.jp>,
	Sylwester Nawrocki <sylvester.nawrocki@gmail.com>,
	linux-sh@vger.kernel.org, LKML <linux-kernel@vger.kernel.org>,
	Dave Jones <davej@redhat.com>
Subject: Re: [PATCH v7] media: vb2: Take queue or device lock in mmap-related vb2 ioctl handlers
Date: Wed, 02 Jul 2014 08:33:47 +0200	[thread overview]
Message-ID: <53B3A7CB.8020901@xs4all.nl> (raw)
In-Reply-To: <2051293.PjTd9YAWz0@avalon>

For now it is -ENOTIME for me. It's on my TODO list, but there are a number of
other things I want to finish first.

Regards,

	Hans

On 07/01/2014 11:08 PM, Laurent Pinchart wrote:
> On Wednesday 25 June 2014 12:58:03 Sasha Levin wrote:
>> Ping?
> 
> Hans, I've replied to your previous e-mail with
> 
> I'm of course fine with a different way to solve the race condition, if we can 
> find a good one. Do you already know how you would like to solve this ?
> 
>> On 05/23/2014 09:54 AM, Hans Verkuil wrote:
>>> Hi Laurent,
>>>
>>> This patch caused a circular locking dependency as reported by Sasha
>>> Levin:
>>>
>>> https://lkml.org/lkml/2014/5/5/366
>>>
>>> The reason is that copy_to/from_user is called in video_usercopy() with
>>> the
>>> core lock held. The copy functions can fault which takes the mmap_sem. If
>>> it was just video_usercopy() then it would be fairly easy to solve this,
>>> but the copy_to_/from_user functions are also called from read and write
>>> and they can be used in other unexpected places.
>>>
>>> I'm not sure if vb2_fop_get_unmapped_area() is a problem. I suspect (but
>>> I'm not sure) that when that one is called the mmap_sem isn't taken, in
>>> which case taking the lock is fine.
>>>
>>> But taking the lock in vb2_fop_mmap() does cause lockdep problems.
>>>
>>> Ideally I would like to drop taking that lock in vb2_fop_mmap and resolve
>>> the race condition that it intended to fix in a different way.
>>>
>>> Regards,
>>>
>>> 	Hans
>>>
>>> On 08/06/2013 10:10 PM, Laurent Pinchart wrote:
>>>> The vb2_fop_mmap() and vb2_fop_get_unmapped_area() functions are plug-in
>>>> implementation of the mmap() and get_unmapped_area() file operations
>>>> that calls vb2_mmap() and vb2_get_unmapped_area() on the queue
>>>> associated with the video device. Neither the
>>>> vb2_fop_mmap/vb2_fop_get_unmapped_area nor the
>>>> v4l2_mmap/vb2_get_unmapped_area functions in the V4L2 core take any
>>>> lock, leading to race conditions between mmap/get_unmapped_area and
>>>> other buffer-related ioctls such as VIDIOC_REQBUFS.
>>>>
>>>> Fix it by taking the queue or device lock around the vb2_mmap() and
>>>> vb2_get_unmapped_area() calls.
>>>>
>>>> Signed-off-by: Laurent Pinchart
>>>> <laurent.pinchart+renesas@ideasonboard.com>
>>>> ---
>>>>
>>>>  drivers/media/v4l2-core/videobuf2-core.c | 18 ++++++++++++++++--
>>>>  1 file changed, 16 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/media/v4l2-core/videobuf2-core.c
>>>> b/drivers/media/v4l2-core/videobuf2-core.c index 9fc4bab..c9b50c7 100644
>>>> --- a/drivers/media/v4l2-core/videobuf2-core.c
>>>> +++ b/drivers/media/v4l2-core/videobuf2-core.c
>>>> @@ -2578,8 +2578,15 @@ EXPORT_SYMBOL_GPL(vb2_ioctl_expbuf);
>>>>  int vb2_fop_mmap(struct file *file, struct vm_area_struct *vma)
>>>>  {
>>>>  	struct video_device *vdev = video_devdata(file);
>>>> +	struct mutex *lock = vdev->queue->lock ? vdev->queue->lock :
>>>> vdev->lock;
>>>> +	int err;
>>>>
>>>> -	return vb2_mmap(vdev->queue, vma);
>>>> +	if (lock && mutex_lock_interruptible(lock))
>>>> +		return -ERESTARTSYS;
>>>> +	err = vb2_mmap(vdev->queue, vma);
>>>> +	if (lock)
>>>> +		mutex_unlock(lock);
>>>> +	return err;
>>>>  }
>>>>  EXPORT_SYMBOL_GPL(vb2_fop_mmap);
>>>>
>>>> @@ -2685,8 +2692,15 @@ unsigned long vb2_fop_get_unmapped_area(struct
>>>> file *file, unsigned long addr,>> 
>>>>  		unsigned long len, unsigned long pgoff, unsigned long flags)
>>>>  {
>>>>  	struct video_device *vdev = video_devdata(file);
>>>> +	struct mutex *lock = vdev->queue->lock ? vdev->queue->lock :
>>>> vdev->lock;
>>>> +	int ret;
>>>>
>>>> -	return vb2_get_unmapped_area(vdev->queue, addr, len, pgoff, flags);
>>>> +	if (lock && mutex_lock_interruptible(lock))
>>>> +		return -ERESTARTSYS;
>>>> +	ret = vb2_get_unmapped_area(vdev->queue, addr, len, pgoff, flags);
>>>> +	if (lock)
>>>> +		mutex_unlock(lock);
>>>> +	return ret;
>>>>
>>>>  }
>>>>  EXPORT_SYMBOL_GPL(vb2_fop_get_unmapped_area);
>>>>  #endif
> 


  reply	other threads:[~2014-07-02  6:33 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-05 17:53 [PATCH v6 00/10] Renesas VSP1 driver Laurent Pinchart
2013-08-05 17:53 ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 01/10] media: Add support for circular graph traversal Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 02/10] Documentation: media: Clarify the VIDIOC_CREATE_BUFS format requirements Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-06 10:36   ` Hans Verkuil
2013-08-06 10:36     ` Hans Verkuil
2013-08-05 17:53 ` [PATCH v6 03/10] media: vb2: Clarify queue_setup() and buf_prepare() usage documentation Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 04/10] media: vb2: Take queue or device lock in vb2_fop_mmap() Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-06 10:39   ` Hans Verkuil
2013-08-06 10:39     ` Hans Verkuil
2013-08-06 20:09     ` Laurent Pinchart
2013-08-06 20:09       ` Laurent Pinchart
2013-08-06 20:10     ` [PATCH v7] media: vb2: Take queue or device lock in mmap-related vb2 ioctl handlers Laurent Pinchart
2013-08-06 20:10       ` Laurent Pinchart
2013-08-07  6:30       ` Hans Verkuil
2013-08-07  6:30         ` Hans Verkuil
2014-05-23 13:54       ` Hans Verkuil
2014-05-23 13:54         ` Hans Verkuil
2014-05-26 22:38         ` Laurent Pinchart
2014-05-26 22:38           ` Laurent Pinchart
2014-06-25 16:58         ` Sasha Levin
2014-06-25 16:58           ` Sasha Levin
2014-07-01 21:08           ` Laurent Pinchart
2014-07-01 21:08             ` Laurent Pinchart
2014-07-02  6:33             ` Hans Verkuil [this message]
2014-07-02  6:33               ` Hans Verkuil
2014-07-02  7:56               ` Laurent Pinchart
2014-07-02  7:56                 ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 05/10] v4l: Fix V4L2_MBUS_FMT_YUV10_1X30 media bus pixel code value Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 06/10] v4l: Add media format codes for ARGB8888 and AYUV8888 on 32-bit busses Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 07/10] v4l: Add V4L2_PIX_FMT_NV16M and V4L2_PIX_FMT_NV61M formats Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 08/10] v4l: Renesas R-Car VSP1 driver Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 09/10] vsp1: Fix lack of the sink entity registration for enabled links Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart
2013-08-05 17:53 ` [PATCH v6 10/10] vsp1: Use the maximum number of entities defined in platform data Laurent Pinchart
2013-08-05 17:53   ` Laurent Pinchart

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53B3A7CB.8020901@xs4all.nl \
    --to=hverkuil@xs4all.nl \
    --cc=davej@redhat.com \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=matsu@igel.co.jp \
    --cc=sakari.ailus@iki.fi \
    --cc=sasha.levin@oracle.com \
    --cc=sylvester.nawrocki@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.