printk.c: use ints instead of longs for logbuf index
PATCH 1/1 printk.c: use ints instead of longs for logbuf index
Hi Andrew,
This patch stops using unsigned _longs_ for printk buffer indexes. Log buffer is way smaller than 2 gigabytes and unsigned ints will work too . Indeed, they do work nicely on all 32-bit platforms where longs and ints are the same.
With this patch, we have following size savings on amd64:
text data bss dec hex filename
5997 313 17736 24046 5dee 2.6.23.1.t64/kernel/printk.o 5858 313 17700 23871 5d3f 2.6.23.1.printk.t64/kernel/printk.o
Please take this patch into -mm.
--
vda
kernel/printk.c +18 -18
@@ -84,16 +84,16 @@ static int console_locked, console_suspe*/ static DEFINE_SPINLOCK (logbuf_lock); -#define LOG_BUF_MASK (log_buf_len-1) +#define LOG_BUF_MASK (log_buf_len-1)#define LOG_BUF (idx) (log_buf[(idx) & LOG_BUF_MASK])/* * The indices into log_buf are not constrained to log_buf_len - they * must be masked before subscripting */ -static unsigned long log_start;/* Index into log_buf: next char to be read by syslog() */ -static unsigned long con_start;/* Index into log_buf: next char to be sent to consoles */ -static unsigned long log_end;/* Index into log_buf: most-recently-written-char + 1 */ +static unsigned log_start;/* Index into log_buf: next char to be read by syslog() */ +static unsigned con_start;/* Index into log_buf: next char to be sent to consoles */ +static unsigned log_end;/* Index into log_buf: most-recently-written-char + 1 */ /* * Array of consoles built from command line options (console=)
@@ -119,17 +119,17 @@ static int console_may_schedule;static char __log_buf[__LOG_BUF_LEN];static char *log_buf = __log_buf;static int log_buf_len = __LOG_BUF_LEN; -static unsigned long logged_chars;/* Number of chars produced since last read+clear operation */ +static unsigned logged_chars;/* Number of chars produced since last read+clear operation */ static int __init log_buf_len_setup (char *str) { -unsigned long size =memparse (str, &str); +unsigned size =memparse (str, &str);unsigned long flags;if (size) size =roundup_pow_of_two (size);if (size > log_buf_len) { -unsigned long start, dest_idx, offset; +unsigned start, dest_idx, offset;char *new_log_buf; new_log_buf =alloc_bootmem (size);
@@ -179,7 +179,7 @@ __setup("log_buf_len=", log_buf_len_setu*/ int do_syslog (int type,char __user *buf,int len) { -unsigned long i, j, limit, count; +unsigned i, j, limit, count;int do_clear =0 ;char c;int error =0 ;
@@ -320,7 +320,7 @@ asmlinkage long sys_syslog(int type, cha/* * Call the console drivers on a range of log_buf */ -static void __call_console_drivers (unsigned long start,unsigned long end) +static void __call_console_drivers (unsigned start,unsigned end) {struct console *con;
@@ -347,8 +347,8 @@ __setup("ignore_loglevel", ignore_loglev/* * Write out chars from start to end - 1 inclusive */ -static void _call_console_drivers (unsigned long start, -unsigned long end,int msg_log_level) +static void _call_console_drivers (unsigned start, +unsigned end,int msg_log_level) {if ((msg_log_level < console_loglevel || ignore_loglevel) && console_drivers && start != end) {
@@ -368,12 +368,12 @@ static void _call_console_drivers(unsign* log_buf[start] to log_buf[end - 1]. * The console_sem must be held. */ -static void call_console_drivers (unsigned long start,unsigned long end) +static void call_console_drivers (unsigned start,unsigned end) { -unsigned long cur_index, start_print; +unsigned cur_index, start_print;static int msg_level =-1 ; -BUG_ON (((long )(start - end)) >0 ); +BUG_ON (((int )(start - end)) >0 ); cur_index = start; start_print = start;
@@ -649,7 +649,7 @@ asmlinkage long sys_syslog(int type, chareturn -ENOSYS ; } -static void call_console_drivers (unsigned long start,unsigned long end) +static void call_console_drivers (unsigned start,unsigned end) { }
@@ -830,8 +830,8 @@ void wake_up_klogd(void)void release_console_sem (void ) {unsigned long flags; -unsigned long _con_start, _log_end; -unsigned long wake_klogd =0 ; +unsigned _con_start, _log_end; +unsigned wake_klogd =0 ;if (console_suspended) {up (&secondary_console_sem);
@@ -1122,7 +1122,7 @@ void tty_write_message(struct tty_structint __printk_ratelimit (int ratelimit_jiffies,int ratelimit_burst) {static DEFINE_SPINLOCK (ratelimit_lock); -static unsigned long toks =10 *5 *HZ ; +static unsigned toks =10 *5 *HZ ;static unsigned long last_msg;static int missed;unsigned long flags;
Quoted 1 line · On Sun, 18 Nov 2007 19:32:12 -0800 Denys Vlasenko <[email protected]>…
Subject: [PATCH]
printk.c: use ints instead of longs for logbuf index
"unsigned ints". It matters - using ints would fill the code with bugs.
Quoted 10 lines
Date: Sun, 18 Nov 2007 19:32:12 -0800
User-Agent: KMail/1.9.1Hi Andrew,
This patch stops using unsigned _longs_ for printk buffer indexes. Log buffer is way smaller than 2 gigabytes and unsigned ints will work too . Indeed, they do work nicely on all 32-bit platforms where longs and ints are the same.
Quoted 5 lines
With this patch, we have following size savings on amd64:
text data bss dec hex filename 5997 313 17736 24046 5dee 2.6.23.1.t64/kernel/printk.o 5858 313 17700 23871 5d3f 2.6.23.1.printk.t64/kernel/printk.o
I can imagine someone using an 8GB log buffer for crazy i-cant-be-bothered-using-relayfs stuff.
Oh well, they'll live.