aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/tty
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/tty')
-rw-r--r--drivers/tty/n_tty.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
index f63b25bbe895..7aeabb719526 100644
--- a/drivers/tty/n_tty.c
+++ b/drivers/tty/n_tty.c
@@ -1669,9 +1669,8 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
while (1) {
/*
- * When PARMRK is set, multiply read_cnt by 3, since each byte
- * might take up to three times as many spaces (depending on
- * its flags, e.g. parity error). [This calculation is wrong.]
+ * When PARMRK is set, each input char may take up to 3 chars
+ * in the read buf; reduce the buffer space avail by 3x
*
* If we are doing input canonicalization, and there are no
* pending newlines, let characters through without limit, so
@@ -1683,13 +1682,10 @@ n_tty_receive_buf_common(struct tty_struct *tty, const unsigned char *cp,
* read_tail (so this producer will not overwrite unread data)
*/
size_t tail = smp_load_acquire(&ldata->read_tail);
- size_t head = ldata->read_head;
+ room = N_TTY_BUF_SIZE - (ldata->read_head - tail) - 1;
if (I_PARMRK(tty))
- room = N_TTY_BUF_SIZE - (head - tail) * 3 - 1;
- else
- room = N_TTY_BUF_SIZE - (head - tail) - 1;
-
+ room /= 3;
if (room <= 0)
room = ldata->icanon && ldata->canon_head == tail;