All of lore.kernel.org
 help / color / mirror / Atom feed
* [GIT PULL for v3.5] Control events support for uvcvideo
@ 2012-04-29 17:59 Laurent Pinchart
  2012-04-30  6:30 ` Hans Verkuil
  2012-04-30  9:43 ` [GIT PULL for v3.5] (v2) " Laurent Pinchart
  0 siblings, 2 replies; 6+ messages in thread
From: Laurent Pinchart @ 2012-04-29 17:59 UTC (permalink / raw)
  To: linux-media; +Cc: Hans de Goede

Hi Mauro,

The following changes since commit bcb2cf6e0bf033d79821c89e5ccb328bfbd44907:

  [media] ngene: remove an unneeded condition (2012-04-26 15:29:23 -0300)

are available in the git repository at:
  git://linuxtv.org/pinchartl/uvcvideo.git uvcvideo-events

Hans de Goede (10):
      media/radio: use v4l2_ctrl_subscribe_event where possible
      v4l2-event: Add v4l2_subscribed_event_ops
      v4l2-ctrls: Use v4l2_subscribed_event_ops
      uvcvideo: Fix a "ignoring return value of ‘__clear_user’" warning
      uvcvideo: Refactor uvc_ctrl_get and query
      uvcvideo: Move __uvc_ctrl_get() up
      uvcvideo: Add support for control events
      uvcvideo: Properly report the inactive flag for inactive controls
      uvcvideo: Send control change events for slave ctrls when the master changes
      uvcvideo: Drop unused ctrl member from struct uvc_control_mapping

 Documentation/video4linux/v4l2-framework.txt |   28 ++-
 drivers/media/radio/radio-isa.c              |   10 +-
 drivers/media/radio/radio-keene.c            |   14 +-
 drivers/media/video/ivtv/ivtv-ioctl.c        |    3 +-
 drivers/media/video/omap3isp/ispccdc.c       |    2 +-
 drivers/media/video/omap3isp/ispstat.c       |    2 +-
 drivers/media/video/uvc/uvc_ctrl.c           |  320 +++++++++++++++++++++----
 drivers/media/video/uvc/uvc_v4l2.c           |   46 +++-
 drivers/media/video/uvc/uvcvideo.h           |   26 ++-
 drivers/media/video/v4l2-ctrls.c             |   58 ++++-
 drivers/media/video/v4l2-event.c             |   71 +++---
 drivers/usb/gadget/uvc_v4l2.c                |    2 +-
 include/media/v4l2-ctrls.h                   |    7 +-
 include/media/v4l2-event.h                   |   24 ++-
 14 files changed, 456 insertions(+), 157 deletions(-)

-- 
Regards,

Laurent Pinchart


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [GIT PULL for v3.5] Control events support for uvcvideo
  2012-04-29 17:59 [GIT PULL for v3.5] Control events support for uvcvideo Laurent Pinchart
@ 2012-04-30  6:30 ` Hans Verkuil
  2012-04-30  9:29   ` Laurent Pinchart
  2012-04-30  9:43 ` [GIT PULL for v3.5] (v2) " Laurent Pinchart
  1 sibling, 1 reply; 6+ messages in thread
From: Hans Verkuil @ 2012-04-30  6:30 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: linux-media, Hans de Goede

Hi Laurent,

I know I am very late with this, but I looked through the event/control core
changes and I found a locking bug there. I didn't have a chance to review the
patch series when HdG posted it earlier this month, so my apologies for coming
up with this only now.

The problem is in v4l2-ctrls.c:

diff --git a/drivers/media/video/v4l2-ctrls.c b/drivers/media/video/v4l2-ctrls.c
index 7023e6d..2a44355 100644
--- a/drivers/media/video/v4l2-ctrls.c
+++ b/drivers/media/video/v4l2-ctrls.c
@@ -2381,10 +2381,22 @@ int v4l2_ctrl_s_ctrl(struct v4l2_ctrl *ctrl, s32 val)
 }
 EXPORT_SYMBOL(v4l2_ctrl_s_ctrl);
 
-void v4l2_ctrl_add_event(struct v4l2_ctrl *ctrl,
-                               struct v4l2_subscribed_event *sev)
+static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev)
 {
-       v4l2_ctrl_lock(ctrl);

This lock...

+       struct v4l2_ctrl_handler *hdl = sev->fh->ctrl_handler;
+       struct v4l2_ctrl_ref *ref;
+       struct v4l2_ctrl *ctrl;
+       int ret = 0;
+
+       mutex_lock(&hdl->lock);

...and this lock are not necessarily the same. If the control was from a
subdevice then they will be different. This doesn't happen in uvc, but it
will in other drivers.

+
+       ref = find_ref(hdl, sev->id);

The right approach is to use v4l2_ctrl_find here and then call
v4l2_ctrl_lock(ctrl), just as was done in the original code.

+       if (!ref) {
+               ret = -EINVAL;
+               goto leave;
+       }
+       ctrl = ref->ctrl;
+
        list_add_tail(&sev->node, &ctrl->ev_subs);
        if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
            (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
@@ -2396,18 +2408,42 @@ void v4l2_ctrl_add_event(struct v4l2_ctrl *ctrl,
                fill_event(&ev, ctrl, changes);
                v4l2_event_queue_fh(sev->fh, &ev);
        }
-       v4l2_ctrl_unlock(ctrl);
+leave:
+       mutex_unlock(&hdl->lock);
+       return ret;
 }
-EXPORT_SYMBOL(v4l2_ctrl_add_event);
 
-void v4l2_ctrl_del_event(struct v4l2_ctrl *ctrl,
-                               struct v4l2_subscribed_event *sev)
+static void v4l2_ctrl_del_event(struct v4l2_subscribed_event *sev)
 {
-       v4l2_ctrl_lock(ctrl);
+       struct v4l2_ctrl_handler *hdl = sev->fh->ctrl_handler;
+
+       mutex_lock(&hdl->lock);

Same problem here.

        list_del(&sev->node);
-       v4l2_ctrl_unlock(ctrl);
+       mutex_unlock(&hdl->lock);
 }
-EXPORT_SYMBOL(v4l2_ctrl_del_event);

So the code should be:

static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev)
{
		struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);

		if (ctrl == NULL)
				return -EINVAL;
        v4l2_ctrl_lock(ctrl);
        list_add_tail(&sev->node, &ctrl->ev_subs);
        if (ctrl->type != V4L2_CTRL_TYPE_CTRL_CLASS &&
            (sev->flags & V4L2_EVENT_SUB_FL_SEND_INITIAL)) {
                struct v4l2_event ev;
                u32 changes = V4L2_EVENT_CTRL_CH_FLAGS;

                if (!(ctrl->flags & V4L2_CTRL_FLAG_WRITE_ONLY))
                        changes |= V4L2_EVENT_CTRL_CH_VALUE;
                fill_event(&ev, ctrl, changes);
                v4l2_event_queue_fh(sev->fh, &ev);
        }
        v4l2_ctrl_unlock(ctrl);
		return 0;
}

and:

static void v4l2_ctrl_del_event(struct v4l2_subscribed_event *sev)
{
		struct v4l2_ctrl *ctrl = v4l2_ctrl_find(sev->fh->ctrl_handler, sev->id);

        v4l2_ctrl_lock(ctrl);
        list_del(&sev->node);
        v4l2_ctrl_unlock(ctrl);
}

Regards,

	Hans

On Sunday, April 29, 2012 19:59:01 Laurent Pinchart wrote:
> Hi Mauro,
> 
> The following changes since commit bcb2cf6e0bf033d79821c89e5ccb328bfbd44907:
> 
>   [media] ngene: remove an unneeded condition (2012-04-26 15:29:23 -0300)
> 
> are available in the git repository at:
>   git://linuxtv.org/pinchartl/uvcvideo.git uvcvideo-events
> 
> Hans de Goede (10):
>       media/radio: use v4l2_ctrl_subscribe_event where possible
>       v4l2-event: Add v4l2_subscribed_event_ops
>       v4l2-ctrls: Use v4l2_subscribed_event_ops
>       uvcvideo: Fix a "ignoring return value of ‘__clear_user’" warning
>       uvcvideo: Refactor uvc_ctrl_get and query
>       uvcvideo: Move __uvc_ctrl_get() up
>       uvcvideo: Add support for control events
>       uvcvideo: Properly report the inactive flag for inactive controls
>       uvcvideo: Send control change events for slave ctrls when the master changes
>       uvcvideo: Drop unused ctrl member from struct uvc_control_mapping
> 
>  Documentation/video4linux/v4l2-framework.txt |   28 ++-
>  drivers/media/radio/radio-isa.c              |   10 +-
>  drivers/media/radio/radio-keene.c            |   14 +-
>  drivers/media/video/ivtv/ivtv-ioctl.c        |    3 +-
>  drivers/media/video/omap3isp/ispccdc.c       |    2 +-
>  drivers/media/video/omap3isp/ispstat.c       |    2 +-
>  drivers/media/video/uvc/uvc_ctrl.c           |  320 +++++++++++++++++++++----
>  drivers/media/video/uvc/uvc_v4l2.c           |   46 +++-
>  drivers/media/video/uvc/uvcvideo.h           |   26 ++-
>  drivers/media/video/v4l2-ctrls.c             |   58 ++++-
>  drivers/media/video/v4l2-event.c             |   71 +++---
>  drivers/usb/gadget/uvc_v4l2.c                |    2 +-
>  include/media/v4l2-ctrls.h                   |    7 +-
>  include/media/v4l2-event.h                   |   24 ++-
>  14 files changed, 456 insertions(+), 157 deletions(-)
> 
> 

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [GIT PULL for v3.5] Control events support for uvcvideo
  2012-04-30  6:30 ` Hans Verkuil
@ 2012-04-30  9:29   ` Laurent Pinchart
  0 siblings, 0 replies; 6+ messages in thread
From: Laurent Pinchart @ 2012-04-30  9:29 UTC (permalink / raw)
  To: Hans Verkuil; +Cc: linux-media, Hans de Goede

Hi Hans,

On Monday 30 April 2012 08:30:39 Hans Verkuil wrote:
> Hi Laurent,
> 
> I know I am very late with this, but I looked through the event/control core
> changes and I found a locking bug there. I didn't have a chance to review
> the patch series when HdG posted it earlier this month, so my apologies for
> coming up with this only now.

No worries. Thank you for catching the bug, I'll send a new pull request.

-- 
Regards,

Laurent Pinchart


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [GIT PULL for v3.5] (v2) Control events support for uvcvideo
  2012-04-29 17:59 [GIT PULL for v3.5] Control events support for uvcvideo Laurent Pinchart
  2012-04-30  6:30 ` Hans Verkuil
@ 2012-04-30  9:43 ` Laurent Pinchart
  2012-04-30  9:49   ` Hans Verkuil
  1 sibling, 1 reply; 6+ messages in thread
From: Laurent Pinchart @ 2012-04-30  9:43 UTC (permalink / raw)
  To: linux-media; +Cc: Hans de Goede

Hi Mauro,

A locking bug was present in the previous pull request. Please ignore it and
pull this one instead.

The following changes since commit bcb2cf6e0bf033d79821c89e5ccb328bfbd44907:

  [media] ngene: remove an unneeded condition (2012-04-26 15:29:23 -0300)

are available in the git repository at:
  git://linuxtv.org/pinchartl/uvcvideo.git uvcvideo-events

Hans de Goede (10):
      media/radio: use v4l2_ctrl_subscribe_event where possible
      v4l2-event: Add v4l2_subscribed_event_ops
      v4l2-ctrls: Use v4l2_subscribed_event_ops
      uvcvideo: Fix a "ignoring return value of ‘__clear_user’" warning
      uvcvideo: Refactor uvc_ctrl_get and query
      uvcvideo: Move __uvc_ctrl_get() up
      uvcvideo: Add support for control events
      uvcvideo: Properly report the inactive flag for inactive controls
      uvcvideo: Send control change events for slave ctrls when the master changes
      uvcvideo: Drop unused ctrl member from struct uvc_control_mapping

 Documentation/video4linux/v4l2-framework.txt |   28 ++-
 drivers/media/radio/radio-isa.c              |   10 +-
 drivers/media/radio/radio-keene.c            |   14 +-
 drivers/media/video/ivtv/ivtv-ioctl.c        |    3 +-
 drivers/media/video/omap3isp/ispccdc.c       |    2 +-
 drivers/media/video/omap3isp/ispstat.c       |    2 +-
 drivers/media/video/uvc/uvc_ctrl.c           |  320 ++++++++++++++++++++++----
 drivers/media/video/uvc/uvc_v4l2.c           |   46 +++-
 drivers/media/video/uvc/uvcvideo.h           |   26 ++-
 drivers/media/video/v4l2-ctrls.c             |   47 +++-
 drivers/media/video/v4l2-event.c             |   71 +++---
 drivers/usb/gadget/uvc_v4l2.c                |    2 +-
 include/media/v4l2-ctrls.h                   |    7 +-
 include/media/v4l2-event.h                   |   24 ++-
 14 files changed, 447 insertions(+), 155 deletions(-)

-- 
Regards,

Laurent Pinchart


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [GIT PULL for v3.5] (v2) Control events support for uvcvideo
  2012-04-30  9:43 ` [GIT PULL for v3.5] (v2) " Laurent Pinchart
@ 2012-04-30  9:49   ` Hans Verkuil
  2012-04-30 10:17     ` [GIT PULL for v3.5] (v3) " Laurent Pinchart
  0 siblings, 1 reply; 6+ messages in thread
From: Hans Verkuil @ 2012-04-30  9:49 UTC (permalink / raw)
  To: Laurent Pinchart; +Cc: linux-media, Hans de Goede

Hi Laurent!

On Monday 30 April 2012 11:43:10 Laurent Pinchart wrote:
> Hi Mauro,
> 
> A locking bug was present in the previous pull request. Please ignore it
> and pull this one instead.

I hate to say it, but while you did update v4l2_ctrl_add_event, you forgot to
update v4l2_ctrl_del_event as well. That one still has the same locking 
issue...

Time for a v3 :-)

Regards,

	Hans

> 
> The following changes since commit
> bcb2cf6e0bf033d79821c89e5ccb328bfbd44907:
> 
>   [media] ngene: remove an unneeded condition (2012-04-26 15:29:23 -0300)
> 
> are available in the git repository at:
>   git://linuxtv.org/pinchartl/uvcvideo.git uvcvideo-events
> 
> Hans de Goede (10):
>       media/radio: use v4l2_ctrl_subscribe_event where possible
>       v4l2-event: Add v4l2_subscribed_event_ops
>       v4l2-ctrls: Use v4l2_subscribed_event_ops
>       uvcvideo: Fix a "ignoring return value of ‘__clear_user’" warning
>       uvcvideo: Refactor uvc_ctrl_get and query
>       uvcvideo: Move __uvc_ctrl_get() up
>       uvcvideo: Add support for control events
>       uvcvideo: Properly report the inactive flag for inactive controls
>       uvcvideo: Send control change events for slave ctrls when the master
> changes uvcvideo: Drop unused ctrl member from struct uvc_control_mapping
> 
>  Documentation/video4linux/v4l2-framework.txt |   28 ++-
>  drivers/media/radio/radio-isa.c              |   10 +-
>  drivers/media/radio/radio-keene.c            |   14 +-
>  drivers/media/video/ivtv/ivtv-ioctl.c        |    3 +-
>  drivers/media/video/omap3isp/ispccdc.c       |    2 +-
>  drivers/media/video/omap3isp/ispstat.c       |    2 +-
>  drivers/media/video/uvc/uvc_ctrl.c           |  320
> ++++++++++++++++++++++---- drivers/media/video/uvc/uvc_v4l2.c           | 
>  46 +++-
>  drivers/media/video/uvc/uvcvideo.h           |   26 ++-
>  drivers/media/video/v4l2-ctrls.c             |   47 +++-
>  drivers/media/video/v4l2-event.c             |   71 +++---
>  drivers/usb/gadget/uvc_v4l2.c                |    2 +-
>  include/media/v4l2-ctrls.h                   |    7 +-
>  include/media/v4l2-event.h                   |   24 ++-
>  14 files changed, 447 insertions(+), 155 deletions(-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [GIT PULL for v3.5] (v3) Control events support for uvcvideo
  2012-04-30  9:49   ` Hans Verkuil
@ 2012-04-30 10:17     ` Laurent Pinchart
  0 siblings, 0 replies; 6+ messages in thread
From: Laurent Pinchart @ 2012-04-30 10:17 UTC (permalink / raw)
  To: Hans Verkuil; +Cc: linux-media, Hans de Goede

Hi Hans,

On Monday 30 April 2012 11:49:54 Hans Verkuil wrote:
> On Monday 30 April 2012 11:43:10 Laurent Pinchart wrote:
> > Hi Mauro,
> > 
> > A locking bug was present in the previous pull request. Please ignore it
> > and pull this one instead.
> 
> I hate to say it, but while you did update v4l2_ctrl_add_event, you forgot
> to update v4l2_ctrl_del_event as well. That one still has the same locking
> issue...

If it wasn't noon already I'd blame it on not having woken up completely :-)

> Time for a v3 :-)

Here it is.

Mauro, could you please pull the following ? Sorry for the noise.

The following changes since commit bcb2cf6e0bf033d79821c89e5ccb328bfbd44907:

  [media] ngene: remove an unneeded condition (2012-04-26 15:29:23 -0300)

are available in the git repository at:
  git://linuxtv.org/pinchartl/uvcvideo.git uvcvideo-events

Hans de Goede (10):
      media/radio: use v4l2_ctrl_subscribe_event where possible
      v4l2-event: Add v4l2_subscribed_event_ops
      v4l2-ctrls: Use v4l2_subscribed_event_ops
      uvcvideo: Fix a "ignoring return value of ‘__clear_user’" warning
      uvcvideo: Refactor uvc_ctrl_get and query
      uvcvideo: Move __uvc_ctrl_get() up
      uvcvideo: Add support for control events
      uvcvideo: Properly report the inactive flag for inactive controls
      uvcvideo: Send control change events for slave ctrls when the master changes
      uvcvideo: Drop unused ctrl member from struct uvc_control_mapping

 Documentation/video4linux/v4l2-framework.txt |   28 ++-
 drivers/media/radio/radio-isa.c              |   10 +-
 drivers/media/radio/radio-keene.c            |   14 +-
 drivers/media/video/ivtv/ivtv-ioctl.c        |    3 +-
 drivers/media/video/omap3isp/ispccdc.c       |    2 +-
 drivers/media/video/omap3isp/ispstat.c       |    2 +-
 drivers/media/video/uvc/uvc_ctrl.c           |  320 ++++++++++++++++++++++----
 drivers/media/video/uvc/uvc_v4l2.c           |   46 +++-
 drivers/media/video/uvc/uvcvideo.h           |   26 ++-
 drivers/media/video/v4l2-ctrls.c             |   41 +++-
 drivers/media/video/v4l2-event.c             |   71 +++---
 drivers/usb/gadget/uvc_v4l2.c                |    2 +-
 include/media/v4l2-ctrls.h                   |    7 +-
 include/media/v4l2-event.h                   |   24 ++-
 14 files changed, 443 insertions(+), 153 deletions(-)

-- 
Regards,

Laurent Pinchart


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-04-30 10:16 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-29 17:59 [GIT PULL for v3.5] Control events support for uvcvideo Laurent Pinchart
2012-04-30  6:30 ` Hans Verkuil
2012-04-30  9:29   ` Laurent Pinchart
2012-04-30  9:43 ` [GIT PULL for v3.5] (v2) " Laurent Pinchart
2012-04-30  9:49   ` Hans Verkuil
2012-04-30 10:17     ` [GIT PULL for v3.5] (v3) " Laurent Pinchart

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.