Subject: [PATCH] printk_time: prepare stub for using other than cpu_clock

-v2: refresh to v3.10

Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>

---
 include/linux/printk.h |    3 +++
 init/main.c            |    1 +
 kernel/printk.c        |   17 +++++++++++++++--
 3 files changed, 19 insertions(+), 2 deletions(-)

Index: linux-2.6/init/main.c
===================================================================
--- linux-2.6.orig/init/main.c
+++ linux-2.6/init/main.c
@@ -601,6 +601,7 @@ asmlinkage void __init start_kernel(void
 		late_time_init();
 	sched_clock_init();
 	calibrate_delay();
+	set_printk_time_clock(local_clock);
 	pidmap_init();
 	anon_vma_init();
 #ifdef CONFIG_X86
Index: linux-2.6/kernel/printk.c
===================================================================
--- linux-2.6.orig/kernel/printk.c
+++ linux-2.6/kernel/printk.c
@@ -217,6 +217,19 @@ struct log {
 static DEFINE_RAW_SPINLOCK(logbuf_lock);
 
 #ifdef CONFIG_PRINTK
+
+static u64 default_printk_time_clock(void)
+{
+	return 0;
+}
+
+static u64 (*printk_time_clock)(void) = default_printk_time_clock;
+
+void set_printk_time_clock(u64 (*fn)(void))
+{
+	printk_time_clock = fn;
+}
+
 DECLARE_WAIT_QUEUE_HEAD(log_wait);
 /* the next printk record to read by syslog(READ) or /proc/kmsg */
 static u64 syslog_seq;
@@ -354,7 +367,7 @@ static void log_store(int facility, int
 	if (ts_nsec > 0)
 		msg->ts_nsec = ts_nsec;
 	else
-		msg->ts_nsec = local_clock();
+		msg->ts_nsec = printk_time_clock();
 	memset(log_dict(msg) + dict_len, 0, pad_len);
 	msg->len = sizeof(struct log) + text_len + dict_len + pad_len;
 
@@ -1457,7 +1470,7 @@ static bool cont_add(int facility, int l
 		cont.facility = facility;
 		cont.level = level;
 		cont.owner = current;
-		cont.ts_nsec = local_clock();
+		cont.ts_nsec = printk_time_clock();
 		cont.flags = 0;
 		cont.cons = 0;
 		cont.flushed = false;
Index: linux-2.6/include/linux/printk.h
===================================================================
--- linux-2.6.orig/include/linux/printk.h
+++ linux-2.6/include/linux/printk.h
@@ -107,6 +107,7 @@ void early_printk(const char *s, ...) {
 #endif
 
 #ifdef CONFIG_PRINTK
+extern void set_printk_time_clock(u64 (*fn)(void));
 asmlinkage __printf(5, 0)
 int vprintk_emit(int facility, int level,
 		 const char *dict, size_t dictlen,
@@ -150,6 +151,8 @@ void dump_stack_set_arch_desc(const char
 void dump_stack_print_info(const char *log_lvl);
 void show_regs_print_info(const char *log_lvl);
 #else
+static inline void set_printk_time_clock(u64 (*fn)(void)) { }
+
 static inline __printf(1, 0)
 int vprintk(const char *s, va_list args)
 {
