Lines Matching +full:pmsg +full:- +full:size
1 // SPDX-License-Identifier: GPL-2.0-only
84 * console_mutex protects console_list updates and console->flags updates.
91 * console_sem protects updates to console->seq
153 return -EINVAL; in __control_devkmsg()
173 return -EINVAL; in __control_devkmsg()
215 return -EINVAL; in devkmsg_sysctl_set_loglvl()
238 return -EINVAL; in devkmsg_sysctl_set_loglvl()
247 * console_list_lock - Lock the console list
249 * For console list or console->flags updates
259 * Detecting if this context is really in the read-side critical in console_list_lock()
271 * console_list_unlock - Unlock the console list
282 * console_srcu_read_lock - Register a new reader for the
283 * SRCU-protected console list
297 * console_srcu_read_unlock - Unregister an old reader from
298 * the SRCU-protected console list
325 * because spindump/WARN/etc from under console ->lock will in __down_trylock_console_sem()
326 * deadlock in printk()->down_trylock_console_sem() otherwise. in __down_trylock_console_sem()
374 static int preferred_console = -1;
391 * own meta-data (@info).
393 * Every record meta-data carries the timestamp in microseconds, as well as
395 * messages use LOG_KERN; userspace-injected messages always carry a matching
404 * pairs), to provide userspace with a machine-readable message context.
406 * Examples for well-defined, commonly used property names are:
412 * SUBSYSTEM=pci driver-core subsystem name
414 * Valid characters in property names are [a-zA-Z0-9.-_]. Property names
430 * userspace, it is a kernel-private implementation detail that might
441 * non-prinatable characters are escaped in the "\xff" notation.
483 * Define the average message size. This only affects the number of
492 _DEFINE_PRINTKRB(printk_rb_static, CONFIG_LOG_BUF_SHIFT - PRB_AVGBITS,
500 * We cannot access per-CPU data (e.g. per-CPU flush irq_work) before
502 * it's safe to access per-CPU data.
514 raw_write_seqcount_latch(&ls->latch); in latched_seq_write()
515 ls->val[0] = val; in latched_seq_write()
516 raw_write_seqcount_latch(&ls->latch); in latched_seq_write()
517 ls->val[1] = val; in latched_seq_write()
528 seq = raw_read_seqcount_latch(&ls->latch); in latched_seq_read_nolock()
530 val = ls->val[idx]; in latched_seq_read_nolock()
531 } while (raw_read_seqcount_latch_retry(&ls->latch, seq)); in latched_seq_read_nolock()
542 /* Return log buffer size */
570 *text_len -= *trunc_msg_len; in truncate_msg()
582 * Unless restricted, we allow "read all" and "get buffer size" in syslog_action_restricted()
609 current->comm, task_pid_nr(current)); in check_syslog_permissions()
612 return -EPERM; in check_syslog_permissions()
624 static ssize_t info_print_ext_header(char *buf, size_t size, in info_print_ext_header() argument
627 u64 ts_usec = info->ts_nsec; in info_print_ext_header()
630 u32 id = info->caller_id; in info_print_ext_header()
640 return scnprintf(buf, size, "%u,%llu,%llu,%c%s;", in info_print_ext_header()
641 (info->facility << 3) | info->level, info->seq, in info_print_ext_header()
642 ts_usec, info->flags & LOG_CONT ? 'c' : '-', caller); in info_print_ext_header()
645 static ssize_t msg_add_ext_text(char *buf, size_t size, in msg_add_ext_text() argument
649 char *p = buf, *e = buf + size; in msg_add_ext_text()
652 /* escape non-printable characters */ in msg_add_ext_text()
657 p += scnprintf(p, e - p, "\\x%02x", c); in msg_add_ext_text()
663 return p - buf; in msg_add_ext_text()
666 static ssize_t msg_add_dict_text(char *buf, size_t size, in msg_add_dict_text() argument
675 len = msg_add_ext_text(buf, size, "", 0, ' '); /* dict prefix */ in msg_add_dict_text()
676 len += msg_add_ext_text(buf + len, size - len, key, strlen(key), '='); in msg_add_dict_text()
677 len += msg_add_ext_text(buf + len, size - len, val, val_len, '\n'); in msg_add_dict_text()
682 static ssize_t msg_print_ext_body(char *buf, size_t size, in msg_print_ext_body() argument
688 len = msg_add_ext_text(buf, size, text, text_len, '\n'); in msg_print_ext_body()
693 len += msg_add_dict_text(buf + len, size - len, "SUBSYSTEM", in msg_print_ext_body()
694 dev_info->subsystem); in msg_print_ext_body()
695 len += msg_add_dict_text(buf + len, size - len, "DEVICE", in msg_print_ext_body()
696 dev_info->device); in msg_print_ext_body()
701 static bool printk_get_next_message(struct printk_message *pmsg, u64 seq,
704 /* /dev/kmsg - userspace message inject/listen interface */
730 struct file *file = iocb->ki_filp; in devkmsg_write()
731 struct devkmsg_user *user = file->private_data; in devkmsg_write()
736 return -EINVAL; in devkmsg_write()
744 if (!___ratelimit(&user->rs, current->comm)) in devkmsg_write()
750 return -ENOMEM; in devkmsg_write()
755 return -EFAULT; in devkmsg_write()
759 * Extract and skip the syslog prefix <[0-9]*>. Coming from userspace in devkmsg_write()
765 * kernel-generated messages from userspace-injected ones. in devkmsg_write()
790 struct devkmsg_user *user = file->private_data; in devkmsg_read()
791 char *outbuf = &user->pbufs.outbuf[0]; in devkmsg_read()
792 struct printk_message pmsg = { in devkmsg_read() local
793 .pbufs = &user->pbufs, in devkmsg_read()
797 ret = mutex_lock_interruptible(&user->lock); in devkmsg_read()
801 if (!printk_get_next_message(&pmsg, atomic64_read(&user->seq), true, false)) { in devkmsg_read()
802 if (file->f_flags & O_NONBLOCK) { in devkmsg_read()
803 ret = -EAGAIN; in devkmsg_read()
818 printk_get_next_message(&pmsg, atomic64_read(&user->seq), true, in devkmsg_read()
824 if (pmsg.dropped) { in devkmsg_read()
826 atomic64_set(&user->seq, pmsg.seq); in devkmsg_read()
827 ret = -EPIPE; in devkmsg_read()
831 atomic64_set(&user->seq, pmsg.seq + 1); in devkmsg_read()
833 if (pmsg.outbuf_len > count) { in devkmsg_read()
834 ret = -EINVAL; in devkmsg_read()
838 if (copy_to_user(buf, outbuf, pmsg.outbuf_len)) { in devkmsg_read()
839 ret = -EFAULT; in devkmsg_read()
842 ret = pmsg.outbuf_len; in devkmsg_read()
844 mutex_unlock(&user->lock); in devkmsg_read()
852 * entire variable length messages (records). Non-standard values are
858 struct devkmsg_user *user = file->private_data; in devkmsg_llseek()
862 return -ESPIPE; in devkmsg_llseek()
867 atomic64_set(&user->seq, prb_first_valid_seq(prb)); in devkmsg_llseek()
872 * like issued by 'dmesg -c'. Reading /dev/kmsg itself in devkmsg_llseek()
875 atomic64_set(&user->seq, latched_seq_read_nolock(&clear_seq)); in devkmsg_llseek()
879 atomic64_set(&user->seq, prb_next_seq(prb)); in devkmsg_llseek()
882 ret = -EINVAL; in devkmsg_llseek()
889 struct devkmsg_user *user = file->private_data; in devkmsg_poll()
895 if (prb_read_valid_info(prb, atomic64_read(&user->seq), &info, NULL)) { in devkmsg_poll()
897 if (info.seq != atomic64_read(&user->seq)) in devkmsg_poll()
912 return -EPERM; in devkmsg_open()
914 /* write-only does not need any file context */ in devkmsg_open()
915 if ((file->f_flags & O_ACCMODE) != O_WRONLY) { in devkmsg_open()
924 return -ENOMEM; in devkmsg_open()
926 ratelimit_default_init(&user->rs); in devkmsg_open()
927 ratelimit_set_flags(&user->rs, RATELIMIT_MSG_ON_RELEASE); in devkmsg_open()
929 mutex_init(&user->lock); in devkmsg_open()
931 atomic64_set(&user->seq, prb_first_valid_seq(prb)); in devkmsg_open()
933 file->private_data = user; in devkmsg_open()
939 struct devkmsg_user *user = file->private_data; in devkmsg_release()
941 ratelimit_state_exit(&user->rs); in devkmsg_release()
943 mutex_destroy(&user->lock); in devkmsg_release()
975 * Export struct size and field offsets. User space tools can in log_buf_vmcoreinfo_setup()
1008 VMCOREINFO_LENGTH(printk_info_subsystem, sizeof(dev_info->subsystem)); in log_buf_vmcoreinfo_setup()
1010 VMCOREINFO_LENGTH(printk_info_device, sizeof(dev_info->device)); in log_buf_vmcoreinfo_setup()
1030 static void __init log_buf_len_update(u64 size) in log_buf_len_update() argument
1032 if (size > (u64)LOG_BUF_LEN_MAX) { in log_buf_len_update()
1033 size = (u64)LOG_BUF_LEN_MAX; in log_buf_len_update()
1037 if (size) in log_buf_len_update()
1038 size = roundup_pow_of_two(size); in log_buf_len_update()
1039 if (size > log_buf_len) in log_buf_len_update()
1040 new_log_buf_len = (unsigned long)size; in log_buf_len_update()
1046 u64 size; in log_buf_len_setup() local
1049 return -EINVAL; in log_buf_len_setup()
1051 size = memparse(str, &str); in log_buf_len_setup()
1053 log_buf_len_update(size); in log_buf_len_setup()
1074 cpu_extra = (num_possible_cpus() - 1) * __LOG_CPU_MAX_BUF_LEN; in log_buf_add_cpu()
1084 pr_info("log_buf_len min size: %d bytes\n", __LOG_BUF_LEN); in log_buf_add_cpu()
1103 prb_rec_init_wr(&dest_r, r->info->text_len); in add_to_rb()
1108 memcpy(&dest_r.text_buf[0], &r->text_buf[0], r->info->text_len); in add_to_rb()
1109 dest_r.info->text_len = r->info->text_len; in add_to_rb()
1110 dest_r.info->facility = r->info->facility; in add_to_rb()
1111 dest_r.info->level = r->info->level; in add_to_rb()
1112 dest_r.info->flags = r->info->flags; in add_to_rb()
1113 dest_r.info->ts_nsec = r->info->ts_nsec; in add_to_rb()
1114 dest_r.info->caller_id = r->info->caller_id; in add_to_rb()
1115 memcpy(&dest_r.info->dev_info, &r->info->dev_info, sizeof(dest_r.info->dev_info)); in add_to_rb()
1140 * Some archs call setup_log_buf() multiple times - first is very in setup_log_buf()
1141 * early, e.g. from setup_arch(), and second - when percpu_areas in setup_log_buf()
1204 free -= text_size; in setup_log_buf()
1221 free -= text_size; in setup_log_buf()
1226 prb_next_seq(&printk_rb_static) - seq); in setup_log_buf()
1297 k--; in boot_delay_msec()
1350 len = print_syslog((info->facility << 3) | info->level, buf); in info_print_prefix()
1353 len += print_time(info->ts_nsec, buf + len); in info_print_prefix()
1355 len += print_caller(info->caller_id, buf + len); in info_print_prefix()
1370 * - Add prefix for each line.
1371 * - Drop truncated lines that no longer fit into the buffer.
1372 * - Add the trailing newline that has been removed in vprintk_store().
1373 * - Add a string terminator.
1376 * return value is @r->text_buf_size - 1;
1385 size_t text_len = r->info->text_len; in record_print_text()
1386 size_t buf_size = r->text_buf_size; in record_print_text()
1387 char *text = r->text_buf; in record_print_text()
1402 prefix_len = info_print_prefix(r->info, syslog, time, prefix); in record_print_text()
1408 * @len: number of bytes prepared in r->text_buf in record_print_text()
1413 line_len = next - text; in record_print_text()
1430 text_len = buf_size - len - prefix_len - 1 - 1; in record_print_text()
1469 text_len -= line_len + 1; in record_print_text()
1478 r->text_buf[len] = 0; in record_print_text()
1497 return ((prefix_len * line_count) + info->text_len + 1); in get_record_print_text_size()
1502 * records up to (but not including) @max_seq fit into @size.
1505 * does not require an upper bound, -1 can be used for @max_seq.
1507 static u64 find_first_fitting_seq(u64 start_seq, u64 max_seq, size_t size, in find_first_fitting_seq() argument
1515 /* Determine the size of the records up to @max_seq. */ in find_first_fitting_seq()
1536 if (len <= size || info.seq >= max_seq) in find_first_fitting_seq()
1538 len -= get_record_print_text_size(&info, line_count, syslog, time); in find_first_fitting_seq()
1544 /* The caller is responsible for making sure @size is greater than 0. */
1545 static int syslog_print(char __user *buf, int size) in syslog_print() argument
1555 return -ENOMEM; in syslog_print()
1599 if (r.info->seq != syslog_seq) { in syslog_print()
1601 syslog_seq = r.info->seq; in syslog_print()
1614 if (n - syslog_partial <= size) { in syslog_print()
1616 syslog_seq = r.info->seq + 1; in syslog_print()
1617 n -= syslog_partial; in syslog_print()
1621 n = size; in syslog_print()
1635 len = -EFAULT; in syslog_print()
1640 size -= n; in syslog_print()
1642 } while (size); in syslog_print()
1649 static int syslog_print_all(char __user *buf, int size, bool clear) in syslog_print_all() argument
1660 return -ENOMEM; in syslog_print_all()
1665 * into the user-provided buffer for this dump. in syslog_print_all()
1667 seq = find_first_fitting_seq(latched_seq_read_nolock(&clear_seq), -1, in syslog_print_all()
1668 size, true, time); in syslog_print_all()
1678 if (len + textlen > size) { in syslog_print_all()
1679 seq--; in syslog_print_all()
1684 len = -EFAULT; in syslog_print_all()
1727 return -EINVAL; in do_syslog()
1731 return -EFAULT; in do_syslog()
1741 return -EINVAL; in do_syslog()
1745 return -EFAULT; in do_syslog()
1768 return -EINVAL; in do_syslog()
1772 /* Implicitly re-enable logging to console */ in do_syslog()
1790 * Short-cut for poll(/"proc/kmsg") which simply checks in do_syslog()
1791 * for pending data, not the size; return the count of in do_syslog()
1794 error = prb_next_seq(prb) - syslog_seq; in do_syslog()
1806 error -= syslog_partial; in do_syslog()
1810 /* Size of the log buffer */ in do_syslog()
1815 error = -EINVAL; in do_syslog()
1828 * Special console_lock variants that help to reduce the risk of soft-lockups.
1843 * console_lock_spinning_enable - mark beginning of code where another
1862 * console_lock_spinning_disable_and_check - mark end of code where another
1911 * console_trylock_spinning - try to get console_lock by busy waiting
1986 * additional NMI context per CPU is also separately tracked. Until per-CPU
1999 * a WARN), but a higher value is used in case some printk-internal errors
2050 (*(recursion_ptr))--; \
2063 while (m--) { in printk_delay()
2077 * printk_parse_prefix - Parse level and control flags.
2107 *level = kern_level - '0'; in printk_parse_prefix()
2122 static u16 printk_sprint(char *text, u16 size, int facility, in printk_sprint() argument
2128 text_len = vscnprintf(text, size, fmt, args); in printk_sprint()
2131 if (text_len && text[text_len - 1] == '\n') { in printk_sprint()
2132 text_len--; in printk_sprint()
2142 text_len -= prefix_len; in printk_sprint()
2210 text_len = printk_sprint(&r.text_buf[r.info->text_len], reserve_size, in vprintk_store()
2212 r.info->text_len += text_len; in vprintk_store()
2215 r.info->flags |= LOG_NEWLINE; in vprintk_store()
2245 r.info->text_len = text_len + trunc_msg_len; in vprintk_store()
2246 r.info->facility = facility; in vprintk_store()
2247 r.info->level = level & 7; in vprintk_store()
2248 r.info->flags = flags & 0x1f; in vprintk_store()
2249 r.info->ts_nsec = ts_nsec; in vprintk_store()
2250 r.info->caller_id = caller_id; in vprintk_store()
2252 memcpy(&r.info->dev_info, dev_info, sizeof(r.info->dev_info)); in vprintk_store()
2293 * The caller may be holding system-critical or in vprintk_emit()
2294 * timing-sensitive locks. Disable preemption during in vprintk_emit()
2357 static ssize_t info_print_ext_header(char *buf, size_t size, in info_print_ext_header() argument
2362 static ssize_t msg_print_ext_body(char *buf, size_t size, in msg_print_ext_body() argument
2389 early_console->write(early_console, buf, n); in early_printk()
2402 c->user_specified = true; in set_user_specified()
2418 i < MAX_CMDLINECONSOLES && c->name[0]; in __add_preferred_console()
2420 if (strcmp(c->name, name) == 0 && c->index == idx) { in __add_preferred_console()
2428 return -E2BIG; in __add_preferred_console()
2431 strscpy(c->name, name, sizeof(c->name)); in __add_preferred_console()
2432 c->options = options; in __add_preferred_console()
2436 c->index = idx; in __add_preferred_console()
2478 strncpy(buf + 4, str, sizeof(buf) - 5); in console_setup()
2480 strncpy(buf, str, sizeof(buf) - 1); in console_setup()
2482 buf[sizeof(buf) - 1] = 0; in console_setup()
2504 * add_preferred_console - add a device to the list of preferred consoles.
2511 * above to handle user-supplied console arguments; however it can also
2512 * be used by arch-specific code either to override the user or more
2548 * suspend_console - suspend the console subsystem
2563 console_srcu_write_flags(con, con->flags | CON_SUSPENDED); in suspend_console()
2584 console_srcu_write_flags(con, con->flags & ~CON_SUSPENDED); in resume_console()
2598 * console_cpu_notify - print deferred console messages after CPU hotplug
2637 * console_lock - block the console subsystem from printing
2659 * console_trylock - try to block the console subsystem from printing
2701 if (!con->write) in console_is_usable()
2705 * Console drivers may assume that per-cpu resources have been in console_is_usable()
2722 * Prepend the message in @pmsg->pbufs->outbuf with a "dropped message". This
2726 * @pmsg is the printk message to prepend.
2730 * If the message text in @pmsg->pbufs->outbuf does not have enough space for
2733 * If @pmsg->pbufs->outbuf is modified, @pmsg->outbuf_len is updated.
2736 static void console_prepend_dropped(struct printk_message *pmsg, unsigned long dropped) in console_prepend_dropped() argument
2738 struct printk_buffers *pbufs = pmsg->pbufs; in console_prepend_dropped()
2739 const size_t scratchbuf_sz = sizeof(pbufs->scratchbuf); in console_prepend_dropped()
2740 const size_t outbuf_sz = sizeof(pbufs->outbuf); in console_prepend_dropped()
2741 char *scratchbuf = &pbufs->scratchbuf[0]; in console_prepend_dropped()
2742 char *outbuf = &pbufs->outbuf[0]; in console_prepend_dropped()
2757 if (pmsg->outbuf_len + len >= outbuf_sz) { in console_prepend_dropped()
2759 pmsg->outbuf_len = outbuf_sz - (len + 1); in console_prepend_dropped()
2760 outbuf[pmsg->outbuf_len] = 0; in console_prepend_dropped()
2763 memmove(outbuf + len, outbuf, pmsg->outbuf_len + 1); in console_prepend_dropped()
2765 pmsg->outbuf_len += len; in console_prepend_dropped()
2768 #define console_prepend_dropped(pmsg, dropped) argument
2775 * @pmsg will contain the formatted result. @pmsg->pbufs must point to a
2787 * of @pmsg are valid. (See the documentation of struct printk_message
2788 * for information about the @pmsg fields.)
2790 static bool printk_get_next_message(struct printk_message *pmsg, u64 seq, in printk_get_next_message() argument
2795 struct printk_buffers *pbufs = pmsg->pbufs; in printk_get_next_message()
2796 const size_t scratchbuf_sz = sizeof(pbufs->scratchbuf); in printk_get_next_message()
2797 const size_t outbuf_sz = sizeof(pbufs->outbuf); in printk_get_next_message()
2798 char *scratchbuf = &pbufs->scratchbuf[0]; in printk_get_next_message()
2799 char *outbuf = &pbufs->outbuf[0]; in printk_get_next_message()
2808 * Formatting normal messages is done in-place, so read the ringbuffer in printk_get_next_message()
2819 pmsg->seq = r.info->seq; in printk_get_next_message()
2820 pmsg->dropped = r.info->seq - seq; in printk_get_next_message()
2826 if (pmsg->dropped && in printk_get_next_message()
2830 …pr_warn_once("Too many dropped messages. Suppress messages on non-panic CPUs to prevent livelock.\… in printk_get_next_message()
2834 if (may_suppress && suppress_message_printing(r.info->level)) in printk_get_next_message()
2839 len += msg_print_ext_body(outbuf + len, outbuf_sz - len, in printk_get_next_message()
2840 &r.text_buf[0], r.info->text_len, &r.info->dev_info); in printk_get_next_message()
2845 pmsg->outbuf_len = len; in printk_get_next_message()
2870 struct printk_message pmsg = { in console_emit_next_record() local
2877 if (!printk_get_next_message(&pmsg, con->seq, is_extended, true)) in console_emit_next_record()
2880 con->dropped += pmsg.dropped; in console_emit_next_record()
2883 if (pmsg.outbuf_len == 0) { in console_emit_next_record()
2884 con->seq = pmsg.seq + 1; in console_emit_next_record()
2888 if (con->dropped && !is_extended) { in console_emit_next_record()
2889 console_prepend_dropped(&pmsg, con->dropped); in console_emit_next_record()
2890 con->dropped = 0; in console_emit_next_record()
2910 con->write(con, outbuf, pmsg.outbuf_len); in console_emit_next_record()
2914 con->seq = pmsg.seq + 1; in console_emit_next_record()
2976 if (con->seq > *next_seq) in console_flush_all()
2977 *next_seq = con->seq; in console_flush_all()
3001 * console_unlock - unblock the console subsystem from printing
3051 * Re-check if there is a new record to flush. If the trylock in console_unlock()
3059 * console_conditional_schedule - yield the CPU if required
3088 if ((console_srcu_read_flags(c) & CON_ENABLED) && c->unblank) { in console_unblank()
3102 * In that case, attempt a trylock as best-effort. in console_unblank()
3105 /* Semaphores are not NMI-safe. */ in console_unblank()
3125 if ((console_srcu_read_flags(c) & CON_ENABLED) && c->unblank) in console_unblank()
3126 c->unblank(); in console_unblank()
3137 * console_flush_on_panic - flush console content on panic
3151 * - if it is contended, it must be ignored anyway in console_flush_on_panic()
3152 * - console_lock() and console_trylock() block and fail in console_flush_on_panic()
3153 * respectively in panic for non-panic CPUs in console_flush_on_panic()
3154 * - semaphores are not NMI-safe in console_flush_on_panic()
3177 c->seq = seq; in console_flush_on_panic()
3203 if (!c->device) in console_device()
3205 driver = c->device(c, index); in console_device()
3218 * re-enable output afterwards.
3224 console_srcu_write_flags(console, console->flags & ~CON_ENABLED); in console_stop()
3240 console_srcu_write_flags(console, console->flags | CON_ENABLED); in console_start()
3251 pr_info("debug: skip boot console de-registration.\n"); in keep_bootcon_setup()
3274 i < MAX_CMDLINECONSOLES && c->name[0]; in try_enable_preferred_console()
3276 if (c->user_specified != user_specified) in try_enable_preferred_console()
3278 if (!newcon->match || in try_enable_preferred_console()
3279 newcon->match(newcon, c->name, c->index, c->options) != 0) { in try_enable_preferred_console()
3281 BUILD_BUG_ON(sizeof(c->name) != sizeof(newcon->name)); in try_enable_preferred_console()
3282 if (strcmp(c->name, newcon->name) != 0) in try_enable_preferred_console()
3284 if (newcon->index >= 0 && in try_enable_preferred_console()
3285 newcon->index != c->index) in try_enable_preferred_console()
3287 if (newcon->index < 0) in try_enable_preferred_console()
3288 newcon->index = c->index; in try_enable_preferred_console()
3293 if (newcon->setup && in try_enable_preferred_console()
3294 (err = newcon->setup(newcon, c->options)) != 0) in try_enable_preferred_console()
3297 newcon->flags |= CON_ENABLED; in try_enable_preferred_console()
3299 newcon->flags |= CON_CONSDEV; in try_enable_preferred_console()
3305 * without matching. Accept the pre-enabled consoles only when match() in try_enable_preferred_console()
3308 if (newcon->flags & CON_ENABLED && c->user_specified == user_specified) in try_enable_preferred_console()
3311 return -ENOENT; in try_enable_preferred_console()
3317 if (newcon->index < 0) in try_enable_default_console()
3318 newcon->index = 0; in try_enable_default_console()
3320 if (newcon->setup && newcon->setup(newcon, NULL) != 0) in try_enable_default_console()
3323 newcon->flags |= CON_ENABLED; in try_enable_default_console()
3325 if (newcon->device) in try_enable_default_console()
3326 newcon->flags |= CON_CONSDEV; in try_enable_default_console()
3331 (con->flags & CON_BOOT) ? "boot" : "", \
3332 con->name, con->index, ##__VA_ARGS__)
3339 if (newcon->flags & (CON_PRINTBUFFER | CON_BOOT)) { in console_init_seq()
3342 newcon->seq = syslog_seq; in console_init_seq()
3346 newcon->seq = prb_next_seq(prb); in console_init_seq()
3359 * guarantee safe access to console->seq. in console_init_seq()
3367 if (!console_flush_all(true, &newcon->seq, &handover)) { in console_init_seq()
3380 newcon->seq = prb_next_seq(prb); in console_init_seq()
3382 if ((con->flags & CON_BOOT) && in console_init_seq()
3383 (con->flags & CON_ENABLED) && in console_init_seq()
3384 con->seq < newcon->seq) { in console_init_seq()
3385 newcon->seq = con->seq; in console_init_seq()
3407 * early_printk) - sometimes before setup_arch() completes - be careful
3408 * of what kernel features are used - they may not be initialised yet.
3410 * There are two types of consoles - bootconsoles (early_printk) and
3413 * - Any number of bootconsoles can be registered at any time.
3414 * - As soon as a "real" console is registered, all bootconsoles
3416 * - Once a "real" console is registered, any attempt to register a
3430 con->name, con->index)) { in register_console()
3434 if (con->flags & CON_BOOT) in register_console()
3441 if ((newcon->flags & CON_BOOT) && realcon_registered) { in register_console()
3443 newcon->name, newcon->index); in register_console()
3460 if (hlist_empty(&console_list) || !console_first()->device || in register_console()
3461 console_first()->flags & CON_BOOT) { in register_console()
3470 if (err == -ENOENT) in register_console()
3474 if (err || newcon->flags & CON_BRL) in register_console()
3484 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV)) { in register_console()
3485 newcon->flags &= ~CON_PRINTBUFFER; in register_console()
3488 newcon->dropped = 0; in register_console()
3492 * Put this console in the list - keep the in register_console()
3497 newcon->flags |= CON_CONSDEV; in register_console()
3498 hlist_add_head_rcu(&newcon->node, &console_list); in register_console()
3500 } else if (newcon->flags & CON_CONSDEV) { in register_console()
3502 console_srcu_write_flags(console_first(), console_first()->flags & ~CON_CONSDEV); in register_console()
3503 hlist_add_head_rcu(&newcon->node, &console_list); in register_console()
3506 hlist_add_behind_rcu(&newcon->node, console_list.first); in register_console()
3519 * we get the "console xxx enabled" message on all the consoles - in register_console()
3520 * boot consoles, real consoles, etc - this is to ensure that end in register_console()
3526 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) && in register_console()
3531 if (con->flags & CON_BOOT) in register_console()
3556 console_srcu_write_flags(console, console->flags & ~CON_ENABLED); in unregister_console_locked()
3559 return -ENODEV; in unregister_console_locked()
3561 hlist_del_init_rcu(&console->node); in unregister_console_locked()
3572 if (!hlist_empty(&console_list) && console->flags & CON_CONSDEV) in unregister_console_locked()
3573 console_srcu_write_flags(console_first(), console_first()->flags | CON_CONSDEV); in unregister_console_locked()
3584 if (console->exit) in unregister_console_locked()
3585 res = console->exit(console); in unregister_console_locked()
3602 * console_force_preferred_locked - force a registered console preferred
3621 * Delete, but do not re-initialize the entry. This allows the console in console_force_preferred_locked()
3625 hlist_del_rcu(&con->node); in console_force_preferred_locked()
3630 * list pointer can be re-initialized. in console_force_preferred_locked()
3634 con->flags |= CON_CONSDEV; in console_force_preferred_locked()
3635 WARN_ON(!con->device); in console_force_preferred_locked()
3638 console_srcu_write_flags(cur_pref_con, cur_pref_con->flags & ~CON_CONSDEV); in console_force_preferred_locked()
3639 hlist_add_head_rcu(&con->node, &console_list); in console_force_preferred_locked()
3695 if (!(con->flags & CON_BOOT)) in printk_late_init()
3700 init_section_contains(con->write, 0) || in printk_late_init()
3701 init_section_contains(con->read, 0) || in printk_late_init()
3702 init_section_contains(con->device, 0) || in printk_late_init()
3703 init_section_contains(con->unblank, 0) || in printk_late_init()
3704 init_section_contains(con->data, 0)) { in printk_late_init()
3710 con->name, con->index); in printk_late_init()
3752 * console->seq. Releasing console_lock flushes more in __pr_flush()
3769 printk_seq = c->seq; in __pr_flush()
3771 diff += seq - printk_seq; in __pr_flush()
3792 remaining -= 100; in __pr_flush()
3802 * pr_flush() - Wait for printing threads to catch up.
3807 * A value of 0 for @timeout_ms means no waiting will occur. A value of -1
3822 * Delayed printk version, for scheduler-internal messages:
3872 * wake_up_klogd - Wake kernel logging daemon
3887 * defer_console_output - Wake kernel logging daemon and trigger
3933 * every 5s to make a denial-of-service attack impossible.
3944 * printk_timed_ratelimit - caller-controlled printk ratelimiting
3955 unsigned long elapsed = jiffies - *caller_jiffies; in printk_timed_ratelimit()
3969 * kmsg_dump_register - register a kernel log dumper.
3974 * set. Returns zero on success and %-EINVAL or %-EBUSY otherwise.
3979 int err = -EBUSY; in kmsg_dump_register()
3982 if (!dumper->dump) in kmsg_dump_register()
3983 return -EINVAL; in kmsg_dump_register()
3987 if (!dumper->registered) { in kmsg_dump_register()
3988 dumper->registered = 1; in kmsg_dump_register()
3989 list_add_tail_rcu(&dumper->list, &dump_list); in kmsg_dump_register()
3999 * kmsg_dump_unregister - unregister a kmsg dumper.
4003 * %-EINVAL otherwise.
4008 int err = -EINVAL; in kmsg_dump_unregister()
4011 if (dumper->registered) { in kmsg_dump_unregister()
4012 dumper->registered = 0; in kmsg_dump_unregister()
4013 list_del_rcu(&dumper->list); in kmsg_dump_unregister()
4044 * kmsg_dump - dump kernel log to kernel message dumpers.
4057 enum kmsg_dump_reason max_reason = dumper->max_reason; in kmsg_dump()
4071 dumper->dump(dumper, reason); in kmsg_dump()
4077 * kmsg_dump_get_line - retrieve one kmsg log line
4081 * @size: maximum size of the buffer
4094 char *line, size_t size, size_t *len) in kmsg_dump_get_line() argument
4103 if (iter->cur_seq < min_seq) in kmsg_dump_get_line()
4104 iter->cur_seq = min_seq; in kmsg_dump_get_line()
4106 prb_rec_init_rd(&r, &info, line, size); in kmsg_dump_get_line()
4110 if (!prb_read_valid(prb, iter->cur_seq, &r)) in kmsg_dump_get_line()
4114 if (!prb_read_valid_info(prb, iter->cur_seq, in kmsg_dump_get_line()
4123 iter->cur_seq = r.info->seq + 1; in kmsg_dump_get_line()
4133 * kmsg_dump_get_buffer - copy kmsg log lines
4137 * @size: maximum size of the buffer
4152 char *buf, size_t size, size_t *len_out) in kmsg_dump_get_buffer() argument
4163 if (!buf || !size) in kmsg_dump_get_buffer()
4166 if (iter->cur_seq < min_seq) in kmsg_dump_get_buffer()
4167 iter->cur_seq = min_seq; in kmsg_dump_get_buffer()
4169 if (prb_read_valid_info(prb, iter->cur_seq, &info, NULL)) { in kmsg_dump_get_buffer()
4170 if (info.seq != iter->cur_seq) { in kmsg_dump_get_buffer()
4172 iter->cur_seq = info.seq; in kmsg_dump_get_buffer()
4177 if (iter->cur_seq >= iter->next_seq) in kmsg_dump_get_buffer()
4182 * into the user-provided buffer for this dump. Pass in size-1 in kmsg_dump_get_buffer()
4184 * not write more than size-1 bytes of text into @buf. in kmsg_dump_get_buffer()
4186 seq = find_first_fitting_seq(iter->cur_seq, iter->next_seq, in kmsg_dump_get_buffer()
4187 size - 1, syslog, time); in kmsg_dump_get_buffer()
4195 prb_rec_init_rd(&r, &info, buf, size); in kmsg_dump_get_buffer()
4199 if (r.info->seq >= iter->next_seq) in kmsg_dump_get_buffer()
4205 prb_rec_init_rd(&r, &info, buf + len, size - len); in kmsg_dump_get_buffer()
4208 iter->next_seq = next_seq; in kmsg_dump_get_buffer()
4218 * kmsg_dump_rewind - reset the iterator
4227 iter->cur_seq = latched_seq_read_nolock(&clear_seq); in kmsg_dump_rewind()
4228 iter->next_seq = prb_next_seq(prb); in kmsg_dump_rewind()
4235 static atomic_t printk_cpu_sync_owner = ATOMIC_INIT(-1);
4239 * __printk_cpu_sync_wait() - Busy wait until the printk cpu-reentrant
4248 } while (atomic_read(&printk_cpu_sync_owner) != -1); in __printk_cpu_sync_wait()
4253 * __printk_cpu_sync_try_get() - Try to acquire the printk cpu-reentrant
4289 old = atomic_cmpxchg_acquire(&printk_cpu_sync_owner, -1, in __printk_cpu_sync_try_get()
4291 if (old == -1) { in __printk_cpu_sync_try_get()
4309 * __printk_cpu_sync_put() - Release the printk cpu-reentrant spinning lock.
4346 -1); /* LMM(__printk_cpu_sync_put:B) */ in __printk_cpu_sync_put()