2.5.61/usb: poll does not time out

Andreas Jellinghaus (aj@dungeon.inka.de)
15 Feb 2003 20:55:01 +0100


Hi,

poll() should return as soon as there is some event.
unplugging a usb device will cause poll to set
revents to POLLERR|POLLHUP.

But the poll() syscall is not returned, instead
the kernel waits for the timeout to count down /
in the case poll with a negative value to wait
forever. This way an application will never
notice that the usb device has been removed.

here is a strace on a test app.
the kernel waits full 10 seconds (the timeout used),
even though the usb device was removed in the first
five seconds.

send(4, "<15>Feb 15 20:47:52 usbtoken[947"..., 52, 0) = 52
rt_sigaction(SIGPIPE, {SIG_DFL}, NULL, 8) = 0
poll([{fd=3, events=POLLIN|POLLPRI|POLLOUT|POLLERR,
revents=POLLERR|POLLHUP}], 1, 10000) = 1
time([1045338482]) = 1045338482
getpid() = 9477
writev(2, [{"usbtoken[9477]: device removed. "..., 41}],
1usbtoken[9477]: device removed. exiting.
) = 41
rt_sigaction(SIGPIPE, {0x400edf48, [], 0x4000000}, {SIG_DFL}, 8) = 0
send(4, "<15>Feb 15 20:48:02 usbtoken[947"..., 61, 0) = 61

was it meant to be that way?

if so: how can i work around this (in a nice way) ?

i could:
a) use short timeouts and a permanent loop (not nice)
b) use the hotplug script when it is called with "remove"
to find the app with which has the device still open
and kill the process / send some signal. also not nice.

Andreas

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/