svn commit: r311952 - head/sys/ddb
Julian Elischer
julian at freebsd.org
Mon Jan 16 05:30:11 UTC 2017
On 16/01/2017 11:53 AM, Bruce Evans wrote:
> On Sun, 15 Jan 2017, Adrian Chadd wrote:
>
>> hah, i took this, then life got in the way. :)
>>
>> Bruce - what do you think of
>> https://bz-attachments.freebsd.org/attachment.cgi?id=138881 ?
>
> Also https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=184987 .
>
> I think it is hard to read and review since it is not in the mail.
> After fetching it and quoting it:
review it in the review page and just send a link in the email..
that's what it's for.
>
> X diff -r 91820d9948e0 -r 13f40d577646 sys/kern/tty_ttydisc.c
> X --- a/sys/kern/tty_ttydisc.c Fri Feb 22 09:45:32 2013 +0100
> X +++ b/sys/kern/tty_ttydisc.c Tue Dec 17 23:03:17 2013 +0100
> X @@ -448,6 +448,9 @@
> X if (tp->t_flags & TF_ZOMBIE)
> X return (EIO);
> X X + if (tp->t_termios.c_lflag & FLUSHO)
> X + return (0);
> X +
>
> This seems to be far too simple. As pointed out in the PR thread, it
> is missing at least the clearing of uio_resid.
>
> (BTW, returns for TF_ZOMBIE and IO_NDELAY tend to have the opposite
> problem. The tend to reduce uio_resid to count i/o that they have
> not done. They should just return an error like the above return
> for TF_ZOMBIE does. Upper layers are supposed to translate this
> error to success if any i/o has been done. Upper layers often get
> this wrong, and my fixes currently do too much compensation in lower
> layers.)
>
> The old tty driver has squillions of FLUSHO checks for output not
> involving
> uio. Mostly for echo of input. However, any input (and other
> operations?)
> normally turns of FLUSHO, so this is hard to see.
>
> To see if this works compatibly now, try typing 111^O2. ^O should be
> echoed as ^O^R followed by reprinting the line according to the
> implicit
> VREPRINT (^R). This should cancel FLUSHO, so the 2 is just echoed on
> the new line. However ^O instead of 2 should just cancel FLUSHO. So
> ^O^O should be equivalent to ^R except it prints ^O before ^R.
>
> It is wrong for FLUSHO to have any effect except in modes where
> VDISCARD
> has an effect. VDISCARD seems to be conditional on precisely
> !EXTPROC && IEXTEN. Its inactivity in other modes should be
> implemented
> by forcing it off on certain mode changes. The old tty driver
> forces it
> off in squillions of places, perhaps including all mode changes for
> simplicity. There would be a problem if stty(1) could actually set it,
> since then invalid settings like "raw flusho" would be allowed.
> Clearing
> it after all mode changes would prevent stty actually setting it.
>
>
> X /*
> X * We don't need to check whether the process is the foreground
> X * process group or if we have a carrier. This is already done
> X @@ -881,6 +884,14 @@
> X X /* Special control characters that are implementation
> dependent. */
> X if (CMP_FLAG(l, IEXTEN)) {
> X + /* Discard (^O) */
>
> Style bug. This comment is missing a "." and does less than echo
> the code.
> The code doesn't hard-code VDISCARD as ^O, and it is unclear whether
> the
> comment applies to the previous or the next line (except it is further
> from echoing the previous line).
>
> X + if (CMP_CC(VDISCARD, c)) {
> X + if (!(tp->t_termios.c_lflag & FLUSHO))
>
> Style bug. This file elsewhere always uses the funky style of explicit
> comparison of (sets of ) flags with 0.
>
> X + ttyoutq_write_nofrag(&tp->t_outq, "^O", 2);
>
> This also hard-codes ^O. The old driver echos the actual discard
> character
> using ttyecho(c, tp). I don't know if the funky rules for quoting
> control
> characters apply in this case, but ttyecho() has to be quite
> complicated to
> handle general cases.
>
> X + tp->t_termios.c_lflag ^= FLUSHO;
>
> The old driver adds an implicit VREPRINT char here if the input
> queue is
> nonempty. This usually results in echoing ^O^R and reprinting the
> line.
>
> X + return(0);
> X + }
> X +
>
> Otherwise, the action here is identical with the old driver.
>
> X /* Accept the next character as literal. */
> X if (CMP_CC(VLNEXT, c)) {
> X if (CMP_FLAG(l, ECHO)) {
>
> The old driver needs 23 lines mentioning FLUSHO to keep it mostly
> clear.
> These are:
> - 3 in compat code (still there)
> - 3 here
> - 1 clear whenever restarting output at the end of interrupt input
> (most
> cases interrupt input)
> - 4 checks in ttyoutput() which is used manly for echoing. 1 at the
> beginning would be simpler, but the checks are more or less before
> each putc() and there are many inconsistences for counting characters
> and the column position from the complications
> - 1 clear in ttioctl() in 1 case of turning 1 type of flow control
> back on.
> Buggy, since FLUSHO should not be affected by flow control except
> by the
> xon char being treated as an ordinary char for canceling VDISCARD.
> - 1 clear in ttioctl() for the same flow control done by TIOCSTART
> - 1 check for ordinary writes as in this patch
> - 2 in comments
> - 2 more checks in the loop for ordinary writes. Some checks are
> necessary,
> but these are misplaced. FLUSHO can change underneath when we
> unlock to
> do the i/o, so it must be re-checked when we wake up. It is not
> checked
> in quite the right places in the old code, but at least the main
> check
> is placed at the top of the loop so it mostly works. In the
> patch, the
> check is outside of the loop, so it is never checked after waking up.
> - 1 clear at the start of ttyrub()
> - 1 set and 1 clear in ttyrub() for TAB processing
> - 1 clear in ttyecho() related to the TAB processing
> - 1 other case.
>
> So the main missing details are:
> - clear FLUSHO for almost any input
> - check FLUSHO in echo processing? (should the new input clear the flag
> before the echo?)
> - missing uio handling for writing
> - missing race handling for writing
> - clear FLUSHO for most ioctls more than the old code did. Clear it at
> least when changing the mode to one where VDISCARD doesn't apply.
>
> Bruce
>
More information about the svn-src-head
mailing list