Messages in this thread Patch in this message | | | Date | Sun, 13 Feb 2000 13:04:15 +0100 | From | Andi Kleen <> | Subject | [PATCH] Fix poll bug |
| |
Hi Alan,
I just found a poll() bug. poll currently returns -EINTR when a signal occurs, which causes the system call to be restarted. Unfortunately the timeout is not decreased, so when you have a periodic SA_RESTART timer with just the right period and no other event occurs poll hangs forever.
select does it correctly, it always returns EINTR and is never restarted.
I found it because syslogd's 30s "mark" timer can trigger it in the dns resolver when syslogd does forwarding.
This patch fixes the problem. I also fixed an outdated comment.
Please add for 2.2.15. Thanks.
-Andi
--- linux/fs/select.c-o Thu Aug 26 02:29:49 1999 +++ linux/fs/select.c Sun Feb 13 12:52:00 2000 @@ -230,12 +230,8 @@ } /* - * We can actually return ERESTARTSYS instead of EINTR, but I'd - * like to be certain this leads to no problems. So I return - * EINTR just for safety. - * - * Update: ERESTARTSYS breaks at least the xview clock binary, so - * I'm trying ERESTARTNOHAND which restart only when you want to. + * On interrupts return ERESTARTNOHAND, because automatic restart + * is not handled properly (the timeout is not decreased). */ #define MAX_SELECT_SECONDS \ ((unsigned long) (MAX_SCHEDULE_TIMEOUT / HZ)-1) @@ -434,7 +430,7 @@ err = fdcount; if (!fdcount && signal_pending(current)) - err = -EINTR; + err = -ERESTARTNOHAND; out_fds: kfree(fds);
-- This is like TV. I don't like TV.
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |