summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2016-01-22 20:38:46 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2016-01-22 20:38:46 +0000
commitfa28b6e7dab231f5c6ae7c3b6a3ef4a38785eefe (patch)
treefade96de2f635a4e584a9edcef3b0e599f5a3764
parentc18d8171a6e65ad9237f2c4ad5d5571aabbf0f3c (diff)
Notes
-rw-r--r--sys/kern/tty.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/kern/tty.c b/sys/kern/tty.c
index 1dc6af2ca3e4..e28b303cefa9 100644
--- a/sys/kern/tty.c
+++ b/sys/kern/tty.c
@@ -213,7 +213,7 @@ ttydev_leave(struct tty *tp)
ttydisc_close(tp);
- /* Destroy associated buffers already. */
+ /* Free i/o queues now since they might be large. */
ttyinq_free(&tp->t_inq);
tp->t_inlow = 0;
ttyoutq_free(&tp->t_outq);
@@ -1031,10 +1031,15 @@ tty_dealloc(void *arg)
{
struct tty *tp = arg;
- /* Make sure we haven't leaked buffers. */
- MPASS(ttyinq_getsize(&tp->t_inq) == 0);
- MPASS(ttyoutq_getsize(&tp->t_outq) == 0);
-
+ /*
+ * ttyydev_leave() usually frees the i/o queues earlier, but it is
+ * not always called between queue allocation and here. The queues
+ * may be allocated by ioctls on a pty control device without the
+ * corresponding pty slave device ever being open, or after it is
+ * closed.
+ */
+ ttyinq_free(&tp->t_inq);
+ ttyoutq_free(&tp->t_outq);
seldrain(&tp->t_inpoll);
seldrain(&tp->t_outpoll);
knlist_destroy(&tp->t_inpoll.si_note);