diff options
author | Jiri Slaby <jslaby@suse.cz> | 2018-09-07 09:19:06 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-18 10:07:25 -0400 |
commit | feacbecb39db098cd9f6d728dcb00d753a3f36ed (patch) | |
tree | 843e7d9e2a9ee69accaf38ea8fb68d3418efbb40 | |
parent | 863299001b39280b3be9f5c627d23debe66aa71b (diff) |
TTY: tty_buffer, warn on leaks
When we leak some tty buffer, warn about that. For that we need to
account the memory used also in the tty_buffer_free_all function. On
other locations, the accounting is handled correctly.
Note that we do not account the free list, as that was accounted in
tty_buffer_free before put on the free list.
I have been using this patch for ages, so let's see if anybody else
encounters any issues.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/tty/tty_buffer.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/tty/tty_buffer.c b/drivers/tty/tty_buffer.c index c996b6859c5e..76151c002858 100644 --- a/drivers/tty/tty_buffer.c +++ b/drivers/tty/tty_buffer.c | |||
@@ -118,9 +118,12 @@ void tty_buffer_free_all(struct tty_port *port) | |||
118 | struct tty_bufhead *buf = &port->buf; | 118 | struct tty_bufhead *buf = &port->buf; |
119 | struct tty_buffer *p, *next; | 119 | struct tty_buffer *p, *next; |
120 | struct llist_node *llist; | 120 | struct llist_node *llist; |
121 | unsigned int freed = 0; | ||
122 | int still_used; | ||
121 | 123 | ||
122 | while ((p = buf->head) != NULL) { | 124 | while ((p = buf->head) != NULL) { |
123 | buf->head = p->next; | 125 | buf->head = p->next; |
126 | freed += p->size; | ||
124 | if (p->size > 0) | 127 | if (p->size > 0) |
125 | kfree(p); | 128 | kfree(p); |
126 | } | 129 | } |
@@ -132,7 +135,9 @@ void tty_buffer_free_all(struct tty_port *port) | |||
132 | buf->head = &buf->sentinel; | 135 | buf->head = &buf->sentinel; |
133 | buf->tail = &buf->sentinel; | 136 | buf->tail = &buf->sentinel; |
134 | 137 | ||
135 | atomic_set(&buf->mem_used, 0); | 138 | still_used = atomic_xchg(&buf->mem_used, 0); |
139 | WARN(still_used != freed, "we still have not freed %d bytes!", | ||
140 | still_used - freed); | ||
136 | } | 141 | } |
137 | 142 | ||
138 | /** | 143 | /** |