forked from luck/tmp_suning_uos_patched
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:
parent
68b2fc714f
commit
7f2bf7840b
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user