Re: tty update speed regression (was: 2.6.14-rc2-mm1)

From: Alexey Dobriyan
Date: Fri Sep 23 2005 - 14:33:06 EST


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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/