Messages in this thread | | | Date | Fri, 23 Sep 2005 23:42:53 +0400 | From | Alexey Dobriyan <> | Subject | Re: tty update speed regression (was: 2.6.14-rc2-mm1) |
| |
On Fri, Sep 23, 2005 at 12:07:49PM -0700, Nishanth Aravamudan wrote: > On 23.09.2005 [22:42:16 +0400], Alexey Dobriyan wrote: > > poll([{fd=0, events=POLLIN}], 1, 0) = 0
> > I can send full strace log if needed. > > Nope, that helped tremendously! I think I know what the issue is (and > why it's HZ dependent). > > In the current code, (2.6.13.2, e.g) we allow 0 timeout poll-requests to > be resolved as 0 jiffy requests. But in my patch, those requests become > 1 jiffy (which of course depends on HZ and gets quite long if HZ=100)! > > Care to try the following patch?
It works! Now, even with HZ=100, gameplay is smooth.
Andrew, please, apply.
> Description: Modifying sys_poll() to handle large timeouts correctly > resulted in 0 being treated just like any other millisecond request, > while the current code treats it as an optimized case. Do the same in > the new code. Most of the code change is tabbing due to the inserted if.
> diff -urpN 2.6.14-rc2-mm1/fs/select.c 2.6.14-rc2-mm1-dev/fs/select.c > --- 2.6.14-rc2-mm1/fs/select.c 2005-09-23 11:52:36.000000000 -0700 > +++ 2.6.14-rc2-mm1-dev/fs/select.c 2005-09-23 12:04:03.000000000 -0700 > @@ -485,26 +485,35 @@ asmlinkage long sys_poll(struct pollfd _ > if (nfds > max_fdset && nfds > OPEN_MAX) > return -EINVAL; > > - /* > - * We compare HZ with 1000 to work out which side of the > - * expression needs conversion. Because we want to avoid > - * converting any value to a numerically higher value, which > - * could overflow. > - */ > + if (timeout_msecs) { > + /* > + * We compare HZ with 1000 to work out which side of the > + * expression needs conversion. Because we want to > + * avoid converting any value to a numerically higher > + * value, which could overflow. > + */ > #if HZ > 1000 > - overflow = timeout_msecs >= jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT); > + overflow = timeout_msecs >= > + jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT); > #else > - overflow = msecs_to_jiffies(timeout_msecs) >= MAX_SCHEDULE_TIMEOUT; > + overflow = msecs_to_jiffies(timeout_msecs) >= > + MAX_SCHEDULE_TIMEOUT; > #endif > > - /* > - * If we would overflow in the conversion or a negative timeout > - * is requested, sleep indefinitely. > - */ > - if (overflow || timeout_msecs < 0) > - timeout_jiffies = MAX_SCHEDULE_TIMEOUT; > - else > - timeout_jiffies = msecs_to_jiffies(timeout_msecs) + 1; > + /* > + * If we would overflow in the conversion or a negative > + * timeout is requested, sleep indefinitely. > + */ > + if (overflow || timeout_msecs < 0) > + timeout_jiffies = MAX_SCHEDULE_TIMEOUT; > + else > + timeout_jiffies = msecs_to_jiffies(timeout_msecs) + 1; > + } else { > + /* > + * 0 millisecond requests become 0 jiffy requests > + */ > + timeout_jiffies = 0; > + } > > poll_initwait(&table); >
- 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/
| |