mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	printk: refactor processing of line severity tokens
Restructure the logic of vprintk() so the processing of the leading
3 characters of each input line is in one place, regardless whether
printk_time is enabled. This makes the code smaller and easier to
understand.
size reduction in kernel/printk.o:
   text	   data	    bss	    dec	    hex	filename
   6157	    397	1049804	1056358	 101e66	printk.o.before
   6117	    397	1049804	1056318	 101e3e	printk.o.after
and some style uncleanlinesses removed as well as a side-effect:
 Before:
    total: 19 errors, 22 warnings, 1340 lines checked
 After:
    total: 17 errors, 22 warnings, 1333 lines checked
Signed-off-by: Nick Andrew <nick@nick-andrew.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
			
			
This commit is contained in:
		
							parent
							
								
									cd3a1b8562
								
							
						
					
					
						commit
						ac60ad7413
					
				
					 1 changed files with 27 additions and 34 deletions
				
			
		| 
						 | 
					@ -655,13 +655,13 @@ static int acquire_console_semaphore_for_printk(unsigned int cpu)
 | 
				
			||||||
static const char recursion_bug_msg [] =
 | 
					static const char recursion_bug_msg [] =
 | 
				
			||||||
		KERN_CRIT "BUG: recent printk recursion!\n";
 | 
							KERN_CRIT "BUG: recent printk recursion!\n";
 | 
				
			||||||
static int recursion_bug;
 | 
					static int recursion_bug;
 | 
				
			||||||
static int log_level_unknown = 1;
 | 
						static int new_text_line = 1;
 | 
				
			||||||
static char printk_buf[1024];
 | 
					static char printk_buf[1024];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
asmlinkage int vprintk(const char *fmt, va_list args)
 | 
					asmlinkage int vprintk(const char *fmt, va_list args)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long flags;
 | 
					 | 
				
			||||||
	int printed_len = 0;
 | 
						int printed_len = 0;
 | 
				
			||||||
 | 
						unsigned long flags;
 | 
				
			||||||
	int this_cpu;
 | 
						int this_cpu;
 | 
				
			||||||
	char *p;
 | 
						char *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -703,61 +703,54 @@ asmlinkage int vprintk(const char *fmt, va_list args)
 | 
				
			||||||
	printed_len += vscnprintf(printk_buf + printed_len,
 | 
						printed_len += vscnprintf(printk_buf + printed_len,
 | 
				
			||||||
				  sizeof(printk_buf) - printed_len, fmt, args);
 | 
									  sizeof(printk_buf) - printed_len, fmt, args);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Copy the output into log_buf.  If the caller didn't provide
 | 
						 * Copy the output into log_buf.  If the caller didn't provide
 | 
				
			||||||
	 * appropriate log level tags, we insert them here
 | 
						 * appropriate log level tags, we insert them here
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	for (p = printk_buf; *p; p++) {
 | 
						for (p = printk_buf; *p; p++) {
 | 
				
			||||||
		if (log_level_unknown) {
 | 
							if (new_text_line) {
 | 
				
			||||||
                        /* log_level_unknown signals the start of a new line */
 | 
								int current_log_level = default_message_loglevel;
 | 
				
			||||||
 | 
								/* If a token, set current_log_level and skip over */
 | 
				
			||||||
 | 
								if (p[0] == '<' && p[1] >= '0' && p[1] <= '7' &&
 | 
				
			||||||
 | 
								    p[2] == '>') {
 | 
				
			||||||
 | 
									current_log_level = p[1] - '0';
 | 
				
			||||||
 | 
									p += 3;
 | 
				
			||||||
 | 
									printed_len -= 3;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Always output the token */
 | 
				
			||||||
 | 
								emit_log_char('<');
 | 
				
			||||||
 | 
								emit_log_char(current_log_level + '0');
 | 
				
			||||||
 | 
								emit_log_char('>');
 | 
				
			||||||
 | 
								printed_len += 3;
 | 
				
			||||||
 | 
								new_text_line = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if (printk_time) {
 | 
								if (printk_time) {
 | 
				
			||||||
				int loglev_char;
 | 
									/* Follow the token with the time */
 | 
				
			||||||
				char tbuf[50], *tp;
 | 
									char tbuf[50], *tp;
 | 
				
			||||||
				unsigned tlen;
 | 
									unsigned tlen;
 | 
				
			||||||
				unsigned long long t;
 | 
									unsigned long long t;
 | 
				
			||||||
				unsigned long nanosec_rem;
 | 
									unsigned long nanosec_rem;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				/*
 | 
					 | 
				
			||||||
				 * force the log level token to be
 | 
					 | 
				
			||||||
				 * before the time output.
 | 
					 | 
				
			||||||
				 */
 | 
					 | 
				
			||||||
				if (p[0] == '<' && p[1] >='0' &&
 | 
					 | 
				
			||||||
				   p[1] <= '7' && p[2] == '>') {
 | 
					 | 
				
			||||||
					loglev_char = p[1];
 | 
					 | 
				
			||||||
					p += 3;
 | 
					 | 
				
			||||||
					printed_len -= 3;
 | 
					 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					loglev_char = default_message_loglevel
 | 
					 | 
				
			||||||
						+ '0';
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				t = cpu_clock(printk_cpu);
 | 
									t = cpu_clock(printk_cpu);
 | 
				
			||||||
				nanosec_rem = do_div(t, 1000000000);
 | 
									nanosec_rem = do_div(t, 1000000000);
 | 
				
			||||||
				tlen = sprintf(tbuf,
 | 
									tlen = sprintf(tbuf, "[%5lu.%06lu] ",
 | 
				
			||||||
						"<%c>[%5lu.%06lu] ",
 | 
											(unsigned long) t,
 | 
				
			||||||
						loglev_char,
 | 
											nanosec_rem / 1000);
 | 
				
			||||||
						(unsigned long)t,
 | 
					 | 
				
			||||||
						nanosec_rem/1000);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (tp = tbuf; tp < tbuf + tlen; tp++)
 | 
									for (tp = tbuf; tp < tbuf + tlen; tp++)
 | 
				
			||||||
					emit_log_char(*tp);
 | 
										emit_log_char(*tp);
 | 
				
			||||||
				printed_len += tlen;
 | 
									printed_len += tlen;
 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				if (p[0] != '<' || p[1] < '0' ||
 | 
					 | 
				
			||||||
				   p[1] > '7' || p[2] != '>') {
 | 
					 | 
				
			||||||
					emit_log_char('<');
 | 
					 | 
				
			||||||
					emit_log_char(default_message_loglevel
 | 
					 | 
				
			||||||
						+ '0');
 | 
					 | 
				
			||||||
					emit_log_char('>');
 | 
					 | 
				
			||||||
					printed_len += 3;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			log_level_unknown = 0;
 | 
					
 | 
				
			||||||
			if (!*p)
 | 
								if (!*p)
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		emit_log_char(*p);
 | 
							emit_log_char(*p);
 | 
				
			||||||
		if (*p == '\n')
 | 
							if (*p == '\n')
 | 
				
			||||||
			log_level_unknown = 1;
 | 
								new_text_line = 1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue