> On 12. 04. 24, 5:38, li.ha...@zte.com.cn wrote: > > From: Li Hao <li.ha...@zte.com.cn> > > > > Cancel the do_wakeup flag in hvc_struct, and change it to immediately > > wake up tty when hp->n_outbuf is 0 in hvc_push(). > > > > When we receive a key input character, the interrupt handling function > > hvc_handle_interrupt() will be executed, and the echo thread > > flush_to_ldisc() will be added to the queue. > > > > If the user is currently using tcsetattr(), a hang may occur. tcsetattr() > > enters kernel and waits for hp->n_outbuf to become 0 via > > tty_wait_until_sent(). If the echo thread finishes executing before > > reaching tty_wait_until_sent (for example, put_chars() takes too long), > > it will cause while meeting the wakeup condition (hp->do_wakeup = 1), > > tty_wait_until_sent() cannot be woken up (missed the tty_wakeup() of > > this round's tty_poll). Unless the next key input character comes, > > hvc_poll will be executed, and tty_wakeup() will be performed through > > the do_wakeup flag. > > > > Signed-off-by: Li Hao <li.ha...@zte.com.cn> > > --- > > drivers/tty/hvc/hvc_console.c | 12 +++++------- > > drivers/tty/hvc/hvc_console.h | 1 - > > 2 files changed, 5 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c > > index cd1f657f7..2fa90d938 100644 > > --- a/drivers/tty/hvc/hvc_console.c > > +++ b/drivers/tty/hvc/hvc_console.c > > @@ -476,11 +476,13 @@ static void hvc_hangup(struct tty_struct *tty) > > static int hvc_push(struct hvc_struct *hp) > > { > > int n; > > + struct tty_struct *tty; > > > > n = hp->ops->put_chars(hp->vtermno, hp->outbuf, hp->n_outbuf); > > + tty = tty_port_tty_get(&hp->port); > > if (n <= 0) { > > if (n == 0 || n == -EAGAIN) { > > - hp->do_wakeup = 1; > > + tty_wakeup(tty); > > What if tty is NULL? Did you intent to use tty_port_tty_wakeup() instead? > > thanks, > -- > js > suse labs
Thank you for your prompt reply. tty_port_tty_wakeup() is better, it no longer check if tty is NULL in hvc_push() Li Hao