diff --git a/include/linux/tty.h b/include/linux/tty.h index 6d5eceb165be..0ad68889fc1a 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -601,6 +601,24 @@ extern long vt_compat_ioctl(struct tty_struct *tty, extern void __lockfunc tty_lock(void) __acquires(tty_lock); extern void __lockfunc tty_unlock(void) __releases(tty_lock); +/* + * this shall be called only from where BTM is held (like close) + * + * We need this to ensure nobody waits for us to finish while we are waiting. + * Without this we were encountering system stalls. + * + * This should be indeed removed with BTM removal later. + * + * Locking: BTM required. Nobody is allowed to hold port->mutex. + */ +static inline void tty_wait_until_sent_from_close(struct tty_struct *tty, + long timeout) +{ + tty_unlock(); /* tty->ops->close holds the BTM, drop it while waiting */ + tty_wait_until_sent(tty, timeout); + tty_lock(); +} + /* * wait_event_interruptible_tty -- wait for a condition with the tty lock held *