>>>>> On Fri, 26 Jul 2002 13:49:27 -0700 (PDT), Davide Libenzi said: Davide> IMHO the patch makes sense, it reduces memory loads and it Davide> "helps" the compiler to correctly allocate registers. I just realized that a gcc3 feature snuck into the source-code by accident. Below is a fixed patch which should work with gcc2 as well. --david --- linux-2.4.18-sysepoll/fs/select.c Mon Sep 24 15:08:21 2001 +++ lia64-2.4-sysepoll/fs/select.c Fri Jul 26 18:26:38 2002 @@ -164,8 +164,8 @@ int do_select(int n, fd_set_bits *fds, long *timeout) { struct poll_wqueues table; poll_table *wait; - int retval, i, off; + long retval, i, off; long __timeout = *timeout; read_lock(¤t->files->file_lock); @@ -181,6 +181,7 @@ wait = NULL; retval = 0; for (;;) { +#if 0 set_current_state(TASK_INTERRUPTIBLE); for (i = 0 ; i < n; i++) { unsigned long bit = BIT(i); @@ -214,6 +215,57 @@ wait = NULL; } } +#else + unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp; + + set_current_state(TASK_INTERRUPTIBLE); + + inp = fds->in; outp = fds->out; exp = fds->ex; + rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex; + + for (i = 0; i < n; ++rinp, ++routp, ++rexp) { + unsigned long in, out, ex, all_bits, bit = 1, mask, j; + unsigned long res_in = 0, res_out = 0, res_ex = 0; + struct file_operations *f_op; + struct file *file = NULL; + + in = *inp++; out = *outp++; ex = *exp++; + all_bits = in | out | ex; + if (all_bits == 0) + continue; + + for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) { + if (i >= n) + break; + if (!(bit & all_bits)) + continue; + file = fget(i); + if (file) + f_op = file->f_op; + mask = DEFAULT_POLLMASK; + if (file) { + if (f_op && f_op->poll) + mask = (*f_op->poll)(file, retval ? NULL : wait); + fput(file); + if ((mask & POLLIN_SET) && (in & bit)) { + res_in |= bit; + retval++; + } + if ((mask & POLLOUT_SET) && (out & bit)) { + res_out |= bit; + retval++; + } + if ((mask & POLLEX_SET) && (ex & bit)) { + res_ex |= bit; + retval++; + } + } + } + if (res_in) *rinp = res_in; + if (res_out) *routp = res_out; + if (res_ex) *rexp = res_ex; + } +#endif wait = NULL; if (retval || !__timeout || signal_pending(current)) break; - 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/