colinux64/patch/tty-buffer-alloc-2.6.33.diff
2025-02-13 19:44:47 -07:00

53 lines
1.6 KiB
Diff
Executable File

* Fix abundant warning from kmalloc inside tty_buffer_request_room
* tty_buffer_alloc: Fallback and try to alloc a single page
Index: linux-2.6.33-source/drivers/char/tty_buffer.c
===================================================================
--- linux-2.6.33-source.orig/drivers/char/tty_buffer.c
+++ linux-2.6.33-source/drivers/char/tty_buffer.c
@@ -57,12 +57,27 @@
static struct tty_buffer *tty_buffer_alloc(struct tty_struct *tty, size_t size)
{
struct tty_buffer *p;
+ size_t bytes;
if (tty->buf.memory_used + size > 65536)
return NULL;
- p = kmalloc(sizeof(struct tty_buffer) + 2 * size, GFP_ATOMIC);
- if (p == NULL)
- return NULL;
+
+ bytes = sizeof(struct tty_buffer) + 2 * size;
+ p = kmalloc(bytes, GFP_ATOMIC | __GFP_NOWARN);
+ if (p == NULL) {
+ if (bytes <= PAGE_SIZE) {
+ printk(KERN_WARNING "tty_buffer_alloc: kmalloc failed for size:%d (%d) used:%d\n", size, bytes, tty->buf.memory_used);
+ return NULL;
+ }
+
+ /* Try single page */
+ size = (PAGE_SIZE - sizeof(struct tty_buffer)) / 2;
+ p = kmalloc(PAGE_SIZE, GFP_ATOMIC);
+ if (p == NULL) {
+ printk(KERN_WARNING "tty_buffer_alloc: kmalloc second try failed size:%d (%lu) used:%d\n", size, PAGE_SIZE, tty->buf.memory_used);
+ return NULL;
+ }
+ }
p->used = 0;
p->size = size;
p->next = NULL;
@@ -221,8 +236,12 @@
} else
tty->buf.head = n;
tty->buf.tail = n;
- } else
+ if (n->size < size)
+ size = n->size;
+ } else {
+ printk(KERN_WARNING "tty_buffer_find failed for size:%d left:%d used:%d\n", size, left, tty->buf.memory_used);
size = left;
+ }
}
spin_unlock_irqrestore(&tty->buf.lock, flags);