public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH 0/3] printk: Use a non-printable ASCII SOH for KERN_<LEVEL>
@ 2012-05-24 22:49 Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 1/3] printk: Use a non-printable ASCII KERN_<LEVEL> initiator Joe Perches
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Joe Perches @ 2012-05-24 22:49 UTC (permalink / raw)
  To: Linus Torvalds, linux-kernel; +Cc: Greg KH, Kay Sievers, Andrew Morton

printk uses "<.>" as a start of record indicator.
This can waste a bit of space and causes a bit of
contortion to get a printk emitted that happens to
starts with "<.>".

Use ASCII Start-of-Header (0x01) as the KERN_LEVEL
initiator and save ~10K in an x86 defconfig.

Joe Perches (3):
  printk: Use a non-printable ASCII KERN_<LEVEL> initiator
  treewide: Fix declaration and uses of old KERN_<LEVEL> style
  printk: Set KERN_CONT to ""

 arch/arm/lib/io-acorn.S              |    4 +++-
 arch/arm/vfp/vfphw.S                 |    8 +++++---
 arch/frv/kernel/kernel_thread.S      |    2 +-
 drivers/staging/wlags49_h2/hcf.c     |    8 ++++----
 drivers/staging/wlags49_h2/wl_main.c |    4 ++--
 fs/btrfs/super.c                     |    9 +++++----
 include/linux/printk.h               |   23 +++++++++++++----------
 kernel/printk.c                      |    6 +++---
 net/bridge/netfilter/ebt_log.c       |    2 +-
 sound/core/misc.c                    |    8 ++++----
 10 files changed, 41 insertions(+), 33 deletions(-)

-- 
1.7.8.111.gad25c.dirty


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [RFC PATCH 1/3] printk: Use a non-printable ASCII KERN_<LEVEL> initiator
  2012-05-24 22:49 [RFC PATCH 0/3] printk: Use a non-printable ASCII SOH for KERN_<LEVEL> Joe Perches
@ 2012-05-24 22:49 ` Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 2/3] treewide: Fix declaration and uses of old KERN_<LEVEL> style Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 3/3] printk: Set KERN_CONT to "" Joe Perches
  2 siblings, 0 replies; 4+ messages in thread
From: Joe Perches @ 2012-05-24 22:49 UTC (permalink / raw)
  To: Linus Torvalds, linux-kernel; +Cc: Greg KH, Kay Sievers, Andrew Morton

printk uses <.> to denote the message level.
There are thousands of messages in default kernel.

Use ASCII SOH (hex: 01) with no terminator
to save 1 byte per message.

This also means that KERN_CONT could be completely
removed (#defined to "") as it is no longer serves
any real purpose.

Signed-off-by: Joe Perches <joe@perches.com>
---
 include/linux/printk.h |   23 +++++++++++++----------
 kernel/printk.c        |    6 +++---
 2 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/include/linux/printk.h b/include/linux/printk.h
index 1bec2f7..ad76855 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -6,23 +6,26 @@
 extern const char linux_banner[];
 extern const char linux_proc_banner[];
 
-#define KERN_EMERG	"<0>"	/* system is unusable			*/
-#define KERN_ALERT	"<1>"	/* action must be taken immediately	*/
-#define KERN_CRIT	"<2>"	/* critical conditions			*/
-#define KERN_ERR	"<3>"	/* error conditions			*/
-#define KERN_WARNING	"<4>"	/* warning conditions			*/
-#define KERN_NOTICE	"<5>"	/* normal but significant condition	*/
-#define KERN_INFO	"<6>"	/* informational			*/
-#define KERN_DEBUG	"<7>"	/* debug-level messages			*/
+#define KERN_SOH	"\001"		/* ASCII Start Of Header */
+#define KERN_SOH_ASCII	'\001'
+
+#define KERN_EMERG	KERN_SOH "0"	/* system is unusable */
+#define KERN_ALERT	KERN_SOH "1"	/* action must be taken immediately */
+#define KERN_CRIT	KERN_SOH "2"	/* critical conditions */
+#define KERN_ERR	KERN_SOH "3"	/* error conditions */
+#define KERN_WARNING	KERN_SOH "4"	/* warning conditions */
+#define KERN_NOTICE	KERN_SOH "5"	/* normal but significant condition */
+#define KERN_INFO	KERN_SOH "6"	/* informational */
+#define KERN_DEBUG	KERN_SOH "7"	/* debug-level messages */
 
 /* Use the default kernel loglevel */
-#define KERN_DEFAULT	"<d>"
+#define KERN_DEFAULT	KERN_SOH "d"
 /*
  * Annotation for a "continued" line of log printout (only done after a
  * line that had no enclosing \n). Only to be used by core/arch code
  * during early bootup (a continued line is not SMP-safe otherwise).
  */
-#define KERN_CONT	"<c>"
+#define KERN_CONT	KERN_SOH "c"
 
 extern int console_printk[];
 
diff --git a/kernel/printk.c b/kernel/printk.c
index 32462d2..e96e733 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -1329,7 +1329,7 @@ asmlinkage int vprintk_emit(int facility, int level,
 	}
 
 	/* strip syslog prefix and extract log level or control flags */
-	if (text[0] == '<' && text[1] && text[2] == '>') {
+	if (text[0] == KERN_SOH_ASCII && text[1]) {
 		switch (text[1]) {
 		case '0' ... '7':
 			if (level == -1)
@@ -1337,8 +1337,8 @@ asmlinkage int vprintk_emit(int facility, int level,
 		case 'd':	/* KERN_DEFAULT */
 			prefix = true;
 		case 'c':	/* KERN_CONT */
-			text += 3;
-			text_len -= 3;
+			text += 2;
+			text_len -= 2;
 		}
 	}
 
-- 
1.7.8.111.gad25c.dirty


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC PATCH 2/3] treewide: Fix declaration and uses of old KERN_<LEVEL> style
  2012-05-24 22:49 [RFC PATCH 0/3] printk: Use a non-printable ASCII SOH for KERN_<LEVEL> Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 1/3] printk: Use a non-printable ASCII KERN_<LEVEL> initiator Joe Perches
@ 2012-05-24 22:49 ` Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 3/3] printk: Set KERN_CONT to "" Joe Perches
  2 siblings, 0 replies; 4+ messages in thread
From: Joe Perches @ 2012-05-24 22:49 UTC (permalink / raw)
  To: Linus Torvalds, linux-kernel; +Cc: Greg KH, Kay Sievers, Andrew Morton

Now that KERN_<LEVEL> is no longer "<.>",
some code that relied on that form needed to
be updated.

Replace direct declarations of <.> and fix
the parsing of <.> to use the new KERN_SOH
style.

Signed-off-by: Joe Perches <joe@perches.com>
---
 arch/arm/lib/io-acorn.S              |    4 +++-
 arch/arm/vfp/vfphw.S                 |    8 +++++---
 arch/frv/kernel/kernel_thread.S      |    2 +-
 drivers/staging/wlags49_h2/hcf.c     |    8 ++++----
 drivers/staging/wlags49_h2/wl_main.c |    4 ++--
 fs/btrfs/super.c                     |    9 +++++----
 net/bridge/netfilter/ebt_log.c       |    2 +-
 sound/core/misc.c                    |    8 ++++----
 8 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/arch/arm/lib/io-acorn.S b/arch/arm/lib/io-acorn.S
index 1b197ea..6b5b6ee 100644
--- a/arch/arm/lib/io-acorn.S
+++ b/arch/arm/lib/io-acorn.S
@@ -13,11 +13,13 @@
 #include <linux/linkage.h>
 #include <asm/assembler.h>
 
+#define	KERN_WARNING	"\001" "4"
+
 		.text
 		.align
 
 .Liosl_warning:
-		.ascii	"<4>insl/outsl not implemented, called from %08lX\0"
+		.ascii	KERN_WARNING "insl/outsl not implemented, called from %08lX\0"
 		.align
 
 /*
diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S
index 2d30c7f..640f25e 100644
--- a/arch/arm/vfp/vfphw.S
+++ b/arch/arm/vfp/vfphw.S
@@ -18,13 +18,15 @@
 #include <asm/vfpmacros.h>
 #include "../kernel/entry-header.S"
 
+#define KERN_DEBUG "\001" "7"
+
 	.macro	DBGSTR, str
 #ifdef DEBUG
 	stmfd	sp!, {r0-r3, ip, lr}
 	add	r0, pc, #4
 	bl	printk
 	b	1f
-	.asciz  "<7>VFP: \str\n"
+	.asciz  KERN_DEBUG "VFP: \str\n"
 	.balign 4
 1:	ldmfd	sp!, {r0-r3, ip, lr}
 #endif
@@ -37,7 +39,7 @@
 	add	r0, pc, #4
 	bl	printk
 	b	1f
-	.asciz  "<7>VFP: \str\n"
+	.asciz  KERN_DEBUG "VFP: \str\n"
 	.balign 4
 1:	ldmfd	sp!, {r0-r3, ip, lr}
 #endif
@@ -52,7 +54,7 @@
 	add	r0, pc, #4
 	bl	printk
 	b	1f
-	.asciz  "<7>VFP: \str\n"
+	.asciz  KERN_DEBUG "VFP: \str\n"
 	.balign 4
 1:	ldmfd	sp!, {r0-r3, ip, lr}
 #endif
diff --git a/arch/frv/kernel/kernel_thread.S b/arch/frv/kernel/kernel_thread.S
index 4531c83..a3b69e9 100644
--- a/arch/frv/kernel/kernel_thread.S
+++ b/arch/frv/kernel/kernel_thread.S
@@ -13,7 +13,7 @@
 #include <asm/unistd.h>
 
 #define CLONE_VM	0x00000100	/* set if VM shared between processes */
-#define	KERN_ERR	"<3>"
+#define	KERN_ERR	"\001" "3"
 
 	.section .rodata
 kernel_thread_emsg:
diff --git a/drivers/staging/wlags49_h2/hcf.c b/drivers/staging/wlags49_h2/hcf.c
index 366e4a4..4235446 100644
--- a/drivers/staging/wlags49_h2/hcf.c
+++ b/drivers/staging/wlags49_h2/hcf.c
@@ -705,7 +705,7 @@ hcf_action( IFBP ifbp, hcf_16 action )
 			// 800 us latency before FW switches to high power
 			MSF_WAIT(800);                              // MSF-defined function to wait n microseconds.
 //OOR			if ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_DS_OOR ) { // OutOfRange
-//				printk( "<5>ACT_INT_OFF: Deepsleep phase terminated, enable and go to AwaitConnection\n" );     //;?remove me 1 day
+//				printk(KERN_NOTICE "ACT_INT_OFF: Deepsleep phase terminated, enable and go to AwaitConnection\n" );     //;?remove me 1 day
 //				hcf_cntl( ifbp, HCF_CNTL_ENABLE );
 //			}
 //			ifbp->IFB_DSLinkStat &= ~( CFG_LINK_STAT_DS_IR | CFG_LINK_STAT_DS_OOR); //clear IR/OOR state
@@ -2979,7 +2979,7 @@ hcf_service_nic( IFBP ifbp, wci_bufp bufp, unsigned int len )
 			ltv.typ = CFG_DDS_TICK_TIME;
 			ltv.tick_time = ( ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_TIMER ) + 0x10 ) *64; //78 is more right
 			hcf_put_info( ifbp, (LTVP)&ltv );
-			printk( "<5>Preparing for sleep, link_status: %04X, timer : %d\n",
+			printk(KERN_NOTICE "Preparing for sleep, link_status: %04X, timer : %d\n",
 				ifbp->IFB_DSLinkStat, ltv.tick_time );//;?remove me 1 day
 			ifbp->IFB_TickCnt++; //;?just to make sure we do not keep on printing above message
 			if ( ltv.tick_time < 300 * 125 ) ifbp->IFB_DSLinkStat += 0x0010;
@@ -4221,11 +4221,11 @@ isr_info( IFBP ifbp )
 // /*4*/    if ( info[1] == CFG_LINK_STAT ) {
 //          ifbp->IFB_DSLinkStat = IPW( HREG_DATA_1 ) | CFG_LINK_STAT_CHANGE;   //corrupts BAP !! ;?
 //          ifbp->IFB_LinkStat = ifbp->IFB_DSLinkStat & CFG_LINK_STAT_FW; //;? to be obsoleted
-//          printk( "<4>linkstatus: %04x\n", ifbp->IFB_DSLinkStat );        //;?remove me 1 day
+//          printk(KERN_ERR "linkstatus: %04x\n", ifbp->IFB_DSLinkStat );        //;?remove me 1 day
 // #if (HCF_SLEEP) & HCF_DDS
 //          if ( ( ifbp->IFB_DSLinkStat & CFG_LINK_STAT_CONNECTED ) == 0 ) {    //even values are disconnected etc.
 //              ifbp->IFB_TickCnt = 0;              //start 2 second period (with 1 tick uncertanty)
-//              printk( "<5>isr_info: AwaitConnection phase started, IFB_TickCnt = 0\n" );      //;?remove me 1 day
+//              printk(KERN_NOTICE "isr_info: AwaitConnection phase started, IFB_TickCnt = 0\n" );      //;?remove me 1 day
 //          }
 // #endif // HCF_DDS
 //      }
diff --git a/drivers/staging/wlags49_h2/wl_main.c b/drivers/staging/wlags49_h2/wl_main.c
index d5bf0a7..2041078 100644
--- a/drivers/staging/wlags49_h2/wl_main.c
+++ b/drivers/staging/wlags49_h2/wl_main.c
@@ -3822,7 +3822,7 @@ static int write_int(struct file *file, const char *buffer, unsigned long count,
 		lp->timer_oor.data = (unsigned long)lp;
 		lp->timer_oor.expires = RUN_AT( 3 * HZ );
 		add_timer( &lp->timer_oor );
-		printk( "<5>wl_enable: %ld\n", jiffies );		//;?remove me 1 day
+		printk(KERN_NOTICE "wl_enable: %ld\n", jiffies );		//;?remove me 1 day
 #endif //DN554
 #ifdef DN554
 /*******************************************************************************
@@ -3852,7 +3852,7 @@ void timer_oor( u_long arg )
     DBG_ENTER( DbgInfo );
     DBG_PARAM( DbgInfo, "arg", "0x%08lx", arg );
 
-	printk( "<5>timer_oor: %ld 0x%04X\n", jiffies, lp->timer_oor_cnt );		//;?remove me 1 day
+	printk(KERN_NOTICE "timer_oor: %ld 0x%04X\n", jiffies, lp->timer_oor_cnt );		//;?remove me 1 day
 	lp->timer_oor_cnt += 10;
     if ( (lp->timer_oor_cnt & ~DS_OOR) > 300 ) {
 		lp->timer_oor_cnt = 300;
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index c5f8fca..daf2e47 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -180,16 +180,17 @@ const char *logtypes[] = {
 void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
 {
 	struct super_block *sb = fs_info->sb;
-	char lvl[4];
+	char lvl[3];
 	struct va_format vaf;
 	va_list args;
 	const char *type = logtypes[4];
 
 	va_start(args, fmt);
 
-	if (fmt[0] == '<' && isdigit(fmt[1]) && fmt[2] == '>') {
-		strncpy(lvl, fmt, 3);
-		fmt += 3;
+	if (fmt[0] == KERN_SOH_ASCII && isdigit(fmt[1])) {
+		lvl[0] = fmt[0];
+		lvl[1] = fmt[1];
+		lvl[2] = 0;
 		type = logtypes[fmt[1] - '0'];
 	} else
 		*lvl = '\0';
diff --git a/net/bridge/netfilter/ebt_log.c b/net/bridge/netfilter/ebt_log.c
index f88ee53..31286d3 100644
--- a/net/bridge/netfilter/ebt_log.c
+++ b/net/bridge/netfilter/ebt_log.c
@@ -80,7 +80,7 @@ ebt_log_packet(u_int8_t pf, unsigned int hooknum,
 	unsigned int bitmask;
 
 	spin_lock_bh(&ebt_log_lock);
-	printk("<%c>%s IN=%s OUT=%s MAC source = %pM MAC dest = %pM proto = 0x%04x",
+	printk(KERN_SOH "%c" "%s IN=%s OUT=%s MAC source = %pM MAC dest = %pM proto = 0x%04x",
 	       '0' + loginfo->u.log.level, prefix,
 	       in ? in->name : "", out ? out->name : "",
 	       eth_hdr(skb)->h_source, eth_hdr(skb)->h_dest,
diff --git a/sound/core/misc.c b/sound/core/misc.c
index 7681679..4e47cd8 100644
--- a/sound/core/misc.c
+++ b/sound/core/misc.c
@@ -81,11 +81,11 @@ void __snd_printk(unsigned int level, const char *path, int line,
 #ifdef CONFIG_SND_VERBOSE_PRINTK
 	vaf.fmt = format;
 	vaf.va = &args;
-	if (format[0] == '<' && format[2] == '>') {
-		memcpy(verbose_fmt, format, 3);
-		vaf.fmt = format + 3;
+	if (format[0] == KERN_SOH_ASCII) {
+		memcpy(verbose_fmt, format, 2);
+		vaf.fmt = format + 2;
 	} else if (level)
-		memcpy(verbose_fmt, KERN_DEBUG, 3);
+		memcpy(verbose_fmt, KERN_DEBUG, 2);
 	printk(verbose_fmt, sanity_file_name(path), line, &vaf);
 #else
 	vprintk(format, args);
-- 
1.7.8.111.gad25c.dirty


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [RFC PATCH 3/3] printk: Set KERN_CONT to ""
  2012-05-24 22:49 [RFC PATCH 0/3] printk: Use a non-printable ASCII SOH for KERN_<LEVEL> Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 1/3] printk: Use a non-printable ASCII KERN_<LEVEL> initiator Joe Perches
  2012-05-24 22:49 ` [RFC PATCH 2/3] treewide: Fix declaration and uses of old KERN_<LEVEL> style Joe Perches
@ 2012-05-24 22:49 ` Joe Perches
  2 siblings, 0 replies; 4+ messages in thread
From: Joe Perches @ 2012-05-24 22:49 UTC (permalink / raw)
  To: Linus Torvalds, linux-kernel; +Cc: Greg KH, Kay Sievers, Andrew Morton

Logging content is only printable ASCII.

Now that all KERN_<LEVEL> uses are specified by ASCII SOH,
KERN_CONT doesn't have any real purpose.

Signed-off-by: Joe Perches <joe@perches.com>
---
 include/linux/printk.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/include/linux/printk.h b/include/linux/printk.h
index ad76855..482121b 100644
--- a/include/linux/printk.h
+++ b/include/linux/printk.h
@@ -25,7 +25,7 @@ extern const char linux_proc_banner[];
  * line that had no enclosing \n). Only to be used by core/arch code
  * during early bootup (a continued line is not SMP-safe otherwise).
  */
-#define KERN_CONT	KERN_SOH "c"
+#define KERN_CONT	""
 
 extern int console_printk[];
 
-- 
1.7.8.111.gad25c.dirty


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-05-24 22:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-24 22:49 [RFC PATCH 0/3] printk: Use a non-printable ASCII SOH for KERN_<LEVEL> Joe Perches
2012-05-24 22:49 ` [RFC PATCH 1/3] printk: Use a non-printable ASCII KERN_<LEVEL> initiator Joe Perches
2012-05-24 22:49 ` [RFC PATCH 2/3] treewide: Fix declaration and uses of old KERN_<LEVEL> style Joe Perches
2012-05-24 22:49 ` [RFC PATCH 3/3] printk: Set KERN_CONT to "" Joe Perches

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox