Re: [PATCH/RFC 0/2] Fix DQBUF behavior for recoverable streaming errors

2010-03-24 Thread Hans Verkuil
On Thursday 18 March 2010 16:37:18 Pawel Osciak wrote:
 Laurent Pinchart wrote:
 On Wednesday 17 March 2010 21:05:19 Hans Verkuil wrote:
  On Wednesday 17 March 2010 15:29:48 Pawel Osciak wrote:
   Hello,
  
   during the V4L2 brainstorm meeting in Norway we have concluded that
   streaming error handling in dqbuf is lacking a bit and might result in
   the application losing video buffers.
  
   V4L2 specification states that DQBUF should set errno to EIO in such
   cases:
  
  
   EIO
  
   VIDIOC_DQBUF failed due to an internal error. Can also indicate temporary
   problems like signal loss. Note the driver might dequeue an (empty)
   buffer despite returning an error, or even stop capturing.
  
   There is a problem with this though. v4l2-ioctl.c code does not copy back
   v4l2_buffer fields to userspace on a failed ioctl invocation, i.e. when
   __video_do_ioctl() does not return 0, it jumps over the copy_to_user()
   code:
  
   /* ... */
   err = __video_do_ioctl(file, cmd, parg);
   /* ... */
   if (err  0)
  
goto out;
  
   /* ... */
  
if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
  
err = -EFAULT;
  
   /* ... */
   out:
  
  
   This is fine in general, but in the case of DQBUF errors, the v4l2_buffer
   fields are not copied back. Because of that, the application does not
   have any means of discovering on which buffer the operation failed. So
   it cannot reuse that buffer, even despite the fact that the spec allows
   such behavior.
  
  
   This RFC proposes a modification to the DQBUF behavior in cases of
   internal (recoverable) errors to allow recovery from such situations.
  
   We propose a new flag for the v4l2_buffer flags field,
   V4L2_BUF_FLAG_ERROR. There already exists a V4L2_BUF_FLAG_DONE flag,
   so to support older applications, the new flag should always be set
   together with it.
  
   Applications unaware of the new flag would simply display a corrupted
   frame, but we believe it is still a better solution than failing
   altogether. Old EIO behavior remains so the change is backwards
   compatible.
  
   I will post relevant V4L2 documentation updates after (if) this change is
   accepted.
  
  
   This series is rebased onto my recent videobuf clean-up and poll behavior
   patches.
  
   The series contains:
   [PATCH 1/2] v4l: Add a new ERROR flag for DQBUF after recoverable
   streaming errors [PATCH 2/2] v4l: videobuf: Add support for
   V4L2_BUF_FLAG_ERROR
 
  Reviewed-by: Hans Verkuil hverk...@xs4all.nl
 
  I think this is a very sensible change. After all, DQBUF succeeds, even
  though the buffer itself contains errors. But that is not the fault of
  DQBUF. It is enough to flag that the buffer does have an error. Without
  this you actually loose the buffer completely from the point of view of
  the application. And that's really nasty.
 
 Especially with the current wording of the spec:
 
 Note the driver might dequeue an (empty) buffer despite returning an error,
 or even stop capturing.
 
 That's pretty bad. Because of video_ioctl2 the application won't know which
 buffer has been dequeued, if any, and will thus have no way to requeue it.
 
 Pavel, could you update the Docbook documentation as well in your patch set ?
 The behaviour of DQBUF needs to be properly documented.
 
 
 Sure. Although I just noticed something. The spec for V4L2_BUF_FLAG_DONE says:
 
 When this flag is set, the buffer is currently on the outgoing queue,
 ready to be dequeued from the driver. Drivers set or clear this flag when
 the VIDIOC_QUERYBUF ioctl is called. After calling the VIDIOC_QBUF or
 VIDIOC_DQBUF it is always cleared. Of course a buffer cannot be on both queues
 at the same time, the V4L2_BUF_FLAG_QUEUED and V4L2_BUF_FLAG_DONE flag are
 mutually exclusive. They can be both cleared however, then the buffer is in
 dequeued state, in the application domain to say so.
 
 
 So according to the spec, DONE means done but not yet returned to userspace.
 So it should be cleared during dequeueing. But videobuf actually sets that
 flag in dqbuf. And frankly, it seems more sensible to me.
 
 Could you confirm that this is how we want it and I should follow the specs?
 If so, I will fix videobuf to stop setting that flag.

I think the spec makes sense, actually. But doesn't videobuf clear this already?

On ERROR and DONE videobuf_dqbuf will change the state to IDLE. videobuf_status
then won't set the DONE flag.

So as far as I can tell there is nothing that needs to change here.

Regards,

  Hans

 
 
 Best regards
 --
 Pawel Osciak
 Linux Platform Group
 Samsung Poland RD Center
 
 
 
 
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-media in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 
 

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a 

Re: [PATCH/RFC 0/2] Fix DQBUF behavior for recoverable streaming errors

2010-03-18 Thread Laurent Pinchart
Hi Hans, Pavel,

On Wednesday 17 March 2010 21:05:19 Hans Verkuil wrote:
 On Wednesday 17 March 2010 15:29:48 Pawel Osciak wrote:
  Hello,
  
  during the V4L2 brainstorm meeting in Norway we have concluded that
  streaming error handling in dqbuf is lacking a bit and might result in
  the application losing video buffers.
  
  V4L2 specification states that DQBUF should set errno to EIO in such
  cases:
  
  
  EIO
  
  VIDIOC_DQBUF failed due to an internal error. Can also indicate temporary
  problems like signal loss. Note the driver might dequeue an (empty)
  buffer despite returning an error, or even stop capturing.
  
  There is a problem with this though. v4l2-ioctl.c code does not copy back
  v4l2_buffer fields to userspace on a failed ioctl invocation, i.e. when
  __video_do_ioctl() does not return 0, it jumps over the copy_to_user()
  code:
  
  /* ... */
  err = __video_do_ioctl(file, cmd, parg);
  /* ... */
  if (err  0)
  
  goto out;
  
  /* ... */
  
  if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
  
  err = -EFAULT;
  
  /* ... */
  out:
  
  
  This is fine in general, but in the case of DQBUF errors, the v4l2_buffer
  fields are not copied back. Because of that, the application does not
  have any means of discovering on which buffer the operation failed. So
  it cannot reuse that buffer, even despite the fact that the spec allows
  such behavior.
  
  
  This RFC proposes a modification to the DQBUF behavior in cases of
  internal (recoverable) errors to allow recovery from such situations.
  
  We propose a new flag for the v4l2_buffer flags field,
  V4L2_BUF_FLAG_ERROR. There already exists a V4L2_BUF_FLAG_DONE flag,
  so to support older applications, the new flag should always be set
  together with it.
  
  Applications unaware of the new flag would simply display a corrupted
  frame, but we believe it is still a better solution than failing
  altogether. Old EIO behavior remains so the change is backwards
  compatible.
  
  I will post relevant V4L2 documentation updates after (if) this change is
  accepted.
  
  
  This series is rebased onto my recent videobuf clean-up and poll behavior
  patches.
  
  The series contains:
  [PATCH 1/2] v4l: Add a new ERROR flag for DQBUF after recoverable
  streaming errors [PATCH 2/2] v4l: videobuf: Add support for
  V4L2_BUF_FLAG_ERROR
 
 Reviewed-by: Hans Verkuil hverk...@xs4all.nl
 
 I think this is a very sensible change. After all, DQBUF succeeds, even
 though the buffer itself contains errors. But that is not the fault of
 DQBUF. It is enough to flag that the buffer does have an error. Without
 this you actually loose the buffer completely from the point of view of
 the application. And that's really nasty.

Especially with the current wording of the spec:

Note the driver might dequeue an (empty) buffer despite returning an error, 
or even stop capturing.

That's pretty bad. Because of video_ioctl2 the application won't know which 
buffer has been dequeued, if any, and will thus have no way to requeue it.

Pavel, could you update the Docbook documentation as well in your patch set ? 
The behaviour of DQBUF needs to be properly documented.

-- 
Regards,

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


RE: [PATCH/RFC 0/2] Fix DQBUF behavior for recoverable streaming errors

2010-03-18 Thread Pawel Osciak
Laurent Pinchart wrote:
On Wednesday 17 March 2010 21:05:19 Hans Verkuil wrote:
 On Wednesday 17 March 2010 15:29:48 Pawel Osciak wrote:
  Hello,
 
  during the V4L2 brainstorm meeting in Norway we have concluded that
  streaming error handling in dqbuf is lacking a bit and might result in
  the application losing video buffers.
 
  V4L2 specification states that DQBUF should set errno to EIO in such
  cases:
 
 
  EIO
 
  VIDIOC_DQBUF failed due to an internal error. Can also indicate temporary
  problems like signal loss. Note the driver might dequeue an (empty)
  buffer despite returning an error, or even stop capturing.
 
  There is a problem with this though. v4l2-ioctl.c code does not copy back
  v4l2_buffer fields to userspace on a failed ioctl invocation, i.e. when
  __video_do_ioctl() does not return 0, it jumps over the copy_to_user()
  code:
 
  /* ... */
  err = __video_do_ioctl(file, cmd, parg);
  /* ... */
  if (err  0)
 
 goto out;
 
  /* ... */
 
 if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
 
 err = -EFAULT;
 
  /* ... */
  out:
 
 
  This is fine in general, but in the case of DQBUF errors, the v4l2_buffer
  fields are not copied back. Because of that, the application does not
  have any means of discovering on which buffer the operation failed. So
  it cannot reuse that buffer, even despite the fact that the spec allows
  such behavior.
 
 
  This RFC proposes a modification to the DQBUF behavior in cases of
  internal (recoverable) errors to allow recovery from such situations.
 
  We propose a new flag for the v4l2_buffer flags field,
  V4L2_BUF_FLAG_ERROR. There already exists a V4L2_BUF_FLAG_DONE flag,
  so to support older applications, the new flag should always be set
  together with it.
 
  Applications unaware of the new flag would simply display a corrupted
  frame, but we believe it is still a better solution than failing
  altogether. Old EIO behavior remains so the change is backwards
  compatible.
 
  I will post relevant V4L2 documentation updates after (if) this change is
  accepted.
 
 
  This series is rebased onto my recent videobuf clean-up and poll behavior
  patches.
 
  The series contains:
  [PATCH 1/2] v4l: Add a new ERROR flag for DQBUF after recoverable
  streaming errors [PATCH 2/2] v4l: videobuf: Add support for
  V4L2_BUF_FLAG_ERROR

 Reviewed-by: Hans Verkuil hverk...@xs4all.nl

 I think this is a very sensible change. After all, DQBUF succeeds, even
 though the buffer itself contains errors. But that is not the fault of
 DQBUF. It is enough to flag that the buffer does have an error. Without
 this you actually loose the buffer completely from the point of view of
 the application. And that's really nasty.

Especially with the current wording of the spec:

Note the driver might dequeue an (empty) buffer despite returning an error,
or even stop capturing.

That's pretty bad. Because of video_ioctl2 the application won't know which
buffer has been dequeued, if any, and will thus have no way to requeue it.

Pavel, could you update the Docbook documentation as well in your patch set ?
The behaviour of DQBUF needs to be properly documented.


Sure. Although I just noticed something. The spec for V4L2_BUF_FLAG_DONE says:

When this flag is set, the buffer is currently on the outgoing queue,
ready to be dequeued from the driver. Drivers set or clear this flag when
the VIDIOC_QUERYBUF ioctl is called. After calling the VIDIOC_QBUF or
VIDIOC_DQBUF it is always cleared. Of course a buffer cannot be on both queues
at the same time, the V4L2_BUF_FLAG_QUEUED and V4L2_BUF_FLAG_DONE flag are
mutually exclusive. They can be both cleared however, then the buffer is in
dequeued state, in the application domain to say so.


So according to the spec, DONE means done but not yet returned to userspace.
So it should be cleared during dequeueing. But videobuf actually sets that
flag in dqbuf. And frankly, it seems more sensible to me.

Could you confirm that this is how we want it and I should follow the specs?
If so, I will fix videobuf to stop setting that flag.


Best regards
--
Pawel Osciak
Linux Platform Group
Samsung Poland RD Center





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


[PATCH/RFC 0/2] Fix DQBUF behavior for recoverable streaming errors

2010-03-17 Thread Pawel Osciak
Hello,

during the V4L2 brainstorm meeting in Norway we have concluded that streaming
error handling in dqbuf is lacking a bit and might result in the application
losing video buffers.

V4L2 specification states that DQBUF should set errno to EIO in such cases:


EIO

VIDIOC_DQBUF failed due to an internal error. Can also indicate temporary
problems like signal loss. Note the driver might dequeue an (empty) buffer
despite returning an error, or even stop capturing.

There is a problem with this though. v4l2-ioctl.c code does not copy back
v4l2_buffer fields to userspace on a failed ioctl invocation, i.e. when
__video_do_ioctl() does not return 0, it jumps over the copy_to_user()
code:

/* ... */
err = __video_do_ioctl(file, cmd, parg);
/* ... */
if (err  0)
goto out;
/* ... */
if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
err = -EFAULT;
/* ... */
out:


This is fine in general, but in the case of DQBUF errors, the v4l2_buffer
fields are not copied back. Because of that, the application does not have any
means of discovering on which buffer the operation failed. So it cannot reuse
that buffer, even despite the fact that the spec allows such behavior.


This RFC proposes a modification to the DQBUF behavior in cases of internal
(recoverable) errors to allow recovery from such situations.

We propose a new flag for the v4l2_buffer flags field, V4L2_BUF_FLAG_ERROR.
There already exists a V4L2_BUF_FLAG_DONE flag, so to support older
applications, the new flag should always be set together with it.

Applications unaware of the new flag would simply display a corrupted frame, but
we believe it is still a better solution than failing altogether. Old EIO
behavior remains so the change is backwards compatible.

I will post relevant V4L2 documentation updates after (if) this change is 
accepted.


This series is rebased onto my recent videobuf clean-up and poll behavior
patches.

The series contains:
[PATCH 1/2] v4l: Add a new ERROR flag for DQBUF after recoverable streaming 
errors
[PATCH 2/2] v4l: videobuf: Add support for V4L2_BUF_FLAG_ERROR

Best regards
--
Pawel Osciak
Linux Platform Group
Samsung Poland RD Center
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 0/2] Fix DQBUF behavior for recoverable streaming errors

2010-03-17 Thread Hans Verkuil
On Wednesday 17 March 2010 15:29:48 Pawel Osciak wrote:
 Hello,
 
 during the V4L2 brainstorm meeting in Norway we have concluded that streaming
 error handling in dqbuf is lacking a bit and might result in the application
 losing video buffers.
 
 V4L2 specification states that DQBUF should set errno to EIO in such cases:
 
 
 EIO
 
 VIDIOC_DQBUF failed due to an internal error. Can also indicate temporary
 problems like signal loss. Note the driver might dequeue an (empty) buffer
 despite returning an error, or even stop capturing.
 
 There is a problem with this though. v4l2-ioctl.c code does not copy back
 v4l2_buffer fields to userspace on a failed ioctl invocation, i.e. when
 __video_do_ioctl() does not return 0, it jumps over the copy_to_user()
 code:
 
 /* ... */
 err = __video_do_ioctl(file, cmd, parg);
 /* ... */
 if (err  0)
   goto out;
 /* ... */
   if (copy_to_user((void __user *)arg, parg, _IOC_SIZE(cmd)))
   err = -EFAULT;
 /* ... */
 out:
 
 
 This is fine in general, but in the case of DQBUF errors, the v4l2_buffer
 fields are not copied back. Because of that, the application does not have any
 means of discovering on which buffer the operation failed. So it cannot reuse
 that buffer, even despite the fact that the spec allows such behavior.
 
 
 This RFC proposes a modification to the DQBUF behavior in cases of internal
 (recoverable) errors to allow recovery from such situations.
 
 We propose a new flag for the v4l2_buffer flags field, 
 V4L2_BUF_FLAG_ERROR.
 There already exists a V4L2_BUF_FLAG_DONE flag, so to support older
 applications, the new flag should always be set together with it.
 
 Applications unaware of the new flag would simply display a corrupted frame, 
 but
 we believe it is still a better solution than failing altogether. Old EIO
 behavior remains so the change is backwards compatible.
 
 I will post relevant V4L2 documentation updates after (if) this change is 
 accepted.
 
 
 This series is rebased onto my recent videobuf clean-up and poll behavior
 patches.
 
 The series contains:
 [PATCH 1/2] v4l: Add a new ERROR flag for DQBUF after recoverable streaming 
 errors
 [PATCH 2/2] v4l: videobuf: Add support for V4L2_BUF_FLAG_ERROR

Reviewed-by: Hans Verkuil hverk...@xs4all.nl

I think this is a very sensible change. After all, DQBUF succeeds, even though 
the
buffer itself contains errors. But that is not the fault of DQBUF. It is enough 
to
flag that the buffer does have an error. Without this you actually loose the
buffer completely from the point of view of the application. And that's really
nasty.

Regards,

Hans

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html