Commit 80e5c4dd authored by Sasha Levin's avatar Sasha Levin

Revert "tty: fix stall caused by missing memory barrier in drivers/tty/n_tty.c"

This reverts commit af32cc7b.

The commit was incorrectly backported and was causing hangs.
Reported-by: default avatarCorey Wright <undefined@pobox.com>
Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
parent 8341455f
...@@ -364,8 +364,8 @@ static void n_tty_packet_mode_flush(struct tty_struct *tty) ...@@ -364,8 +364,8 @@ static void n_tty_packet_mode_flush(struct tty_struct *tty)
spin_lock_irqsave(&tty->ctrl_lock, flags); spin_lock_irqsave(&tty->ctrl_lock, flags);
if (tty->link->packet) { if (tty->link->packet) {
tty->ctrl_status |= TIOCPKT_FLUSHREAD; tty->ctrl_status |= TIOCPKT_FLUSHREAD;
spin_unlock_irqrestore(&tty->ctrl_lock, flags); if (waitqueue_active(&tty->link->read_wait))
wake_up_interruptible(&tty->link->read_wait); wake_up_interruptible(&tty->link->read_wait);
} }
spin_unlock_irqrestore(&tty->ctrl_lock, flags); spin_unlock_irqrestore(&tty->ctrl_lock, flags);
} }
...@@ -1387,7 +1387,8 @@ n_tty_receive_char_special(struct tty_struct *tty, unsigned char c) ...@@ -1387,7 +1387,8 @@ n_tty_receive_char_special(struct tty_struct *tty, unsigned char c)
put_tty_queue(c, ldata); put_tty_queue(c, ldata);
ldata->canon_head = ldata->read_head; ldata->canon_head = ldata->read_head;
kill_fasync(&tty->fasync, SIGIO, POLL_IN); kill_fasync(&tty->fasync, SIGIO, POLL_IN);
wake_up_interruptible_poll(&tty->read_wait, POLLIN); if (waitqueue_active(&tty->read_wait))
wake_up_interruptible_poll(&tty->read_wait, POLLIN);
return 0; return 0;
} }
} }
...@@ -1670,7 +1671,8 @@ static void __receive_buf(struct tty_struct *tty, const unsigned char *cp, ...@@ -1670,7 +1671,8 @@ static void __receive_buf(struct tty_struct *tty, const unsigned char *cp,
if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) || if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) ||
L_EXTPROC(tty)) { L_EXTPROC(tty)) {
kill_fasync(&tty->fasync, SIGIO, POLL_IN); kill_fasync(&tty->fasync, SIGIO, POLL_IN);
wake_up_interruptible_poll(&tty->read_wait, POLLIN); if (waitqueue_active(&tty->read_wait))
wake_up_interruptible_poll(&tty->read_wait, POLLIN);
} }
} }
...@@ -1889,8 +1891,10 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) ...@@ -1889,8 +1891,10 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old)
} }
/* The termios change make the tty ready for I/O */ /* The termios change make the tty ready for I/O */
wake_up_interruptible(&tty->write_wait); if (waitqueue_active(&tty->write_wait))
wake_up_interruptible(&tty->read_wait); wake_up_interruptible(&tty->write_wait);
if (waitqueue_active(&tty->read_wait))
wake_up_interruptible(&tty->read_wait);
} }
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment