Skip to contentSkip to conversation

patch for 2.4.0 disable printk

DISCUSSION Stefani Seibold 4 participants 5 messages Jan 27, 2001 – Jan 29, 2001

Subsystems (9)
Documentation Arm (32-bit) MIPS s390 +5 more subsystems
lore
Share & tools
lore
#0 lore raw

Hi guys,

thanks for the feedback. This is now the second try of my disable printk patch.

First i moved the option for disabling the prinbtk messages form the menu character devices to kernel hacking.

Second, i had change the macro so it calls now a inline funciton printk_inline which always return 0. So it should be now compatibel to the standard printk funciton.

I hope you like the patch...

Greetings,
Stefani

-----patch for 2.4.0 disable printk-----

diff -u --recursive --new-file linux/Documentation/Configure.help linux.noprintk/Documentation/Configure.help

Documentation/Configure.help +8 -0
@@ -12139,6 +12179,14 @@
 
   If unsure, say Y, or else you won't be able to do much with your new
   shiny Linux system :-)
+
+Disable kernel messages
+CONFIG_PRINTK
+  This option allows you to disable all kernel messages by overriding
+  the printk function with an empty macro.
+  On small embedded systems, this save a lot of rom and ram space. On
+  server or desktop systems you want human readable outputs, so it is
+  normally the best choice to say N to this option.
 
 Support for console on virtual terminal
 CONFIG_VT_CONSOLE

diff -u --recursive --new-file linux/include/asm-i386/spinlock.h linux.noprintk/include/asm-i386/spinlock.h

include/asm-i386/spinlock.h +2 -0
@@ -5,8 +5,10 @@
 #include <asm/rwlock.h>
 #include <asm/page.h>
 
+#ifndef CONFIG_PRINTK
 extern int printk(const char * fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
+#endif
 
 /* It seems that people are forgetting to
  * initialize their spinlocks properly, tsk tsk.

diff -u --recursive --new-file linux/include/linux/kernel.h linux.noprintk/include/linux/kernel.h

include/linux/kernel.h +10 -0
@@ -68,8 +68,18 @@
 
 extern int session_of_pgrp(int pgrp);
 
+#ifdef CONFIG_PRINTK
+#define	printk(x...)	printk_inline()
+
+static inline int printk_inline(void) __attribute__ ((const,unused));
+
+static inline int printk_inline(void)	{ return 0; }
+#else
+
 asmlinkage int printk(const char * fmt, ...)
 	__attribute__ ((format (printf, 1, 2)));
+#endif
+
 
 extern int console_loglevel;
 

diff -u --recursive --new-file linux/kernel/ksyms.c linux.noprintk/kernel/ksyms.c

kernel/ksyms.c +2 -0
@@ -439,7 +440,9 @@
 
 /* misc */
 EXPORT_SYMBOL(panic);
+#ifndef CONFIG_PRINTK
 EXPORT_SYMBOL(printk);
+#endif
 EXPORT_SYMBOL(sprintf);
 EXPORT_SYMBOL(vsprintf);
 EXPORT_SYMBOL(kdevname);

diff -u --recursive --new-file linux/kernel/printk.c linux.noprintk/kernel/printk.c

kernel/printk.c +17 -0
@@ -25,7 +25,9 @@
 #define LOG_BUF_LEN	(16384)
 #define LOG_BUF_MASK	(LOG_BUF_LEN-1)
 
+#ifndef CONFIG_PRINTK
 static char buf[1024];
+#endif
 
 /* printk's without a loglevel use this.. */
 #define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */
@@ -251,6 +253,20 @@
 	return do_syslog(type, buf, len);
 }
 
+
+#ifdef CONFIG_PRINTK
+#undef printk
+
+#include <linux/module.h>
+
+asmlinkage int printk(const char *fmt, ...)
+{
+	return 0;
+}
+
+EXPORT_SYMBOL_NOVERS(printk);
+
+#else
 asmlinkage int printk(const char *fmt, ...)
 {
 	va_list args;
@@ -311,6 +322,7 @@
 	wake_up_interruptible(&log_wait);
 	return i;
 }
+#endif
 
 void console_print(const char *s)
 {
CREDITS +8 -0
diff -u --recursive --new-file linux/CREDITS linux.noprintk/CREDITS
@@ -2395,6 +2395,14 @@
 S: Oldenburg
 S: Germany
 
+N: Stefani Seibold
+E: [email protected]
+D: Possibility to disable all kernel messages by overload printk with a
+D: dummy macro (saves a lot of disk- and ramspace for embedded systems
+D: and rescue disks)
+S: Munich
+S: Germany
+
 N: Darren Senn
 E: [email protected]
 D: Whatever I notice needs doing (so far: itimers, /proc)

diff -u --recursive --new-file linux/arch/alpha/config.in linux.noprintk/arch/alpha/config.in

arch/alpha/config.in +1 -0
@@ -359,6 +359,7 @@
 fi
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 
 bool 'Legacy kernel start address' CONFIG_ALPHA_LEGACY_START_ADDRESS
 

diff -u --recursive --new-file linux/arch/arm/config.in linux.noprintk/arch/arm/config.in

arch/arm/config.in +1 -0
@@ -414,6 +414,7 @@
 bool 'Verbose user fault messages' CONFIG_DEBUG_USER
 bool 'Include debugging information in kernel binary' CONFIG_DEBUG_INFO
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 if [ "$CONFIG_CPU_26" = "y" ]; then
    bool 'Disable pgtable cache' CONFIG_NO_PGT_CACHE
 fi

diff -u --recursive --new-file linux/arch/i386/config.in linux.noprintk/arch/i386/config.in

arch/i386/config.in +1 -0
@@ -374,4 +374,5 @@
 
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu

diff -u --recursive --new-file linux/arch/ia64/config.in linux.noprintk/arch/ia64/config.in

arch/ia64/config.in +1 -0
@@ -249,6 +249,7 @@
 fi
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 bool 'Early printk support (requires VGA!)' CONFIG_IA64_EARLY_PRINTK
 bool 'Turn on compare-and-exchange bug checking (slow!)' 

CONFIG_IA64_DEBUG_CMPXCHG
bool 'Turn on irq debug checks (slow!)' CONFIG_IA64_DEBUG_IRQ
diff -u --recursive --new-file linux/arch/m68k/config.in linux.noprintk/arch/m68k/config.in

arch/m68k/config.in +1 -0
@@ -538,4 +538,5 @@
 
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu

diff -u --recursive --new-file linux/arch/mips/config.in linux.noprintk/arch/mips/config.in

arch/mips/config.in +1 -0
@@ -397,4 +397,5 @@
   bool 'Remote GDB kernel debugging' CONFIG_REMOTE_DEBUG
 fi
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu

diff -u --recursive --new-file linux/arch/mips64/config.in linux.noprintk/arch/mips64/config.in

arch/mips64/config.in +1 -0
@@ -266,4 +266,5 @@
 fi
 bool 'Remote GDB kernel debugging' CONFIG_REMOTE_DEBUG
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu

diff -u --recursive --new-file linux/arch/parisc/config.in linux.noprintk/arch/parisc/config.in

arch/parisc/config.in +1 -0
@@ -204,5 +204,6 @@
 
 #bool 'Debug kmalloc/kfree' CONFIG_DEBUG_MALLOC
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu
 

diff -u --recursive --new-file linux/arch/ppc/config.in linux.noprintk/arch/ppc/config.in

arch/ppc/config.in +1 -0
@@ -324,6 +324,7 @@
 comment 'Kernel hacking'
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 bool 'Include kgdb kernel debugger' CONFIG_KGDB
 bool 'Include xmon kernel debugger' CONFIG_XMON
 endmenu

diff -u --recursive --new-file linux/arch/s390/config.in linux.noprintk/arch/s390/config.in

arch/s390/config.in +1 -0
@@ -77,5 +77,6 @@
   bool 'Remote GDB kernel debugging' CONFIG_REMOTE_DEBUG
 fi
 # this does not work. bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu
 

diff -u --recursive --new-file linux/arch/sh/config.in linux.noprintk/arch/sh/config.in

arch/sh/config.in +1 -0
@@ -260,6 +260,7 @@
 comment 'Kernel hacking'
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 bool 'Use LinuxSH standard BIOS' CONFIG_SH_STANDARD_BIOS
 if [ "$CONFIG_SH_STANDARD_BIOS" = "y" ]; then
    bool 'GDB Stub kernel debug' CONFIG_DEBUG_KERNEL_WITH_GDB_STUB

diff -u --recursive --new-file linux/arch/sparc/config.in linux.noprintk/arch/sparc/config.in

arch/sparc/config.in +1 -0
@@ -258,4 +258,5 @@
 comment 'Kernel hacking'
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 endmenu

diff -u --recursive --new-file linux/arch/sparc64/config.in linux.noprintk/arch/sparc64/config.in

arch/sparc64/config.in +1 -0
@@ -331,5 +331,6 @@
 comment 'Kernel hacking'
 
 bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ
+bool 'Disable kernel messages' CONFIG_PRINTK
 #bool 'ECache flush trap support at ta 0x72' CONFIG_EC_FLUSH_TRAP
 endmenu

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#1 lore raw
Quoted 4 lines · Stefani Seibold

Second, i had change the macro so it calls now a inline funciton printk_inline which always return 0. So it should be now compatibel to the standard printk funciton.

A #define is better.

You see, even if printk is a null inline function,

	printk("foo");

will still cause "foo" to appear in your output. Apparently very recent versions of gcc have fixed this.

BTW: Graham Stoney prepared a similar patch for 2.2 last year. You may be able to borrow some ideas from that work, and the followup discussion.

http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0709.html

-
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#2 lore raw
In reply to Stefani Seibold

Hi Andrew,

thanks for your feddback, but... you are not right. Because i override the printk with a macro thats call a inline function printk_inline with no paramters and only return 0. So the compiler sill removes the paramters. If you try this patch, you will see, that none of the parameters appear in the output.
The inline function is the best choice, because it it full compatible to old old printk. No side effects are expeted.
Thanks also for the link. I had a look on it and i think i will add a extrac option to disable also the panic messages.

Greetings,
Stefani

Quoted 14 lines
Quoted 3 lines · Stefani Seibold

Second, i had change the macro so it calls now a inline funciton printk_inline which always return 0. So it should be now compatibel to the standard printk funciton.

A #define is better.

You see, even if printk is a null inline function,

	printk("foo");

will still cause "foo" to appear in your output. Apparently very recent versions of gcc have fixed this.

Quoted 7 lines

BTW: Graham Stoney prepared a similar patch for 2.2 last year. You may be able to borrow some ideas from that work, and the followup discussion.

http://www.uwsg.iu.edu/hypermail/linux/kernel/0004.2/0709.html

-

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#3 lore raw
In reply to Stefani Seibold
Quoted 2 lines · Stefani Seibold

The inline function is the best choice, because it it full compatible to old old printk. No side effects are expeted.

What is the difference?
I can't think of any difference between:

  #define printk(format, args...) ((int) 0)

and:

  static inline int printk_inline (void) { return 0; }
  #define printk(format, args...) (printk_inline ())

If you wanted to be fully compatible in the sense of evaluating the printk arguments, in case those have side effects, there would be:

  #define printk(format, args...) ((0 , ## args), (int) 0)

By the way, CONFIG_NO_PRINTK or CONFIG_DISABLE_PRINTK would be better names. CONFIG_PRINTK suggests that enabling that option enabled printk.

enjoy,
-- Jamie

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/

#4 lore raw
In reply to Stefani Seibold
Quoted 7 lines · Andrew Morton
Quoted 4 lines · Stefani Seibold

Second, i had change the macro so it calls now a inline funciton printk_inline which always return 0. So it should be now compatibel to the standard printk funciton.

Quoted 8 lines

A #define is better.

You see, even if printk is a null inline function,

        printk("foo");

will still cause "foo" to appear in your output. Apparently very recent versions of gcc have fixed this.

I missed earlier parts of this, so maybe I'm not even on the same page...

Here is part of an old patch I made to replace panic messages with a simple EIP that you could still look up in System.map to cut down on the text in the image for small kernels. One could use the same macro trickery for printk() which is what I think Andrew is recommending.

Paul.

include/linux/kernel.h renamed from mnt2/linux/include/linux/kernel.h +10 -2
@@ -34,8 +34,16 @@
 # define NORET_AND     noreturn,
 
 extern void math_error(void);
-NORET_TYPE void panic(const char * fmt, ...)
-	__attribute__ ((NORET_AND format (printf, 1, 2)));
+
+NORET_TYPE void panic_at(const void *location)
+	ATTRIB_NORET;
+
+#define panic(fmt,arg...)	\
+({ __label__ whoops;		\
+whoops:				\
+	panic_at(&&whoops);	\
+})
+ 
 NORET_TYPE void do_exit(long error_code)
 	ATTRIB_NORET;
 extern unsigned long simple_strtoul(const char *,char **,unsigned int);
kernel/panic.c renamed from mnt2/linux/kernel/panic.c +2 -9
@@ -19,50 +19,18 @@
 extern void do_unblank_screen(void);
 extern int C_A_D;
 
-NORET_TYPE void panic(const char * fmt, ...)
+NORET_TYPE void panic_at(const void *location)
 {
-	static char buf[1024];
-	va_list args;
-	int i;
-
-	va_start(args, fmt);
-	vsprintf(buf, fmt, args);
-	va_end(args);
-	printk(KERN_EMERG "Kernel panic: %s\n",buf);
+	printk(KERN_EMERG "Kernel panic at: %p\n",location);
 	if (current == task[0])
 		printk(KERN_EMERG "In swapper task - not syncing\n");
 	else
 
 
 

_________________________________________________________
Do You Yahoo!?
Get your free @yahoo.com address at http://mail.yahoo.com

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
Please read the FAQ at http://www.tux.org/lkml/