lkml.org 
[lkml]   [2010]   [Nov]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: What should poll() return when a device is unregistered ? (was "media: Media device node support")
From
Date
On Mon, 2010-11-22 at 17:19 +0100, Laurent Pinchart wrote:
> Hi Andy,
>
> On Monday 22 November 2010 13:51:37 Andy Walls wrote:
> > On Mon, 2010-11-22 at 12:36 +0100, Hans Verkuil wrote:
> > > On Monday, November 22, 2010 11:41:27 Laurent Pinchart wrote:
> > > > Hi Hans,
> > > >
> > > > On Monday 22 November 2010 10:08:06 Hans Verkuil wrote:
> > > > > On Monday, November 22, 2010 00:35:54 Laurent Pinchart wrote:
> > > > > > Hi Jonathan,
> > > > >
> > > > > This doesn't really seem to be standardized :-(
> > > >
> > > > CC'ing LKML with the question.
> > > >
> > > > POLLERR | POLLHUP and POLLERR won't make a difference to select(), but
> > > > we should still standardize on a poll() return code when devices are
> > > > unregistered and/or - for hot-pluggable devices - disconnected (for
> > > > V4L devices unregistered usually means disconnected) ?
> > >
> > > Drivers return POLLERR, POLLERR|POLLHUP or POLLHUP in case of a
> > > disconnect. I'm leaning towards POLLHUP as the most appropriate poll
> > > return value for a USB disconnect.
> >
> > +1 POLLHUP
> >
> > http://www.opengroup.org/onlinepubs/009695399/functions/poll.html
> >
> > "POLLHUP
> > The device has been disconnected. [...]"
> >
> >
> > My $0.02 below:
> > The communication link with the device is closed due to circumstances
> > that the OS considers normal operation. The OS has, at some level, shut
> > down its side of the communication link gracefully as well.
> >
> > Just because the application or the OS cannot always predict when a USB
> > disconnect may happen, doesn't mean it is an error.
>
> POLLHUP seems to be the best option standard-wise, but it could be a problem
> for output devices. Applications use the write file descriptors set with
> select() to wait for a buffer to be ready. Unlike POLLERR, POLLHUP only
> reports an event on the read file descriptors set.

After looking at the OpenGroup IEEE Std 1003.1-2004 spec for both
select() and poll(), I can say that select() not indicating an fd (with
POLLHUP status set) is ready for writing is

a. in compliance with the standard

b. likely inspired by the behavior specified for poll() in the standard

c. is overly restrictive given the language in the standard for
select(). select() could return that the fd is writeable, and be in
standards compliance, so long as the next call to an output function on
the fd does not block:

"A descriptor shall be considered ready for writing when a call
to an output function with O_NONBLOCK clear would not block,
whether or not the function would transfer data successfully."

d. select() could also indicate an exceptional condition on an fd (with
POLLHUP status set) and still be in standards compliance:

"[except for sockets], what constitutes an exceptional condition
is file type-specific."


Despite that research, I'm guessing that the likelihood of consensus for
changing the kernel select()'s behavior for POLLHUP is low.


So I guess one should do something that satisfies both poll() and
select() to induce applications to take the correct action.

POLLHUP|POLLERR, as you had suggested, will probably have the desired
effect:

1. applications that use poll() will be slightly misinformed with the
indication of an error. However, I'll *speculate* that applications
that have different courses of action for POLLHUP vs. POLLERR, will
prioritize POLLHUP handling over POLLERR handling anyway.

2. applications that use select(), with the fd only in the write_fds
set, will wake up upon the exception condition of a device disconnect
without the fd being in the except_fds set (since that would be useless
anyway in Linux in this case).

For standards compliance -- in at least the case of select() -- the next
call to read(), write(), ioctl( , VIDIOC_DQBUF, ), and ( ,
VIDIOC_QBUF, ) should return EOF or an error with errno set properly.
(If I understand the standard correctly.)

The only trouble will come from applications that use select() and don't
check the return value from the next read(), write(), or ioctl(). I
would hope that such applications are not in widespread use.

Regards,
Andy



\
 
 \ /
  Last update: 2010-11-23 00:03    [W:0.055 / U:0.080 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site