1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/kernel.h>
20#include <linux/mm.h>
21#include <linux/tty.h>
22#include <linux/tty_driver.h>
23#include <linux/console.h>
24#include <linux/init.h>
25#include <linux/jiffies.h>
26#include <linux/nmi.h>
27#include <linux/module.h>
28#include <linux/moduleparam.h>
29#include <linux/delay.h>
30#include <linux/smp.h>
31#include <linux/security.h>
32#include <linux/bootmem.h>
33#include <linux/memblock.h>
34#include <linux/syscalls.h>
35#include <linux/kexec.h>
36#include <linux/kdb.h>
37#include <linux/ratelimit.h>
38#include <linux/kmsg_dump.h>
39#include <linux/syslog.h>
40#include <linux/cpu.h>
41#include <linux/notifier.h>
42#include <linux/rculist.h>
43#include <linux/poll.h>
44#include <linux/irq_work.h>
45#include <linux/utsname.h>
46#include <linux/ctype.h>
47#include <linux/uio.h>
48
49#include <asm/uaccess.h>
50#include <asm/sections.h>
51
52#define CREATE_TRACE_POINTS
53#include <trace/events/printk.h>
54
55#include "console_cmdline.h"
56#include "braille.h"
57#include "internal.h"
58
59int console_printk[4] = {
60 CONSOLE_LOGLEVEL_DEFAULT,
61 MESSAGE_LOGLEVEL_DEFAULT,
62 CONSOLE_LOGLEVEL_MIN,
63 CONSOLE_LOGLEVEL_DEFAULT,
64};
65
66
67
68
69
70int oops_in_progress;
71EXPORT_SYMBOL(oops_in_progress);
72
73
74
75
76
77
78static DEFINE_SEMAPHORE(console_sem);
79struct console *console_drivers;
80EXPORT_SYMBOL_GPL(console_drivers);
81
82#ifdef CONFIG_LOCKDEP
83static struct lockdep_map console_lock_dep_map = {
84 .name = "console_lock"
85};
86#endif
87
88enum devkmsg_log_bits {
89 __DEVKMSG_LOG_BIT_ON = 0,
90 __DEVKMSG_LOG_BIT_OFF,
91 __DEVKMSG_LOG_BIT_LOCK,
92};
93
94enum devkmsg_log_masks {
95 DEVKMSG_LOG_MASK_ON = BIT(__DEVKMSG_LOG_BIT_ON),
96 DEVKMSG_LOG_MASK_OFF = BIT(__DEVKMSG_LOG_BIT_OFF),
97 DEVKMSG_LOG_MASK_LOCK = BIT(__DEVKMSG_LOG_BIT_LOCK),
98};
99
100
101#define DEVKMSG_LOG_MASK_DEFAULT 0
102
103static unsigned int __read_mostly devkmsg_log = DEVKMSG_LOG_MASK_DEFAULT;
104
105static int __control_devkmsg(char *str)
106{
107 if (!str)
108 return -EINVAL;
109
110 if (!strncmp(str, "on", 2)) {
111 devkmsg_log = DEVKMSG_LOG_MASK_ON;
112 return 2;
113 } else if (!strncmp(str, "off", 3)) {
114 devkmsg_log = DEVKMSG_LOG_MASK_OFF;
115 return 3;
116 } else if (!strncmp(str, "ratelimit", 9)) {
117 devkmsg_log = DEVKMSG_LOG_MASK_DEFAULT;
118 return 9;
119 }
120 return -EINVAL;
121}
122
123static int __init control_devkmsg(char *str)
124{
125 if (__control_devkmsg(str) < 0)
126 return 1;
127
128
129
130
131 if (devkmsg_log == DEVKMSG_LOG_MASK_ON) {
132 memset(devkmsg_log_str, 0, DEVKMSG_STR_MAX_SIZE);
133 strncpy(devkmsg_log_str, "on", 2);
134 } else if (devkmsg_log == DEVKMSG_LOG_MASK_OFF) {
135 memset(devkmsg_log_str, 0, DEVKMSG_STR_MAX_SIZE);
136 strncpy(devkmsg_log_str, "off", 3);
137 }
138
139
140
141
142
143
144
145
146 devkmsg_log |= DEVKMSG_LOG_MASK_LOCK;
147
148 return 0;
149}
150__setup("printk.devkmsg=", control_devkmsg);
151
152char devkmsg_log_str[DEVKMSG_STR_MAX_SIZE] = "ratelimit";
153
154int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write,
155 void __user *buffer, size_t *lenp, loff_t *ppos)
156{
157 char old_str[DEVKMSG_STR_MAX_SIZE];
158 unsigned int old;
159 int err;
160
161 if (write) {
162 if (devkmsg_log & DEVKMSG_LOG_MASK_LOCK)
163 return -EINVAL;
164
165 old = devkmsg_log;
166 strncpy(old_str, devkmsg_log_str, DEVKMSG_STR_MAX_SIZE);
167 }
168
169 err = proc_dostring(table, write, buffer, lenp, ppos);
170 if (err)
171 return err;
172
173 if (write) {
174 err = __control_devkmsg(devkmsg_log_str);
175
176
177
178
179
180 if (err < 0 || (err + 1 != *lenp)) {
181
182
183 devkmsg_log = old;
184 strncpy(devkmsg_log_str, old_str, DEVKMSG_STR_MAX_SIZE);
185
186 return -EINVAL;
187 }
188 }
189
190 return 0;
191}
192
193
194
195
196
197
198
199
200
201
202
203static int nr_ext_console_drivers;
204
205
206
207
208
209#define down_console_sem() do { \
210 down(&console_sem);\
211 mutex_acquire(&console_lock_dep_map, 0, 0, _RET_IP_);\
212} while (0)
213
214static int __down_trylock_console_sem(unsigned long ip)
215{
216 if (down_trylock(&console_sem))
217 return 1;
218 mutex_acquire(&console_lock_dep_map, 0, 1, ip);
219 return 0;
220}
221#define down_trylock_console_sem() __down_trylock_console_sem(_RET_IP_)
222
223#define up_console_sem() do { \
224 mutex_release(&console_lock_dep_map, 1, _RET_IP_);\
225 up(&console_sem);\
226} while (0)
227
228
229
230
231
232
233
234
235
236static int console_locked, console_suspended;
237
238
239
240
241static struct console *exclusive_console;
242
243
244
245
246
247#define MAX_CMDLINECONSOLES 8
248
249static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
250
251static int selected_console = -1;
252static int preferred_console = -1;
253int console_set_on_cmdline;
254EXPORT_SYMBOL(console_set_on_cmdline);
255
256
257static int console_may_schedule;
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326enum log_flags {
327 LOG_NOCONS = 1,
328 LOG_NEWLINE = 2,
329 LOG_PREFIX = 4,
330 LOG_CONT = 8,
331};
332
333struct printk_log {
334 u64 ts_nsec;
335 u16 len;
336 u16 text_len;
337 u16 dict_len;
338 u8 facility;
339 u8 flags:5;
340 u8 level:3;
341}
342#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
343__packed __aligned(4)
344#endif
345;
346
347
348
349
350
351
352DEFINE_RAW_SPINLOCK(logbuf_lock);
353
354#ifdef CONFIG_PRINTK
355DECLARE_WAIT_QUEUE_HEAD(log_wait);
356
357static u64 syslog_seq;
358static u32 syslog_idx;
359static enum log_flags syslog_prev;
360static size_t syslog_partial;
361
362
363static u64 log_first_seq;
364static u32 log_first_idx;
365
366
367static u64 log_next_seq;
368static u32 log_next_idx;
369
370
371static u64 console_seq;
372static u32 console_idx;
373static enum log_flags console_prev;
374
375
376static u64 clear_seq;
377static u32 clear_idx;
378
379#define PREFIX_MAX 32
380#define LOG_LINE_MAX (1024 - PREFIX_MAX)
381
382#define LOG_LEVEL(v) ((v) & 0x07)
383#define LOG_FACILITY(v) ((v) >> 3 & 0xff)
384
385
386#define LOG_ALIGN __alignof__(struct printk_log)
387#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
388static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
389static char *log_buf = __log_buf;
390static u32 log_buf_len = __LOG_BUF_LEN;
391
392
393char *log_buf_addr_get(void)
394{
395 return log_buf;
396}
397
398
399u32 log_buf_len_get(void)
400{
401 return log_buf_len;
402}
403
404
405static char *log_text(const struct printk_log *msg)
406{
407 return (char *)msg + sizeof(struct printk_log);
408}
409
410
411static char *log_dict(const struct printk_log *msg)
412{
413 return (char *)msg + sizeof(struct printk_log) + msg->text_len;
414}
415
416
417static struct printk_log *log_from_idx(u32 idx)
418{
419 struct printk_log *msg = (struct printk_log *)(log_buf + idx);
420
421
422
423
424
425 if (!msg->len)
426 return (struct printk_log *)log_buf;
427 return msg;
428}
429
430
431static u32 log_next(u32 idx)
432{
433 struct printk_log *msg = (struct printk_log *)(log_buf + idx);
434
435
436
437
438
439
440
441 if (!msg->len) {
442 msg = (struct printk_log *)log_buf;
443 return msg->len;
444 }
445 return idx + msg->len;
446}
447
448
449
450
451
452
453
454
455
456
457static int logbuf_has_space(u32 msg_size, bool empty)
458{
459 u32 free;
460
461 if (log_next_idx > log_first_idx || empty)
462 free = max(log_buf_len - log_next_idx, log_first_idx);
463 else
464 free = log_first_idx - log_next_idx;
465
466
467
468
469
470 return free >= msg_size + sizeof(struct printk_log);
471}
472
473static int log_make_free_space(u32 msg_size)
474{
475 while (log_first_seq < log_next_seq &&
476 !logbuf_has_space(msg_size, false)) {
477
478 log_first_idx = log_next(log_first_idx);
479 log_first_seq++;
480 }
481
482 if (clear_seq < log_first_seq) {
483 clear_seq = log_first_seq;
484 clear_idx = log_first_idx;
485 }
486
487
488 if (logbuf_has_space(msg_size, log_first_seq == log_next_seq))
489 return 0;
490
491 return -ENOMEM;
492}
493
494
495static u32 msg_used_size(u16 text_len, u16 dict_len, u32 *pad_len)
496{
497 u32 size;
498
499 size = sizeof(struct printk_log) + text_len + dict_len;
500 *pad_len = (-size) & (LOG_ALIGN - 1);
501 size += *pad_len;
502
503 return size;
504}
505
506
507
508
509
510
511#define MAX_LOG_TAKE_PART 4
512static const char trunc_msg[] = "<truncated>";
513
514static u32 truncate_msg(u16 *text_len, u16 *trunc_msg_len,
515 u16 *dict_len, u32 *pad_len)
516{
517
518
519
520
521 u32 max_text_len = log_buf_len / MAX_LOG_TAKE_PART;
522 if (*text_len > max_text_len)
523 *text_len = max_text_len;
524
525 *trunc_msg_len = strlen(trunc_msg);
526
527 *dict_len = 0;
528
529 return msg_used_size(*text_len + *trunc_msg_len, 0, pad_len);
530}
531
532
533static int log_store(int facility, int level,
534 enum log_flags flags, u64 ts_nsec,
535 const char *dict, u16 dict_len,
536 const char *text, u16 text_len)
537{
538 struct printk_log *msg;
539 u32 size, pad_len;
540 u16 trunc_msg_len = 0;
541
542
543 size = msg_used_size(text_len, dict_len, &pad_len);
544
545 if (log_make_free_space(size)) {
546
547 size = truncate_msg(&text_len, &trunc_msg_len,
548 &dict_len, &pad_len);
549
550 if (log_make_free_space(size))
551 return 0;
552 }
553
554 if (log_next_idx + size + sizeof(struct printk_log) > log_buf_len) {
555
556
557
558
559
560 memset(log_buf + log_next_idx, 0, sizeof(struct printk_log));
561 log_next_idx = 0;
562 }
563
564
565 msg = (struct printk_log *)(log_buf + log_next_idx);
566 memcpy(log_text(msg), text, text_len);
567 msg->text_len = text_len;
568 if (trunc_msg_len) {
569 memcpy(log_text(msg) + text_len, trunc_msg, trunc_msg_len);
570 msg->text_len += trunc_msg_len;
571 }
572 memcpy(log_dict(msg), dict, dict_len);
573 msg->dict_len = dict_len;
574 msg->facility = facility;
575 msg->level = level & 7;
576 msg->flags = flags & 0x1f;
577 if (ts_nsec > 0)
578 msg->ts_nsec = ts_nsec;
579 else
580 msg->ts_nsec = local_clock();
581 memset(log_dict(msg) + dict_len, 0, pad_len);
582 msg->len = size;
583
584
585 log_next_idx += msg->len;
586 log_next_seq++;
587
588 return msg->text_len;
589}
590
591int dmesg_restrict = IS_ENABLED(CONFIG_SECURITY_DMESG_RESTRICT);
592
593static int syslog_action_restricted(int type)
594{
595 if (dmesg_restrict)
596 return 1;
597
598
599
600
601 return type != SYSLOG_ACTION_READ_ALL &&
602 type != SYSLOG_ACTION_SIZE_BUFFER;
603}
604
605int check_syslog_permissions(int type, int source)
606{
607
608
609
610
611 if (source == SYSLOG_FROM_PROC && type != SYSLOG_ACTION_OPEN)
612 goto ok;
613
614 if (syslog_action_restricted(type)) {
615 if (capable(CAP_SYSLOG))
616 goto ok;
617
618
619
620
621 if (capable(CAP_SYS_ADMIN)) {
622 pr_warn_once("%s (%d): Attempt to access syslog with "
623 "CAP_SYS_ADMIN but no CAP_SYSLOG "
624 "(deprecated).\n",
625 current->comm, task_pid_nr(current));
626 goto ok;
627 }
628 return -EPERM;
629 }
630ok:
631 return security_syslog(type);
632}
633EXPORT_SYMBOL_GPL(check_syslog_permissions);
634
635static void append_char(char **pp, char *e, char c)
636{
637 if (*pp < e)
638 *(*pp)++ = c;
639}
640
641static ssize_t msg_print_ext_header(char *buf, size_t size,
642 struct printk_log *msg, u64 seq,
643 enum log_flags prev_flags)
644{
645 u64 ts_usec = msg->ts_nsec;
646 char cont = '-';
647
648 do_div(ts_usec, 1000);
649
650
651
652
653
654
655
656
657
658 if (msg->flags & LOG_CONT && !(prev_flags & LOG_CONT))
659 cont = 'c';
660 else if ((msg->flags & LOG_CONT) ||
661 ((prev_flags & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
662 cont = '+';
663
664 return scnprintf(buf, size, "%u,%llu,%llu,%c;",
665 (msg->facility << 3) | msg->level, seq, ts_usec, cont);
666}
667
668static ssize_t msg_print_ext_body(char *buf, size_t size,
669 char *dict, size_t dict_len,
670 char *text, size_t text_len)
671{
672 char *p = buf, *e = buf + size;
673 size_t i;
674
675
676 for (i = 0; i < text_len; i++) {
677 unsigned char c = text[i];
678
679 if (c < ' ' || c >= 127 || c == '\\')
680 p += scnprintf(p, e - p, "\\x%02x", c);
681 else
682 append_char(&p, e, c);
683 }
684 append_char(&p, e, '\n');
685
686 if (dict_len) {
687 bool line = true;
688
689 for (i = 0; i < dict_len; i++) {
690 unsigned char c = dict[i];
691
692 if (line) {
693 append_char(&p, e, ' ');
694 line = false;
695 }
696
697 if (c == '\0') {
698 append_char(&p, e, '\n');
699 line = true;
700 continue;
701 }
702
703 if (c < ' ' || c >= 127 || c == '\\') {
704 p += scnprintf(p, e - p, "\\x%02x", c);
705 continue;
706 }
707
708 append_char(&p, e, c);
709 }
710 append_char(&p, e, '\n');
711 }
712
713 return p - buf;
714}
715
716
717struct devkmsg_user {
718 u64 seq;
719 u32 idx;
720 enum log_flags prev;
721 struct ratelimit_state rs;
722 struct mutex lock;
723 char buf[CONSOLE_EXT_LOG_MAX];
724};
725
726static ssize_t devkmsg_write(struct kiocb *iocb, struct iov_iter *from)
727{
728 char *buf, *line;
729 int level = default_message_loglevel;
730 int facility = 1;
731 struct file *file = iocb->ki_filp;
732 struct devkmsg_user *user = file->private_data;
733 size_t len = iov_iter_count(from);
734 ssize_t ret = len;
735
736 if (!user || len > LOG_LINE_MAX)
737 return -EINVAL;
738
739
740 if (devkmsg_log & DEVKMSG_LOG_MASK_OFF)
741 return len;
742
743
744 if (!(devkmsg_log & DEVKMSG_LOG_MASK_ON)) {
745 if (!___ratelimit(&user->rs, current->comm))
746 return ret;
747 }
748
749 buf = kmalloc(len+1, GFP_KERNEL);
750 if (buf == NULL)
751 return -ENOMEM;
752
753 buf[len] = '\0';
754 if (copy_from_iter(buf, len, from) != len) {
755 kfree(buf);
756 return -EFAULT;
757 }
758
759
760
761
762
763
764
765
766
767
768 line = buf;
769 if (line[0] == '<') {
770 char *endp = NULL;
771 unsigned int u;
772
773 u = simple_strtoul(line + 1, &endp, 10);
774 if (endp && endp[0] == '>') {
775 level = LOG_LEVEL(u);
776 if (LOG_FACILITY(u) != 0)
777 facility = LOG_FACILITY(u);
778 endp++;
779 len -= endp - line;
780 line = endp;
781 }
782 }
783
784 printk_emit(facility, level, NULL, 0, "%s", line);
785 kfree(buf);
786 return ret;
787}
788
789static ssize_t devkmsg_read(struct file *file, char __user *buf,
790 size_t count, loff_t *ppos)
791{
792 struct devkmsg_user *user = file->private_data;
793 struct printk_log *msg;
794 size_t len;
795 ssize_t ret;
796
797 if (!user)
798 return -EBADF;
799
800 ret = mutex_lock_interruptible(&user->lock);
801 if (ret)
802 return ret;
803 raw_spin_lock_irq(&logbuf_lock);
804 while (user->seq == log_next_seq) {
805 if (file->f_flags & O_NONBLOCK) {
806 ret = -EAGAIN;
807 raw_spin_unlock_irq(&logbuf_lock);
808 goto out;
809 }
810
811 raw_spin_unlock_irq(&logbuf_lock);
812 ret = wait_event_interruptible(log_wait,
813 user->seq != log_next_seq);
814 if (ret)
815 goto out;
816 raw_spin_lock_irq(&logbuf_lock);
817 }
818
819 if (user->seq < log_first_seq) {
820
821 user->idx = log_first_idx;
822 user->seq = log_first_seq;
823 ret = -EPIPE;
824 raw_spin_unlock_irq(&logbuf_lock);
825 goto out;
826 }
827
828 msg = log_from_idx(user->idx);
829 len = msg_print_ext_header(user->buf, sizeof(user->buf),
830 msg, user->seq, user->prev);
831 len += msg_print_ext_body(user->buf + len, sizeof(user->buf) - len,
832 log_dict(msg), msg->dict_len,
833 log_text(msg), msg->text_len);
834
835 user->prev = msg->flags;
836 user->idx = log_next(user->idx);
837 user->seq++;
838 raw_spin_unlock_irq(&logbuf_lock);
839
840 if (len > count) {
841 ret = -EINVAL;
842 goto out;
843 }
844
845 if (copy_to_user(buf, user->buf, len)) {
846 ret = -EFAULT;
847 goto out;
848 }
849 ret = len;
850out:
851 mutex_unlock(&user->lock);
852 return ret;
853}
854
855static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
856{
857 struct devkmsg_user *user = file->private_data;
858 loff_t ret = 0;
859
860 if (!user)
861 return -EBADF;
862 if (offset)
863 return -ESPIPE;
864
865 raw_spin_lock_irq(&logbuf_lock);
866 switch (whence) {
867 case SEEK_SET:
868
869 user->idx = log_first_idx;
870 user->seq = log_first_seq;
871 break;
872 case SEEK_DATA:
873
874
875
876
877
878 user->idx = clear_idx;
879 user->seq = clear_seq;
880 break;
881 case SEEK_END:
882
883 user->idx = log_next_idx;
884 user->seq = log_next_seq;
885 break;
886 default:
887 ret = -EINVAL;
888 }
889 raw_spin_unlock_irq(&logbuf_lock);
890 return ret;
891}
892
893static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
894{
895 struct devkmsg_user *user = file->private_data;
896 int ret = 0;
897
898 if (!user)
899 return POLLERR|POLLNVAL;
900
901 poll_wait(file, &log_wait, wait);
902
903 raw_spin_lock_irq(&logbuf_lock);
904 if (user->seq < log_next_seq) {
905
906 if (user->seq < log_first_seq)
907 ret = POLLIN|POLLRDNORM|POLLERR|POLLPRI;
908 else
909 ret = POLLIN|POLLRDNORM;
910 }
911 raw_spin_unlock_irq(&logbuf_lock);
912
913 return ret;
914}
915
916static int devkmsg_open(struct inode *inode, struct file *file)
917{
918 struct devkmsg_user *user;
919 int err;
920
921 if (devkmsg_log & DEVKMSG_LOG_MASK_OFF)
922 return -EPERM;
923
924
925 if ((file->f_flags & O_ACCMODE) != O_WRONLY) {
926 err = check_syslog_permissions(SYSLOG_ACTION_READ_ALL,
927 SYSLOG_FROM_READER);
928 if (err)
929 return err;
930 }
931
932 user = kmalloc(sizeof(struct devkmsg_user), GFP_KERNEL);
933 if (!user)
934 return -ENOMEM;
935
936 ratelimit_default_init(&user->rs);
937 ratelimit_set_flags(&user->rs, RATELIMIT_MSG_ON_RELEASE);
938
939 mutex_init(&user->lock);
940
941 raw_spin_lock_irq(&logbuf_lock);
942 user->idx = log_first_idx;
943 user->seq = log_first_seq;
944 raw_spin_unlock_irq(&logbuf_lock);
945
946 file->private_data = user;
947 return 0;
948}
949
950static int devkmsg_release(struct inode *inode, struct file *file)
951{
952 struct devkmsg_user *user = file->private_data;
953
954 if (!user)
955 return 0;
956
957 ratelimit_state_exit(&user->rs);
958
959 mutex_destroy(&user->lock);
960 kfree(user);
961 return 0;
962}
963
964const struct file_operations kmsg_fops = {
965 .open = devkmsg_open,
966 .read = devkmsg_read,
967 .write_iter = devkmsg_write,
968 .llseek = devkmsg_llseek,
969 .poll = devkmsg_poll,
970 .release = devkmsg_release,
971};
972
973#ifdef CONFIG_KEXEC_CORE
974
975
976
977
978
979
980
981
982void log_buf_kexec_setup(void)
983{
984 VMCOREINFO_SYMBOL(log_buf);
985 VMCOREINFO_SYMBOL(log_buf_len);
986 VMCOREINFO_SYMBOL(log_first_idx);
987 VMCOREINFO_SYMBOL(clear_idx);
988 VMCOREINFO_SYMBOL(log_next_idx);
989
990
991
992
993 VMCOREINFO_STRUCT_SIZE(printk_log);
994 VMCOREINFO_OFFSET(printk_log, ts_nsec);
995 VMCOREINFO_OFFSET(printk_log, len);
996 VMCOREINFO_OFFSET(printk_log, text_len);
997 VMCOREINFO_OFFSET(printk_log, dict_len);
998}
999#endif
1000
1001
1002static unsigned long __initdata new_log_buf_len;
1003
1004
1005static void __init log_buf_len_update(unsigned size)
1006{
1007 if (size)
1008 size = roundup_pow_of_two(size);
1009 if (size > log_buf_len)
1010 new_log_buf_len = size;
1011}
1012
1013
1014static int __init log_buf_len_setup(char *str)
1015{
1016 unsigned size = memparse(str, &str);
1017
1018 log_buf_len_update(size);
1019
1020 return 0;
1021}
1022early_param("log_buf_len", log_buf_len_setup);
1023
1024#ifdef CONFIG_SMP
1025#define __LOG_CPU_MAX_BUF_LEN (1 << CONFIG_LOG_CPU_MAX_BUF_SHIFT)
1026
1027static void __init log_buf_add_cpu(void)
1028{
1029 unsigned int cpu_extra;
1030
1031
1032
1033
1034
1035
1036 if (num_possible_cpus() == 1)
1037 return;
1038
1039 cpu_extra = (num_possible_cpus() - 1) * __LOG_CPU_MAX_BUF_LEN;
1040
1041
1042 if (cpu_extra <= __LOG_BUF_LEN / 2)
1043 return;
1044
1045 pr_info("log_buf_len individual max cpu contribution: %d bytes\n",
1046 __LOG_CPU_MAX_BUF_LEN);
1047 pr_info("log_buf_len total cpu_extra contributions: %d bytes\n",
1048 cpu_extra);
1049 pr_info("log_buf_len min size: %d bytes\n", __LOG_BUF_LEN);
1050
1051 log_buf_len_update(cpu_extra + __LOG_BUF_LEN);
1052}
1053#else
1054static inline void log_buf_add_cpu(void) {}
1055#endif
1056
1057void __init setup_log_buf(int early)
1058{
1059 unsigned long flags;
1060 char *new_log_buf;
1061 int free;
1062
1063 if (log_buf != __log_buf)
1064 return;
1065
1066 if (!early && !new_log_buf_len)
1067 log_buf_add_cpu();
1068
1069 if (!new_log_buf_len)
1070 return;
1071
1072 if (early) {
1073 new_log_buf =
1074 memblock_virt_alloc(new_log_buf_len, LOG_ALIGN);
1075 } else {
1076 new_log_buf = memblock_virt_alloc_nopanic(new_log_buf_len,
1077 LOG_ALIGN);
1078 }
1079
1080 if (unlikely(!new_log_buf)) {
1081 pr_err("log_buf_len: %ld bytes not available\n",
1082 new_log_buf_len);
1083 return;
1084 }
1085
1086 raw_spin_lock_irqsave(&logbuf_lock, flags);
1087 log_buf_len = new_log_buf_len;
1088 log_buf = new_log_buf;
1089 new_log_buf_len = 0;
1090 free = __LOG_BUF_LEN - log_next_idx;
1091 memcpy(log_buf, __log_buf, __LOG_BUF_LEN);
1092 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
1093
1094 pr_info("log_buf_len: %d bytes\n", log_buf_len);
1095 pr_info("early log buf free: %d(%d%%)\n",
1096 free, (free * 100) / __LOG_BUF_LEN);
1097}
1098
1099static bool __read_mostly ignore_loglevel;
1100
1101static int __init ignore_loglevel_setup(char *str)
1102{
1103 ignore_loglevel = true;
1104 pr_info("debug: ignoring loglevel setting.\n");
1105
1106 return 0;
1107}
1108
1109early_param("ignore_loglevel", ignore_loglevel_setup);
1110module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
1111MODULE_PARM_DESC(ignore_loglevel,
1112 "ignore loglevel setting (prints all kernel messages to the console)");
1113
1114static bool suppress_message_printing(int level)
1115{
1116 return (level >= console_loglevel && !ignore_loglevel);
1117}
1118
1119#ifdef CONFIG_BOOT_PRINTK_DELAY
1120
1121static int boot_delay;
1122static unsigned long long loops_per_msec;
1123
1124static int __init boot_delay_setup(char *str)
1125{
1126 unsigned long lpj;
1127
1128 lpj = preset_lpj ? preset_lpj : 1000000;
1129 loops_per_msec = (unsigned long long)lpj / 1000 * HZ;
1130
1131 get_option(&str, &boot_delay);
1132 if (boot_delay > 10 * 1000)
1133 boot_delay = 0;
1134
1135 pr_debug("boot_delay: %u, preset_lpj: %ld, lpj: %lu, "
1136 "HZ: %d, loops_per_msec: %llu\n",
1137 boot_delay, preset_lpj, lpj, HZ, loops_per_msec);
1138 return 0;
1139}
1140early_param("boot_delay", boot_delay_setup);
1141
1142static void boot_delay_msec(int level)
1143{
1144 unsigned long long k;
1145 unsigned long timeout;
1146
1147 if ((boot_delay == 0 || system_state != SYSTEM_BOOTING)
1148 || suppress_message_printing(level)) {
1149 return;
1150 }
1151
1152 k = (unsigned long long)loops_per_msec * boot_delay;
1153
1154 timeout = jiffies + msecs_to_jiffies(boot_delay);
1155 while (k) {
1156 k--;
1157 cpu_relax();
1158
1159
1160
1161
1162
1163 if (time_after(jiffies, timeout))
1164 break;
1165 touch_nmi_watchdog();
1166 }
1167}
1168#else
1169static inline void boot_delay_msec(int level)
1170{
1171}
1172#endif
1173
1174static bool printk_time = IS_ENABLED(CONFIG_PRINTK_TIME);
1175module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
1176
1177static size_t print_time(u64 ts, char *buf)
1178{
1179 unsigned long rem_nsec;
1180
1181 if (!printk_time)
1182 return 0;
1183
1184 rem_nsec = do_div(ts, 1000000000);
1185
1186 if (!buf)
1187 return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
1188
1189 return sprintf(buf, "[%5lu.%06lu] ",
1190 (unsigned long)ts, rem_nsec / 1000);
1191}
1192
1193static size_t print_prefix(const struct printk_log *msg, bool syslog, char *buf)
1194{
1195 size_t len = 0;
1196 unsigned int prefix = (msg->facility << 3) | msg->level;
1197
1198 if (syslog) {
1199 if (buf) {
1200 len += sprintf(buf, "<%u>", prefix);
1201 } else {
1202 len += 3;
1203 if (prefix > 999)
1204 len += 3;
1205 else if (prefix > 99)
1206 len += 2;
1207 else if (prefix > 9)
1208 len++;
1209 }
1210 }
1211
1212 len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
1213 return len;
1214}
1215
1216static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
1217 bool syslog, char *buf, size_t size)
1218{
1219 const char *text = log_text(msg);
1220 size_t text_size = msg->text_len;
1221 bool prefix = true;
1222 bool newline = true;
1223 size_t len = 0;
1224
1225 if ((prev & LOG_CONT) && !(msg->flags & LOG_PREFIX))
1226 prefix = false;
1227
1228 if (msg->flags & LOG_CONT) {
1229 if ((prev & LOG_CONT) && !(prev & LOG_NEWLINE))
1230 prefix = false;
1231
1232 if (!(msg->flags & LOG_NEWLINE))
1233 newline = false;
1234 }
1235
1236 do {
1237 const char *next = memchr(text, '\n', text_size);
1238 size_t text_len;
1239
1240 if (next) {
1241 text_len = next - text;
1242 next++;
1243 text_size -= next - text;
1244 } else {
1245 text_len = text_size;
1246 }
1247
1248 if (buf) {
1249 if (print_prefix(msg, syslog, NULL) +
1250 text_len + 1 >= size - len)
1251 break;
1252
1253 if (prefix)
1254 len += print_prefix(msg, syslog, buf + len);
1255 memcpy(buf + len, text, text_len);
1256 len += text_len;
1257 if (next || newline)
1258 buf[len++] = '\n';
1259 } else {
1260
1261 if (prefix)
1262 len += print_prefix(msg, syslog, NULL);
1263 len += text_len;
1264 if (next || newline)
1265 len++;
1266 }
1267
1268 prefix = true;
1269 text = next;
1270 } while (text);
1271
1272 return len;
1273}
1274
1275static int syslog_print(char __user *buf, int size)
1276{
1277 char *text;
1278 struct printk_log *msg;
1279 int len = 0;
1280
1281 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
1282 if (!text)
1283 return -ENOMEM;
1284
1285 while (size > 0) {
1286 size_t n;
1287 size_t skip;
1288
1289 raw_spin_lock_irq(&logbuf_lock);
1290 if (syslog_seq < log_first_seq) {
1291
1292 syslog_seq = log_first_seq;
1293 syslog_idx = log_first_idx;
1294 syslog_prev = 0;
1295 syslog_partial = 0;
1296 }
1297 if (syslog_seq == log_next_seq) {
1298 raw_spin_unlock_irq(&logbuf_lock);
1299 break;
1300 }
1301
1302 skip = syslog_partial;
1303 msg = log_from_idx(syslog_idx);
1304 n = msg_print_text(msg, syslog_prev, true, text,
1305 LOG_LINE_MAX + PREFIX_MAX);
1306 if (n - syslog_partial <= size) {
1307
1308 syslog_idx = log_next(syslog_idx);
1309 syslog_seq++;
1310 syslog_prev = msg->flags;
1311 n -= syslog_partial;
1312 syslog_partial = 0;
1313 } else if (!len){
1314
1315 n = size;
1316 syslog_partial += n;
1317 } else
1318 n = 0;
1319 raw_spin_unlock_irq(&logbuf_lock);
1320
1321 if (!n)
1322 break;
1323
1324 if (copy_to_user(buf, text + skip, n)) {
1325 if (!len)
1326 len = -EFAULT;
1327 break;
1328 }
1329
1330 len += n;
1331 size -= n;
1332 buf += n;
1333 }
1334
1335 kfree(text);
1336 return len;
1337}
1338
1339static int syslog_print_all(char __user *buf, int size, bool clear)
1340{
1341 char *text;
1342 int len = 0;
1343
1344 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
1345 if (!text)
1346 return -ENOMEM;
1347
1348 raw_spin_lock_irq(&logbuf_lock);
1349 if (buf) {
1350 u64 next_seq;
1351 u64 seq;
1352 u32 idx;
1353 enum log_flags prev;
1354
1355
1356
1357
1358
1359 seq = clear_seq;
1360 idx = clear_idx;
1361 prev = 0;
1362 while (seq < log_next_seq) {
1363 struct printk_log *msg = log_from_idx(idx);
1364
1365 len += msg_print_text(msg, prev, true, NULL, 0);
1366 prev = msg->flags;
1367 idx = log_next(idx);
1368 seq++;
1369 }
1370
1371
1372 seq = clear_seq;
1373 idx = clear_idx;
1374 prev = 0;
1375 while (len > size && seq < log_next_seq) {
1376 struct printk_log *msg = log_from_idx(idx);
1377
1378 len -= msg_print_text(msg, prev, true, NULL, 0);
1379 prev = msg->flags;
1380 idx = log_next(idx);
1381 seq++;
1382 }
1383
1384
1385 next_seq = log_next_seq;
1386
1387 len = 0;
1388 while (len >= 0 && seq < next_seq) {
1389 struct printk_log *msg = log_from_idx(idx);
1390 int textlen;
1391
1392 textlen = msg_print_text(msg, prev, true, text,
1393 LOG_LINE_MAX + PREFIX_MAX);
1394 if (textlen < 0) {
1395 len = textlen;
1396 break;
1397 }
1398 idx = log_next(idx);
1399 seq++;
1400 prev = msg->flags;
1401
1402 raw_spin_unlock_irq(&logbuf_lock);
1403 if (copy_to_user(buf + len, text, textlen))
1404 len = -EFAULT;
1405 else
1406 len += textlen;
1407 raw_spin_lock_irq(&logbuf_lock);
1408
1409 if (seq < log_first_seq) {
1410
1411 seq = log_first_seq;
1412 idx = log_first_idx;
1413 prev = 0;
1414 }
1415 }
1416 }
1417
1418 if (clear) {
1419 clear_seq = log_next_seq;
1420 clear_idx = log_next_idx;
1421 }
1422 raw_spin_unlock_irq(&logbuf_lock);
1423
1424 kfree(text);
1425 return len;
1426}
1427
1428int do_syslog(int type, char __user *buf, int len, int source)
1429{
1430 bool clear = false;
1431 static int saved_console_loglevel = LOGLEVEL_DEFAULT;
1432 int error;
1433
1434 error = check_syslog_permissions(type, source);
1435 if (error)
1436 goto out;
1437
1438 switch (type) {
1439 case SYSLOG_ACTION_CLOSE:
1440 break;
1441 case SYSLOG_ACTION_OPEN:
1442 break;
1443 case SYSLOG_ACTION_READ:
1444 error = -EINVAL;
1445 if (!buf || len < 0)
1446 goto out;
1447 error = 0;
1448 if (!len)
1449 goto out;
1450 if (!access_ok(VERIFY_WRITE, buf, len)) {
1451 error = -EFAULT;
1452 goto out;
1453 }
1454 error = wait_event_interruptible(log_wait,
1455 syslog_seq != log_next_seq);
1456 if (error)
1457 goto out;
1458 error = syslog_print(buf, len);
1459 break;
1460
1461 case SYSLOG_ACTION_READ_CLEAR:
1462 clear = true;
1463
1464
1465 case SYSLOG_ACTION_READ_ALL:
1466 error = -EINVAL;
1467 if (!buf || len < 0)
1468 goto out;
1469 error = 0;
1470 if (!len)
1471 goto out;
1472 if (!access_ok(VERIFY_WRITE, buf, len)) {
1473 error = -EFAULT;
1474 goto out;
1475 }
1476 error = syslog_print_all(buf, len, clear);
1477 break;
1478
1479 case SYSLOG_ACTION_CLEAR:
1480 syslog_print_all(NULL, 0, true);
1481 break;
1482
1483 case SYSLOG_ACTION_CONSOLE_OFF:
1484 if (saved_console_loglevel == LOGLEVEL_DEFAULT)
1485 saved_console_loglevel = console_loglevel;
1486 console_loglevel = minimum_console_loglevel;
1487 break;
1488
1489 case SYSLOG_ACTION_CONSOLE_ON:
1490 if (saved_console_loglevel != LOGLEVEL_DEFAULT) {
1491 console_loglevel = saved_console_loglevel;
1492 saved_console_loglevel = LOGLEVEL_DEFAULT;
1493 }
1494 break;
1495
1496 case SYSLOG_ACTION_CONSOLE_LEVEL:
1497 error = -EINVAL;
1498 if (len < 1 || len > 8)
1499 goto out;
1500 if (len < minimum_console_loglevel)
1501 len = minimum_console_loglevel;
1502 console_loglevel = len;
1503
1504 saved_console_loglevel = LOGLEVEL_DEFAULT;
1505 error = 0;
1506 break;
1507
1508 case SYSLOG_ACTION_SIZE_UNREAD:
1509 raw_spin_lock_irq(&logbuf_lock);
1510 if (syslog_seq < log_first_seq) {
1511
1512 syslog_seq = log_first_seq;
1513 syslog_idx = log_first_idx;
1514 syslog_prev = 0;
1515 syslog_partial = 0;
1516 }
1517 if (source == SYSLOG_FROM_PROC) {
1518
1519
1520
1521
1522
1523 error = log_next_seq - syslog_seq;
1524 } else {
1525 u64 seq = syslog_seq;
1526 u32 idx = syslog_idx;
1527 enum log_flags prev = syslog_prev;
1528
1529 error = 0;
1530 while (seq < log_next_seq) {
1531 struct printk_log *msg = log_from_idx(idx);
1532
1533 error += msg_print_text(msg, prev, true, NULL, 0);
1534 idx = log_next(idx);
1535 seq++;
1536 prev = msg->flags;
1537 }
1538 error -= syslog_partial;
1539 }
1540 raw_spin_unlock_irq(&logbuf_lock);
1541 break;
1542
1543 case SYSLOG_ACTION_SIZE_BUFFER:
1544 error = log_buf_len;
1545 break;
1546 default:
1547 error = -EINVAL;
1548 break;
1549 }
1550out:
1551 return error;
1552}
1553
1554SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
1555{
1556 return do_syslog(type, buf, len, SYSLOG_FROM_READER);
1557}
1558
1559
1560
1561
1562
1563
1564static void call_console_drivers(int level,
1565 const char *ext_text, size_t ext_len,
1566 const char *text, size_t len)
1567{
1568 struct console *con;
1569
1570 trace_console(text, len);
1571
1572 if (!console_drivers)
1573 return;
1574
1575 for_each_console(con) {
1576 if (exclusive_console && con != exclusive_console)
1577 continue;
1578 if (!(con->flags & CON_ENABLED))
1579 continue;
1580 if (!con->write)
1581 continue;
1582 if (!cpu_online(smp_processor_id()) &&
1583 !(con->flags & CON_ANYTIME))
1584 continue;
1585 if (con->flags & CON_EXTENDED)
1586 con->write(con, ext_text, ext_len);
1587 else
1588 con->write(con, text, len);
1589 }
1590}
1591
1592
1593
1594
1595
1596
1597static void zap_locks(void)
1598{
1599 static unsigned long oops_timestamp;
1600
1601 if (time_after_eq(jiffies, oops_timestamp) &&
1602 !time_after(jiffies, oops_timestamp + 30 * HZ))
1603 return;
1604
1605 oops_timestamp = jiffies;
1606
1607 debug_locks_off();
1608
1609 raw_spin_lock_init(&logbuf_lock);
1610
1611 sema_init(&console_sem, 1);
1612}
1613
1614int printk_delay_msec __read_mostly;
1615
1616static inline void printk_delay(void)
1617{
1618 if (unlikely(printk_delay_msec)) {
1619 int m = printk_delay_msec;
1620
1621 while (m--) {
1622 mdelay(1);
1623 touch_nmi_watchdog();
1624 }
1625 }
1626}
1627
1628
1629
1630
1631
1632
1633
1634static struct cont {
1635 char buf[LOG_LINE_MAX];
1636 size_t len;
1637 size_t cons;
1638 struct task_struct *owner;
1639 u64 ts_nsec;
1640 u8 level;
1641 u8 facility;
1642 enum log_flags flags;
1643 bool flushed:1;
1644} cont;
1645
1646static void cont_flush(enum log_flags flags)
1647{
1648 if (cont.flushed)
1649 return;
1650 if (cont.len == 0)
1651 return;
1652
1653 if (cont.cons) {
1654
1655
1656
1657
1658
1659 log_store(cont.facility, cont.level, flags | LOG_NOCONS,
1660 cont.ts_nsec, NULL, 0, cont.buf, cont.len);
1661 cont.flags = flags;
1662 cont.flushed = true;
1663 } else {
1664
1665
1666
1667
1668 log_store(cont.facility, cont.level, flags, 0,
1669 NULL, 0, cont.buf, cont.len);
1670 cont.len = 0;
1671 }
1672}
1673
1674static bool cont_add(int facility, int level, const char *text, size_t len)
1675{
1676 if (cont.len && cont.flushed)
1677 return false;
1678
1679
1680
1681
1682
1683
1684 if (nr_ext_console_drivers || cont.len + len > sizeof(cont.buf)) {
1685 cont_flush(LOG_CONT);
1686 return false;
1687 }
1688
1689 if (!cont.len) {
1690 cont.facility = facility;
1691 cont.level = level;
1692 cont.owner = current;
1693 cont.ts_nsec = local_clock();
1694 cont.flags = 0;
1695 cont.cons = 0;
1696 cont.flushed = false;
1697 }
1698
1699 memcpy(cont.buf + cont.len, text, len);
1700 cont.len += len;
1701
1702 if (cont.len > (sizeof(cont.buf) * 80) / 100)
1703 cont_flush(LOG_CONT);
1704
1705 return true;
1706}
1707
1708static size_t cont_print_text(char *text, size_t size)
1709{
1710 size_t textlen = 0;
1711 size_t len;
1712
1713 if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) {
1714 textlen += print_time(cont.ts_nsec, text);
1715 size -= textlen;
1716 }
1717
1718 len = cont.len - cont.cons;
1719 if (len > 0) {
1720 if (len+1 > size)
1721 len = size-1;
1722 memcpy(text + textlen, cont.buf + cont.cons, len);
1723 textlen += len;
1724 cont.cons = cont.len;
1725 }
1726
1727 if (cont.flushed) {
1728 if (cont.flags & LOG_NEWLINE)
1729 text[textlen++] = '\n';
1730
1731 cont.len = 0;
1732 }
1733 return textlen;
1734}
1735
1736asmlinkage int vprintk_emit(int facility, int level,
1737 const char *dict, size_t dictlen,
1738 const char *fmt, va_list args)
1739{
1740 static bool recursion_bug;
1741 static char textbuf[LOG_LINE_MAX];
1742 char *text = textbuf;
1743 size_t text_len = 0;
1744 enum log_flags lflags = 0;
1745 unsigned long flags;
1746 int this_cpu;
1747 int printed_len = 0;
1748 int nmi_message_lost;
1749 bool in_sched = false;
1750
1751 static unsigned int logbuf_cpu = UINT_MAX;
1752
1753 if (level == LOGLEVEL_SCHED) {
1754 level = LOGLEVEL_DEFAULT;
1755 in_sched = true;
1756 }
1757
1758 boot_delay_msec(level);
1759 printk_delay();
1760
1761 local_irq_save(flags);
1762 this_cpu = smp_processor_id();
1763
1764
1765
1766
1767 if (unlikely(logbuf_cpu == this_cpu)) {
1768
1769
1770
1771
1772
1773
1774
1775 if (!oops_in_progress && !lockdep_recursing(current)) {
1776 recursion_bug = true;
1777 local_irq_restore(flags);
1778 return 0;
1779 }
1780 zap_locks();
1781 }
1782
1783 lockdep_off();
1784
1785 raw_spin_lock(&logbuf_lock);
1786 logbuf_cpu = this_cpu;
1787
1788 if (unlikely(recursion_bug)) {
1789 static const char recursion_msg[] =
1790 "BUG: recent printk recursion!";
1791
1792 recursion_bug = false;
1793
1794 printed_len += log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
1795 NULL, 0, recursion_msg,
1796 strlen(recursion_msg));
1797 }
1798
1799 nmi_message_lost = get_nmi_message_lost();
1800 if (unlikely(nmi_message_lost)) {
1801 text_len = scnprintf(textbuf, sizeof(textbuf),
1802 "BAD LUCK: lost %d message(s) from NMI context!",
1803 nmi_message_lost);
1804 printed_len += log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
1805 NULL, 0, textbuf, text_len);
1806 }
1807
1808
1809
1810
1811
1812 text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
1813
1814
1815 if (text_len && text[text_len-1] == '\n') {
1816 text_len--;
1817 lflags |= LOG_NEWLINE;
1818 }
1819
1820
1821 if (facility == 0) {
1822 int kern_level = printk_get_level(text);
1823
1824 if (kern_level) {
1825 const char *end_of_header = printk_skip_level(text);
1826 switch (kern_level) {
1827 case '0' ... '7':
1828 if (level == LOGLEVEL_DEFAULT)
1829 level = kern_level - '0';
1830
1831 case 'd':
1832 lflags |= LOG_PREFIX;
1833 }
1834
1835
1836
1837
1838
1839 text_len -= end_of_header - text;
1840 text = (char *)end_of_header;
1841 }
1842 }
1843
1844 if (level == LOGLEVEL_DEFAULT)
1845 level = default_message_loglevel;
1846
1847 if (dict)
1848 lflags |= LOG_PREFIX|LOG_NEWLINE;
1849
1850 if (!(lflags & LOG_NEWLINE)) {
1851
1852
1853
1854
1855 if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
1856 cont_flush(LOG_NEWLINE);
1857
1858
1859 if (cont_add(facility, level, text, text_len))
1860 printed_len += text_len;
1861 else
1862 printed_len += log_store(facility, level,
1863 lflags | LOG_CONT, 0,
1864 dict, dictlen, text, text_len);
1865 } else {
1866 bool stored = false;
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876 if (cont.len) {
1877 if (cont.owner == current && !(lflags & LOG_PREFIX))
1878 stored = cont_add(facility, level, text,
1879 text_len);
1880 cont_flush(LOG_NEWLINE);
1881 }
1882
1883 if (stored)
1884 printed_len += text_len;
1885 else
1886 printed_len += log_store(facility, level, lflags, 0,
1887 dict, dictlen, text, text_len);
1888 }
1889
1890 logbuf_cpu = UINT_MAX;
1891 raw_spin_unlock(&logbuf_lock);
1892 lockdep_on();
1893 local_irq_restore(flags);
1894
1895
1896 if (!in_sched) {
1897 lockdep_off();
1898
1899
1900
1901
1902
1903 if (console_trylock())
1904 console_unlock();
1905 lockdep_on();
1906 }
1907
1908 return printed_len;
1909}
1910EXPORT_SYMBOL(vprintk_emit);
1911
1912asmlinkage int vprintk(const char *fmt, va_list args)
1913{
1914 return vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
1915}
1916EXPORT_SYMBOL(vprintk);
1917
1918asmlinkage int printk_emit(int facility, int level,
1919 const char *dict, size_t dictlen,
1920 const char *fmt, ...)
1921{
1922 va_list args;
1923 int r;
1924
1925 va_start(args, fmt);
1926 r = vprintk_emit(facility, level, dict, dictlen, fmt, args);
1927 va_end(args);
1928
1929 return r;
1930}
1931EXPORT_SYMBOL(printk_emit);
1932
1933int vprintk_default(const char *fmt, va_list args)
1934{
1935 int r;
1936
1937#ifdef CONFIG_KGDB_KDB
1938 if (unlikely(kdb_trap_printk)) {
1939 r = vkdb_printf(KDB_MSGSRC_PRINTK, fmt, args);
1940 return r;
1941 }
1942#endif
1943 r = vprintk_emit(0, LOGLEVEL_DEFAULT, NULL, 0, fmt, args);
1944
1945 return r;
1946}
1947EXPORT_SYMBOL_GPL(vprintk_default);
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970asmlinkage __visible int printk(const char *fmt, ...)
1971{
1972 va_list args;
1973 int r;
1974
1975 va_start(args, fmt);
1976 r = vprintk_func(fmt, args);
1977 va_end(args);
1978
1979 return r;
1980}
1981EXPORT_SYMBOL(printk);
1982
1983#else
1984
1985#define LOG_LINE_MAX 0
1986#define PREFIX_MAX 0
1987
1988static u64 syslog_seq;
1989static u32 syslog_idx;
1990static u64 console_seq;
1991static u32 console_idx;
1992static enum log_flags syslog_prev;
1993static u64 log_first_seq;
1994static u32 log_first_idx;
1995static u64 log_next_seq;
1996static enum log_flags console_prev;
1997static struct cont {
1998 size_t len;
1999 size_t cons;
2000 u8 level;
2001 bool flushed:1;
2002} cont;
2003static char *log_text(const struct printk_log *msg) { return NULL; }
2004static char *log_dict(const struct printk_log *msg) { return NULL; }
2005static struct printk_log *log_from_idx(u32 idx) { return NULL; }
2006static u32 log_next(u32 idx) { return 0; }
2007static ssize_t msg_print_ext_header(char *buf, size_t size,
2008 struct printk_log *msg, u64 seq,
2009 enum log_flags prev_flags) { return 0; }
2010static ssize_t msg_print_ext_body(char *buf, size_t size,
2011 char *dict, size_t dict_len,
2012 char *text, size_t text_len) { return 0; }
2013static void call_console_drivers(int level,
2014 const char *ext_text, size_t ext_len,
2015 const char *text, size_t len) {}
2016static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
2017 bool syslog, char *buf, size_t size) { return 0; }
2018static size_t cont_print_text(char *text, size_t size) { return 0; }
2019static bool suppress_message_printing(int level) { return false; }
2020
2021
2022DEFINE_PER_CPU(printk_func_t, printk_func);
2023
2024#endif
2025
2026#ifdef CONFIG_EARLY_PRINTK
2027struct console *early_console;
2028
2029asmlinkage __visible void early_printk(const char *fmt, ...)
2030{
2031 va_list ap;
2032 char buf[512];
2033 int n;
2034
2035 if (!early_console)
2036 return;
2037
2038 va_start(ap, fmt);
2039 n = vscnprintf(buf, sizeof(buf), fmt, ap);
2040 va_end(ap);
2041
2042 early_console->write(early_console, buf, n);
2043}
2044#endif
2045
2046static int __add_preferred_console(char *name, int idx, char *options,
2047 char *brl_options)
2048{
2049 struct console_cmdline *c;
2050 int i;
2051
2052
2053
2054
2055
2056 for (i = 0, c = console_cmdline;
2057 i < MAX_CMDLINECONSOLES && c->name[0];
2058 i++, c++) {
2059 if (strcmp(c->name, name) == 0 && c->index == idx) {
2060 if (!brl_options)
2061 selected_console = i;
2062 return 0;
2063 }
2064 }
2065 if (i == MAX_CMDLINECONSOLES)
2066 return -E2BIG;
2067 if (!brl_options)
2068 selected_console = i;
2069 strlcpy(c->name, name, sizeof(c->name));
2070 c->options = options;
2071 braille_set_options(c, brl_options);
2072
2073 c->index = idx;
2074 return 0;
2075}
2076
2077
2078
2079
2080static int __init console_setup(char *str)
2081{
2082 char buf[sizeof(console_cmdline[0].name) + 4];
2083 char *s, *options, *brl_options = NULL;
2084 int idx;
2085
2086 if (_braille_console_setup(&str, &brl_options))
2087 return 1;
2088
2089
2090
2091
2092 if (str[0] >= '0' && str[0] <= '9') {
2093 strcpy(buf, "ttyS");
2094 strncpy(buf + 4, str, sizeof(buf) - 5);
2095 } else {
2096 strncpy(buf, str, sizeof(buf) - 1);
2097 }
2098 buf[sizeof(buf) - 1] = 0;
2099 options = strchr(str, ',');
2100 if (options)
2101 *(options++) = 0;
2102#ifdef __sparc__
2103 if (!strcmp(str, "ttya"))
2104 strcpy(buf, "ttyS0");
2105 if (!strcmp(str, "ttyb"))
2106 strcpy(buf, "ttyS1");
2107#endif
2108 for (s = buf; *s; s++)
2109 if (isdigit(*s) || *s == ',')
2110 break;
2111 idx = simple_strtoul(s, NULL, 10);
2112 *s = 0;
2113
2114 __add_preferred_console(buf, idx, options, brl_options);
2115 console_set_on_cmdline = 1;
2116 return 1;
2117}
2118__setup("console=", console_setup);
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133int add_preferred_console(char *name, int idx, char *options)
2134{
2135 return __add_preferred_console(name, idx, options, NULL);
2136}
2137
2138bool console_suspend_enabled = true;
2139EXPORT_SYMBOL(console_suspend_enabled);
2140
2141static int __init console_suspend_disable(char *str)
2142{
2143 console_suspend_enabled = false;
2144 return 1;
2145}
2146__setup("no_console_suspend", console_suspend_disable);
2147module_param_named(console_suspend, console_suspend_enabled,
2148 bool, S_IRUGO | S_IWUSR);
2149MODULE_PARM_DESC(console_suspend, "suspend console during suspend"
2150 " and hibernate operations");
2151
2152
2153
2154
2155
2156
2157void suspend_console(void)
2158{
2159 if (!console_suspend_enabled)
2160 return;
2161 printk("Suspending console(s) (use no_console_suspend to debug)\n");
2162 console_lock();
2163 console_suspended = 1;
2164 up_console_sem();
2165}
2166
2167void resume_console(void)
2168{
2169 if (!console_suspend_enabled)
2170 return;
2171 down_console_sem();
2172 console_suspended = 0;
2173 console_unlock();
2174}
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187static int console_cpu_notify(struct notifier_block *self,
2188 unsigned long action, void *hcpu)
2189{
2190 switch (action) {
2191 case CPU_ONLINE:
2192 case CPU_DEAD:
2193 case CPU_DOWN_FAILED:
2194 case CPU_UP_CANCELED:
2195 console_lock();
2196 console_unlock();
2197 }
2198 return NOTIFY_OK;
2199}
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209void console_lock(void)
2210{
2211 might_sleep();
2212
2213 down_console_sem();
2214 if (console_suspended)
2215 return;
2216 console_locked = 1;
2217 console_may_schedule = 1;
2218}
2219EXPORT_SYMBOL(console_lock);
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229int console_trylock(void)
2230{
2231 if (down_trylock_console_sem())
2232 return 0;
2233 if (console_suspended) {
2234 up_console_sem();
2235 return 0;
2236 }
2237 console_locked = 1;
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249 console_may_schedule = !oops_in_progress &&
2250 preemptible() &&
2251 !rcu_preempt_depth();
2252 return 1;
2253}
2254EXPORT_SYMBOL(console_trylock);
2255
2256int is_console_locked(void)
2257{
2258 return console_locked;
2259}
2260
2261
2262
2263
2264
2265static int have_callable_console(void)
2266{
2267 struct console *con;
2268
2269 for_each_console(con)
2270 if ((con->flags & CON_ENABLED) &&
2271 (con->flags & CON_ANYTIME))
2272 return 1;
2273
2274 return 0;
2275}
2276
2277
2278
2279
2280
2281
2282
2283
2284static inline int can_use_console(void)
2285{
2286 return cpu_online(raw_smp_processor_id()) || have_callable_console();
2287}
2288
2289static void console_cont_flush(char *text, size_t size)
2290{
2291 unsigned long flags;
2292 size_t len;
2293
2294 raw_spin_lock_irqsave(&logbuf_lock, flags);
2295
2296 if (!cont.len)
2297 goto out;
2298
2299 if (suppress_message_printing(cont.level)) {
2300 cont.cons = cont.len;
2301 if (cont.flushed)
2302 cont.len = 0;
2303 goto out;
2304 }
2305
2306
2307
2308
2309
2310
2311 if (console_seq < log_next_seq && !cont.cons)
2312 goto out;
2313
2314 len = cont_print_text(text, size);
2315 raw_spin_unlock(&logbuf_lock);
2316 stop_critical_timings();
2317 call_console_drivers(cont.level, NULL, 0, text, len);
2318 start_critical_timings();
2319 local_irq_restore(flags);
2320 return;
2321out:
2322 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2323}
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339void console_unlock(void)
2340{
2341 static char ext_text[CONSOLE_EXT_LOG_MAX];
2342 static char text[LOG_LINE_MAX + PREFIX_MAX];
2343 static u64 seen_seq;
2344 unsigned long flags;
2345 bool wake_klogd = false;
2346 bool do_cond_resched, retry;
2347
2348 if (console_suspended) {
2349 up_console_sem();
2350 return;
2351 }
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363 do_cond_resched = console_may_schedule;
2364 console_may_schedule = 0;
2365
2366again:
2367
2368
2369
2370
2371
2372 if (!can_use_console()) {
2373 console_locked = 0;
2374 up_console_sem();
2375 return;
2376 }
2377
2378
2379 console_cont_flush(text, sizeof(text));
2380
2381 for (;;) {
2382 struct printk_log *msg;
2383 size_t ext_len = 0;
2384 size_t len;
2385 int level;
2386
2387 raw_spin_lock_irqsave(&logbuf_lock, flags);
2388 if (seen_seq != log_next_seq) {
2389 wake_klogd = true;
2390 seen_seq = log_next_seq;
2391 }
2392
2393 if (console_seq < log_first_seq) {
2394 len = sprintf(text, "** %u printk messages dropped ** ",
2395 (unsigned)(log_first_seq - console_seq));
2396
2397
2398 console_seq = log_first_seq;
2399 console_idx = log_first_idx;
2400 console_prev = 0;
2401 } else {
2402 len = 0;
2403 }
2404skip:
2405 if (console_seq == log_next_seq)
2406 break;
2407
2408 msg = log_from_idx(console_idx);
2409 level = msg->level;
2410 if ((msg->flags & LOG_NOCONS) ||
2411 suppress_message_printing(level)) {
2412
2413
2414
2415
2416
2417 console_idx = log_next(console_idx);
2418 console_seq++;
2419
2420
2421
2422
2423
2424 msg->flags &= ~LOG_NOCONS;
2425 console_prev = msg->flags;
2426 goto skip;
2427 }
2428
2429 len += msg_print_text(msg, console_prev, false,
2430 text + len, sizeof(text) - len);
2431 if (nr_ext_console_drivers) {
2432 ext_len = msg_print_ext_header(ext_text,
2433 sizeof(ext_text),
2434 msg, console_seq, console_prev);
2435 ext_len += msg_print_ext_body(ext_text + ext_len,
2436 sizeof(ext_text) - ext_len,
2437 log_dict(msg), msg->dict_len,
2438 log_text(msg), msg->text_len);
2439 }
2440 console_idx = log_next(console_idx);
2441 console_seq++;
2442 console_prev = msg->flags;
2443 raw_spin_unlock(&logbuf_lock);
2444
2445 stop_critical_timings();
2446 call_console_drivers(level, ext_text, ext_len, text, len);
2447 start_critical_timings();
2448 local_irq_restore(flags);
2449
2450 if (do_cond_resched)
2451 cond_resched();
2452 }
2453 console_locked = 0;
2454
2455
2456 if (unlikely(exclusive_console))
2457 exclusive_console = NULL;
2458
2459 raw_spin_unlock(&logbuf_lock);
2460
2461 up_console_sem();
2462
2463
2464
2465
2466
2467
2468
2469 raw_spin_lock(&logbuf_lock);
2470 retry = console_seq != log_next_seq;
2471 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2472
2473 if (retry && console_trylock())
2474 goto again;
2475
2476 if (wake_klogd)
2477 wake_up_klogd();
2478}
2479EXPORT_SYMBOL(console_unlock);
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490void __sched console_conditional_schedule(void)
2491{
2492 if (console_may_schedule)
2493 cond_resched();
2494}
2495EXPORT_SYMBOL(console_conditional_schedule);
2496
2497void console_unblank(void)
2498{
2499 struct console *c;
2500
2501
2502
2503
2504
2505 if (oops_in_progress) {
2506 if (down_trylock_console_sem() != 0)
2507 return;
2508 } else
2509 console_lock();
2510
2511 console_locked = 1;
2512 console_may_schedule = 0;
2513 for_each_console(c)
2514 if ((c->flags & CON_ENABLED) && c->unblank)
2515 c->unblank();
2516 console_unlock();
2517}
2518
2519
2520
2521
2522
2523
2524void console_flush_on_panic(void)
2525{
2526
2527
2528
2529
2530
2531
2532
2533 console_trylock();
2534 console_may_schedule = 0;
2535 console_unlock();
2536}
2537
2538
2539
2540
2541struct tty_driver *console_device(int *index)
2542{
2543 struct console *c;
2544 struct tty_driver *driver = NULL;
2545
2546 console_lock();
2547 for_each_console(c) {
2548 if (!c->device)
2549 continue;
2550 driver = c->device(c, index);
2551 if (driver)
2552 break;
2553 }
2554 console_unlock();
2555 return driver;
2556}
2557
2558
2559
2560
2561
2562
2563void console_stop(struct console *console)
2564{
2565 console_lock();
2566 console->flags &= ~CON_ENABLED;
2567 console_unlock();
2568}
2569EXPORT_SYMBOL(console_stop);
2570
2571void console_start(struct console *console)
2572{
2573 console_lock();
2574 console->flags |= CON_ENABLED;
2575 console_unlock();
2576}
2577EXPORT_SYMBOL(console_start);
2578
2579static int __read_mostly keep_bootcon;
2580
2581static int __init keep_bootcon_setup(char *str)
2582{
2583 keep_bootcon = 1;
2584 pr_info("debug: skip boot console de-registration.\n");
2585
2586 return 0;
2587}
2588
2589early_param("keep_bootcon", keep_bootcon_setup);
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610void register_console(struct console *newcon)
2611{
2612 int i;
2613 unsigned long flags;
2614 struct console *bcon = NULL;
2615 struct console_cmdline *c;
2616
2617 if (console_drivers)
2618 for_each_console(bcon)
2619 if (WARN(bcon == newcon,
2620 "console '%s%d' already registered\n",
2621 bcon->name, bcon->index))
2622 return;
2623
2624
2625
2626
2627
2628 if (console_drivers && newcon->flags & CON_BOOT) {
2629
2630 for_each_console(bcon) {
2631 if (!(bcon->flags & CON_BOOT)) {
2632 pr_info("Too late to register bootconsole %s%d\n",
2633 newcon->name, newcon->index);
2634 return;
2635 }
2636 }
2637 }
2638
2639 if (console_drivers && console_drivers->flags & CON_BOOT)
2640 bcon = console_drivers;
2641
2642 if (preferred_console < 0 || bcon || !console_drivers)
2643 preferred_console = selected_console;
2644
2645
2646
2647
2648
2649
2650 if (preferred_console < 0) {
2651 if (newcon->index < 0)
2652 newcon->index = 0;
2653 if (newcon->setup == NULL ||
2654 newcon->setup(newcon, NULL) == 0) {
2655 newcon->flags |= CON_ENABLED;
2656 if (newcon->device) {
2657 newcon->flags |= CON_CONSDEV;
2658 preferred_console = 0;
2659 }
2660 }
2661 }
2662
2663
2664
2665
2666
2667 for (i = 0, c = console_cmdline;
2668 i < MAX_CMDLINECONSOLES && c->name[0];
2669 i++, c++) {
2670 if (!newcon->match ||
2671 newcon->match(newcon, c->name, c->index, c->options) != 0) {
2672
2673 BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name));
2674 if (strcmp(c->name, newcon->name) != 0)
2675 continue;
2676 if (newcon->index >= 0 &&
2677 newcon->index != c->index)
2678 continue;
2679 if (newcon->index < 0)
2680 newcon->index = c->index;
2681
2682 if (_braille_register_console(newcon, c))
2683 return;
2684
2685 if (newcon->setup &&
2686 newcon->setup(newcon, c->options) != 0)
2687 break;
2688 }
2689
2690 newcon->flags |= CON_ENABLED;
2691 if (i == selected_console) {
2692 newcon->flags |= CON_CONSDEV;
2693 preferred_console = selected_console;
2694 }
2695 break;
2696 }
2697
2698 if (!(newcon->flags & CON_ENABLED))
2699 return;
2700
2701
2702
2703
2704
2705
2706
2707 if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV))
2708 newcon->flags &= ~CON_PRINTBUFFER;
2709
2710
2711
2712
2713
2714 console_lock();
2715 if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
2716 newcon->next = console_drivers;
2717 console_drivers = newcon;
2718 if (newcon->next)
2719 newcon->next->flags &= ~CON_CONSDEV;
2720 } else {
2721 newcon->next = console_drivers->next;
2722 console_drivers->next = newcon;
2723 }
2724
2725 if (newcon->flags & CON_EXTENDED)
2726 if (!nr_ext_console_drivers++)
2727 pr_info("printk: continuation disabled due to ext consoles, expect more fragments in /dev/kmsg\n");
2728
2729 if (newcon->flags & CON_PRINTBUFFER) {
2730
2731
2732
2733
2734 raw_spin_lock_irqsave(&logbuf_lock, flags);
2735 console_seq = syslog_seq;
2736 console_idx = syslog_idx;
2737 console_prev = syslog_prev;
2738 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
2739
2740
2741
2742
2743
2744 exclusive_console = newcon;
2745 }
2746 console_unlock();
2747 console_sysfs_notify();
2748
2749
2750
2751
2752
2753
2754
2755
2756 pr_info("%sconsole [%s%d] enabled\n",
2757 (newcon->flags & CON_BOOT) ? "boot" : "" ,
2758 newcon->name, newcon->index);
2759 if (bcon &&
2760 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
2761 !keep_bootcon) {
2762
2763
2764
2765 for_each_console(bcon)
2766 if (bcon->flags & CON_BOOT)
2767 unregister_console(bcon);
2768 }
2769}
2770EXPORT_SYMBOL(register_console);
2771
2772int unregister_console(struct console *console)
2773{
2774 struct console *a, *b;
2775 int res;
2776
2777 pr_info("%sconsole [%s%d] disabled\n",
2778 (console->flags & CON_BOOT) ? "boot" : "" ,
2779 console->name, console->index);
2780
2781 res = _braille_unregister_console(console);
2782 if (res)
2783 return res;
2784
2785 res = 1;
2786 console_lock();
2787 if (console_drivers == console) {
2788 console_drivers=console->next;
2789 res = 0;
2790 } else if (console_drivers) {
2791 for (a=console_drivers->next, b=console_drivers ;
2792 a; b=a, a=b->next) {
2793 if (a == console) {
2794 b->next = a->next;
2795 res = 0;
2796 break;
2797 }
2798 }
2799 }
2800
2801 if (!res && (console->flags & CON_EXTENDED))
2802 nr_ext_console_drivers--;
2803
2804
2805
2806
2807
2808 if (console_drivers != NULL && console->flags & CON_CONSDEV)
2809 console_drivers->flags |= CON_CONSDEV;
2810
2811 console->flags &= ~CON_ENABLED;
2812 console_unlock();
2813 console_sysfs_notify();
2814 return res;
2815}
2816EXPORT_SYMBOL(unregister_console);
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833static int __init printk_late_init(void)
2834{
2835 struct console *con;
2836
2837 for_each_console(con) {
2838 if (!keep_bootcon && con->flags & CON_BOOT) {
2839
2840
2841
2842
2843
2844
2845
2846 if (init_section_intersects(con, sizeof(*con)))
2847 unregister_console(con);
2848 }
2849 }
2850 hotcpu_notifier(console_cpu_notify, 0);
2851 return 0;
2852}
2853late_initcall(printk_late_init);
2854
2855#if defined CONFIG_PRINTK
2856
2857
2858
2859#define PRINTK_PENDING_WAKEUP 0x01
2860#define PRINTK_PENDING_OUTPUT 0x02
2861
2862static DEFINE_PER_CPU(int, printk_pending);
2863
2864static void wake_up_klogd_work_func(struct irq_work *irq_work)
2865{
2866 int pending = __this_cpu_xchg(printk_pending, 0);
2867
2868 if (pending & PRINTK_PENDING_OUTPUT) {
2869
2870 if (console_trylock())
2871 console_unlock();
2872 }
2873
2874 if (pending & PRINTK_PENDING_WAKEUP)
2875 wake_up_interruptible(&log_wait);
2876}
2877
2878static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = {
2879 .func = wake_up_klogd_work_func,
2880 .flags = IRQ_WORK_LAZY,
2881};
2882
2883void wake_up_klogd(void)
2884{
2885 preempt_disable();
2886 if (waitqueue_active(&log_wait)) {
2887 this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
2888 irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
2889 }
2890 preempt_enable();
2891}
2892
2893int printk_deferred(const char *fmt, ...)
2894{
2895 va_list args;
2896 int r;
2897
2898 preempt_disable();
2899 va_start(args, fmt);
2900 r = vprintk_emit(0, LOGLEVEL_SCHED, NULL, 0, fmt, args);
2901 va_end(args);
2902
2903 __this_cpu_or(printk_pending, PRINTK_PENDING_OUTPUT);
2904 irq_work_queue(this_cpu_ptr(&wake_up_klogd_work));
2905 preempt_enable();
2906
2907 return r;
2908}
2909
2910
2911
2912
2913
2914
2915
2916DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
2917
2918int __printk_ratelimit(const char *func)
2919{
2920 return ___ratelimit(&printk_ratelimit_state, func);
2921}
2922EXPORT_SYMBOL(__printk_ratelimit);
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933bool printk_timed_ratelimit(unsigned long *caller_jiffies,
2934 unsigned int interval_msecs)
2935{
2936 unsigned long elapsed = jiffies - *caller_jiffies;
2937
2938 if (*caller_jiffies && elapsed <= msecs_to_jiffies(interval_msecs))
2939 return false;
2940
2941 *caller_jiffies = jiffies;
2942 return true;
2943}
2944EXPORT_SYMBOL(printk_timed_ratelimit);
2945
2946static DEFINE_SPINLOCK(dump_list_lock);
2947static LIST_HEAD(dump_list);
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957int kmsg_dump_register(struct kmsg_dumper *dumper)
2958{
2959 unsigned long flags;
2960 int err = -EBUSY;
2961
2962
2963 if (!dumper->dump)
2964 return -EINVAL;
2965
2966 spin_lock_irqsave(&dump_list_lock, flags);
2967
2968 if (!dumper->registered) {
2969 dumper->registered = 1;
2970 list_add_tail_rcu(&dumper->list, &dump_list);
2971 err = 0;
2972 }
2973 spin_unlock_irqrestore(&dump_list_lock, flags);
2974
2975 return err;
2976}
2977EXPORT_SYMBOL_GPL(kmsg_dump_register);
2978
2979
2980
2981
2982
2983
2984
2985
2986int kmsg_dump_unregister(struct kmsg_dumper *dumper)
2987{
2988 unsigned long flags;
2989 int err = -EINVAL;
2990
2991 spin_lock_irqsave(&dump_list_lock, flags);
2992 if (dumper->registered) {
2993 dumper->registered = 0;
2994 list_del_rcu(&dumper->list);
2995 err = 0;
2996 }
2997 spin_unlock_irqrestore(&dump_list_lock, flags);
2998 synchronize_rcu();
2999
3000 return err;
3001}
3002EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
3003
3004static bool always_kmsg_dump;
3005module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR);
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015void kmsg_dump(enum kmsg_dump_reason reason)
3016{
3017 struct kmsg_dumper *dumper;
3018 unsigned long flags;
3019
3020 if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)
3021 return;
3022
3023 rcu_read_lock();
3024 list_for_each_entry_rcu(dumper, &dump_list, list) {
3025 if (dumper->max_reason && reason > dumper->max_reason)
3026 continue;
3027
3028
3029 dumper->active = true;
3030
3031 raw_spin_lock_irqsave(&logbuf_lock, flags);
3032 dumper->cur_seq = clear_seq;
3033 dumper->cur_idx = clear_idx;
3034 dumper->next_seq = log_next_seq;
3035 dumper->next_idx = log_next_idx;
3036 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
3037
3038
3039 dumper->dump(dumper, reason);
3040
3041
3042 dumper->active = false;
3043 }
3044 rcu_read_unlock();
3045}
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog,
3067 char *line, size_t size, size_t *len)
3068{
3069 struct printk_log *msg;
3070 size_t l = 0;
3071 bool ret = false;
3072
3073 if (!dumper->active)
3074 goto out;
3075
3076 if (dumper->cur_seq < log_first_seq) {
3077
3078 dumper->cur_seq = log_first_seq;
3079 dumper->cur_idx = log_first_idx;
3080 }
3081
3082
3083 if (dumper->cur_seq >= log_next_seq)
3084 goto out;
3085
3086 msg = log_from_idx(dumper->cur_idx);
3087 l = msg_print_text(msg, 0, syslog, line, size);
3088
3089 dumper->cur_idx = log_next(dumper->cur_idx);
3090 dumper->cur_seq++;
3091 ret = true;
3092out:
3093 if (len)
3094 *len = l;
3095 return ret;
3096}
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
3116 char *line, size_t size, size_t *len)
3117{
3118 unsigned long flags;
3119 bool ret;
3120
3121 raw_spin_lock_irqsave(&logbuf_lock, flags);
3122 ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len);
3123 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
3124
3125 return ret;
3126}
3127EXPORT_SYMBOL_GPL(kmsg_dump_get_line);
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
3149 char *buf, size_t size, size_t *len)
3150{
3151 unsigned long flags;
3152 u64 seq;
3153 u32 idx;
3154 u64 next_seq;
3155 u32 next_idx;
3156 enum log_flags prev;
3157 size_t l = 0;
3158 bool ret = false;
3159
3160 if (!dumper->active)
3161 goto out;
3162
3163 raw_spin_lock_irqsave(&logbuf_lock, flags);
3164 if (dumper->cur_seq < log_first_seq) {
3165
3166 dumper->cur_seq = log_first_seq;
3167 dumper->cur_idx = log_first_idx;
3168 }
3169
3170
3171 if (dumper->cur_seq >= dumper->next_seq) {
3172 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
3173 goto out;
3174 }
3175
3176
3177 seq = dumper->cur_seq;
3178 idx = dumper->cur_idx;
3179 prev = 0;
3180 while (seq < dumper->next_seq) {
3181 struct printk_log *msg = log_from_idx(idx);
3182
3183 l += msg_print_text(msg, prev, true, NULL, 0);
3184 idx = log_next(idx);
3185 seq++;
3186 prev = msg->flags;
3187 }
3188
3189
3190 seq = dumper->cur_seq;
3191 idx = dumper->cur_idx;
3192 prev = 0;
3193 while (l > size && seq < dumper->next_seq) {
3194 struct printk_log *msg = log_from_idx(idx);
3195
3196 l -= msg_print_text(msg, prev, true, NULL, 0);
3197 idx = log_next(idx);
3198 seq++;
3199 prev = msg->flags;
3200 }
3201
3202
3203 next_seq = seq;
3204 next_idx = idx;
3205
3206 l = 0;
3207 while (seq < dumper->next_seq) {
3208 struct printk_log *msg = log_from_idx(idx);
3209
3210 l += msg_print_text(msg, prev, syslog, buf + l, size - l);
3211 idx = log_next(idx);
3212 seq++;
3213 prev = msg->flags;
3214 }
3215
3216 dumper->next_seq = next_seq;
3217 dumper->next_idx = next_idx;
3218 ret = true;
3219 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
3220out:
3221 if (len)
3222 *len = l;
3223 return ret;
3224}
3225EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer);
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper)
3238{
3239 dumper->cur_seq = clear_seq;
3240 dumper->cur_idx = clear_idx;
3241 dumper->next_seq = log_next_seq;
3242 dumper->next_idx = log_next_idx;
3243}
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253void kmsg_dump_rewind(struct kmsg_dumper *dumper)
3254{
3255 unsigned long flags;
3256
3257 raw_spin_lock_irqsave(&logbuf_lock, flags);
3258 kmsg_dump_rewind_nolock(dumper);
3259 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
3260}
3261EXPORT_SYMBOL_GPL(kmsg_dump_rewind);
3262
3263static char dump_stack_arch_desc_str[128];
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275void __init dump_stack_set_arch_desc(const char *fmt, ...)
3276{
3277 va_list args;
3278
3279 va_start(args, fmt);
3280 vsnprintf(dump_stack_arch_desc_str, sizeof(dump_stack_arch_desc_str),
3281 fmt, args);
3282 va_end(args);
3283}
3284
3285
3286
3287
3288
3289
3290
3291
3292void dump_stack_print_info(const char *log_lvl)
3293{
3294 printk("%sCPU: %d PID: %d Comm: %.20s %s %s %.*s\n",
3295 log_lvl, raw_smp_processor_id(), current->pid, current->comm,
3296 print_tainted(), init_utsname()->release,
3297 (int)strcspn(init_utsname()->version, " "),
3298 init_utsname()->version);
3299
3300 if (dump_stack_arch_desc_str[0] != '\0')
3301 printk("%sHardware name: %s\n",
3302 log_lvl, dump_stack_arch_desc_str);
3303
3304 print_worker_info(log_lvl, current);
3305}
3306
3307
3308
3309
3310
3311
3312
3313
3314void show_regs_print_info(const char *log_lvl)
3315{
3316 dump_stack_print_info(log_lvl);
3317
3318 printk("%stask: %p task.stack: %p\n",
3319 log_lvl, current, task_stack_page(current));
3320}
3321
3322#endif
3323