tty: hvc: hvc_write() fix break condition

Commit 550ddadcc7 ("tty: hvc: hvc_write() may sleep") broke the
termination condition in case the driver stops accepting characters.
This can result in unnecessary polling of the busy driver.

Restore it by testing the hvc_push return code.

Tested-by: Matteo Croce <mcroce@redhat.com>
Tested-by: Jason Gunthorpe <jgg@mellanox.com>
Tested-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Nicholas Piggin 2018-09-09 15:39:16 +10:00 committed by Greg Kroah-Hartman
parent 68b2fc714f
commit 7f2bf7840b

View File

@ -522,6 +522,8 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count
return -EIO; return -EIO;
while (count > 0) { while (count > 0) {
int ret = 0;
spin_lock_irqsave(&hp->lock, flags); spin_lock_irqsave(&hp->lock, flags);
rsize = hp->outbuf_size - hp->n_outbuf; rsize = hp->outbuf_size - hp->n_outbuf;
@ -537,10 +539,13 @@ static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count
} }
if (hp->n_outbuf > 0) if (hp->n_outbuf > 0)
hvc_push(hp); ret = hvc_push(hp);
spin_unlock_irqrestore(&hp->lock, flags); spin_unlock_irqrestore(&hp->lock, flags);
if (!ret)
break;
if (count) { if (count) {
if (hp->n_outbuf > 0) if (hp->n_outbuf > 0)
hvc_flush(hp); hvc_flush(hp);