OSDN Git Service

kernel/printk: use on-stack allocations for kernel log
authorYaroslav Furman <yaro330@gmail.com>
Sat, 13 Jul 2019 12:18:13 +0000 (15:18 +0300)
committer0ranko0P <ranko0p@outlook.com>
Tue, 24 Dec 2019 20:42:48 +0000 (04:42 +0800)
These allocationsare just 1kb in size, using kmalloc is not
worth it for them. This should speed up printing of kernel log
when uptime gets very long.

Signed-off-by: Yaroslav Furman <yaro330@gmail.com>
kernel/printk/printk.c

index 56b2415..030e4e9 100644 (file)
@@ -1158,13 +1158,11 @@ static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
 
 static int syslog_print(char __user *buf, int size)
 {
-       char *text;
+       char text[LOG_LINE_MAX + PREFIX_MAX];
        struct printk_log *msg;
        int len = 0;
 
-       text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
-       if (!text)
-               return -ENOMEM;
+       memset(&text, 0, LOG_LINE_MAX + PREFIX_MAX);
 
        while (size > 0) {
                size_t n;
@@ -1216,18 +1214,15 @@ static int syslog_print(char __user *buf, int size)
                buf += n;
        }
 
-       kfree(text);
        return len;
 }
 
 static int syslog_print_all(char __user *buf, int size, bool clear)
 {
-       char *text;
+       char text[LOG_LINE_MAX + PREFIX_MAX];
        int len = 0;
 
-       text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
-       if (!text)
-               return -ENOMEM;
+       memset(&text, 0, LOG_LINE_MAX + PREFIX_MAX);
 
        raw_spin_lock_irq(&logbuf_lock);
        if (buf) {
@@ -1311,7 +1306,6 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
        }
        raw_spin_unlock_irq(&logbuf_lock);
 
-       kfree(text);
        return len;
 }