tree:
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
linux-5.10.y-rt-rebase
head: 87b7b3d2cb296950a0e3005406899ccfbbc9da7c
commit: ca4fcaa60de914c0ef6864983a8488bf5ab6cafb [57/209] printk: move console printing to
kthreads
config: ia64-allnoconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
#
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/com...
git remote add linux-rt-devel
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
git fetch --no-tags linux-rt-devel linux-5.10.y-rt-rebase
git checkout ca4fcaa60de914c0ef6864983a8488bf5ab6cafb
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=ia64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All errors (new ones prefixed by >>):
In file included from arch/ia64/include/asm/pgtable.h:154,
from include/linux/pgtable.h:6,
from include/linux/mm.h:33,
from kernel/printk/printk.c:23:
arch/ia64/include/asm/mmu_context.h: In function 'reload_context':
arch/ia64/include/asm/mmu_context.h:137:41: warning: variable 'old_rr4' set but
not used [-Wunused-but-set-variable]
137 | unsigned long rr0, rr1, rr2, rr3, rr4, old_rr4;
| ^~~~~~~
In file included from kernel/printk/printk.c:63:
kernel/printk/internal.h: At top level:
kernel/printk/internal.h:56:20: warning: no previous prototype for
'vprintk_func' [-Wmissing-prototypes]
56 | __printf(1, 0) int vprintk_func(const char *fmt, va_list args) { return 0; }
| ^~~~~~~~~~~~
kernel/printk/printk.c:180:5: warning: no previous prototype for
'devkmsg_sysctl_set_loglvl' [-Wmissing-prototypes]
180 | int devkmsg_sysctl_set_loglvl(struct ctl_table *table, int write,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ./arch/ia64/include/generated/asm/rwonce.h:1,
from include/linux/compiler.h:232,
from include/linux/kernel.h:11,
from kernel/printk/printk.c:22:
kernel/printk/printk.c: In function 'register_console':
> kernel/printk/printk.c:2677:50: error: 'prb' undeclared
(first use in this function)
2677 | atomic64_set(&newcon->printk_seq,
prb_next_seq(prb));
| ^~~
include/asm-generic/rwonce.h:55:33: note: in definition of macro
'__WRITE_ONCE'
55 | *(volatile typeof(x) *)&(x) = (val); \
| ^~~
arch/ia64/include/asm/atomic.h:28:27: note: in expansion of macro 'WRITE_ONCE'
28 | #define atomic64_set(v,i) WRITE_ONCE(((v)->counter), (i))
| ^~~~~~~~~~
kernel/printk/printk.c:2677:3: note: in expansion of macro 'atomic64_set'
2677 | atomic64_set(&newcon->printk_seq, prb_next_seq(prb));
| ^~~~~~~~~~~~
kernel/printk/printk.c:2677:50: note: each undeclared identifier is reported only once
for each function it appears in
2677 | atomic64_set(&newcon->printk_seq, prb_next_seq(prb));
| ^~~
include/asm-generic/rwonce.h:55:33: note: in definition of macro
'__WRITE_ONCE'
55 | *(volatile typeof(x) *)&(x) = (val); \
| ^~~
arch/ia64/include/asm/atomic.h:28:27: note: in expansion of macro 'WRITE_ONCE'
28 | #define atomic64_set(v,i) WRITE_ONCE(((v)->counter), (i))
| ^~~~~~~~~~
kernel/printk/printk.c:2677:3: note: in expansion of macro 'atomic64_set'
2677 | atomic64_set(&newcon->printk_seq, prb_next_seq(prb));
| ^~~~~~~~~~~~
In file included from include/linux/mmzone.h:10,
from include/linux/gfp.h:6,
from include/linux/mm.h:10,
from kernel/printk/printk.c:23:
kernel/printk/printk.c: In function 'printk_kthread_func':
> kernel/printk/printk.c:2836:36: error: 'log_wait'
undeclared (first use in this function); did you mean 'poll_wait'?
2836
| error = wait_event_interruptible(log_wait,
| ^~~~~~~~
include/linux/wait.h:272:39: note: in definition of macro '___wait_event'
272 | long __int = prepare_to_wait_event(&wq_head, &__wq_entry, state);\
| ^~~~~~~
include/linux/wait.h:465:11: note: in expansion of macro
'__wait_event_interruptible'
465 | __ret = __wait_event_interruptible(wq_head, condition); \
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
kernel/printk/printk.c:2836:11: note: in expansion of macro
'wait_event_interruptible'
2836 | error = wait_event_interruptible(log_wait,
| ^~~~~~~~~~~~~~~~~~~~~~~~
kernel/printk/printk.c:2877:7: error: implicit declaration of function
'kernel_sync_mode' [-Werror=implicit-function-declaration]
2877 | if (kernel_sync_mode() && con->write_atomic) {
| ^~~~~~~~~~~~~~~~
> kernel/printk/printk.c:2889:4: error: implicit declaration of
function 'printk_delay'; did you mean 'print_dev_t'?
[-Werror=implicit-function-declaration]
2889 |
printk_delay(r.info->level);
| ^~~~~~~~~~~~
| print_dev_t
kernel/printk/printk.c: In function 'console_try_thread':
> kernel/printk/printk.c:2938:8: error: implicit declaration of
function 'get_sprint_buf' [-Werror=implicit-function-declaration]
2938 |
buf = get_sprint_buf(&sprint_id, &irqflags);
| ^~~~~~~~~~~~~~
kernel/printk/printk.c:2938:6: warning: assignment to 'char *' from
'int' makes pointer from integer without a cast [-Wint-conversion]
2938 | buf = get_sprint_buf(&sprint_id, &irqflags);
| ^
> kernel/printk/printk.c:2942:2: error: implicit declaration of
function 'print_sync_until' [-Werror=implicit-function-declaration]
2942
| print_sync_until(prb_next_seq(prb), con, buf, PREFIX_MAX + LOG_LINE_MAX);
| ^~~~~~~~~~~~~~~~
kernel/printk/printk.c:2942:32: error: 'prb' undeclared (first use in this
function)
2942 | print_sync_until(prb_next_seq(prb), con, buf, PREFIX_MAX + LOG_LINE_MAX);
| ^~~
> kernel/printk/printk.c:2944:2: error: implicit declaration of
function 'put_sprint_buf' [-Werror=implicit-function-declaration]
2944 |
put_sprint_buf(sprint_id, irqflags);
| ^~~~~~~~~~~~~~
kernel/printk/printk.c: At top level:
kernel/printk/printk.c:3483:6: warning: no previous prototype for 'prb_lock'
[-Wmissing-prototypes]
3483 | void prb_lock(struct prb_cpulock *cpu_lock, unsigned int *cpu_store)
| ^~~~~~~~
kernel/printk/printk.c:3501:6: warning: no previous prototype for 'prb_unlock'
[-Wmissing-prototypes]
3501 | void prb_unlock(struct prb_cpulock *cpu_lock, unsigned int cpu_store)
| ^~~~~~~~~~
kernel/printk/printk.c:2094:13: warning: 'call_console_drivers' defined but not
used [-Wunused-function]
2094 | static void call_console_drivers(const char *ext_text, size_t ext_len,
| ^~~~~~~~~~~~~~~~~~~~
kernel/printk/printk.c:2079:12: warning: 'syslog_seq' defined but not used
[-Wunused-variable]
2079 | static u64 syslog_seq;
| ^~~~~~~~~~
kernel/printk/printk.c:84:13: warning: 'sync_mode' defined but not used
[-Wunused-variable]
84 | static bool sync_mode;
| ^~~~~~~~~
cc1: some warnings being treated as errors
vim +/prb +2677 kernel/printk/printk.c
2563
2564 /*
2565 * The console driver calls this routine during kernel initialization
2566 * to register the console printing procedure with printk() and to
2567 * print any messages that were printed by the kernel before the
2568 * console driver was initialized.
2569 *
2570 * This can happen pretty early during the boot process (because of
2571 * early_printk) - sometimes before setup_arch() completes - be careful
2572 * of what kernel features are used - they may not be initialised yet.
2573 *
2574 * There are two types of consoles - bootconsoles (early_printk) and
2575 * "real" consoles (everything which is not a bootconsole) which are
2576 * handled differently.
2577 * - Any number of bootconsoles can be registered at any time.
2578 * - As soon as a "real" console is registered, all bootconsoles
2579 * will be unregistered automatically.
2580 * - Once a "real" console is registered, any attempt to register a
2581 * bootconsoles will be rejected
2582 */
2583 void register_console(struct console *newcon)
2584 {
2585 struct console *bcon = NULL;
2586 int err;
2587
2588 for_each_console(bcon) {
2589 if (WARN(bcon == newcon, "console '%s%d' already
registered\n",
2590 bcon->name, bcon->index))
2591 return;
2592 }
2593
2594 /*
2595 * before we register a new CON_BOOT console, make sure we don't
2596 * already have a valid console
2597 */
2598 if (newcon->flags & CON_BOOT) {
2599 for_each_console(bcon) {
2600 if (!(bcon->flags & CON_BOOT)) {
2601 pr_info("Too late to register bootconsole %s%d\n",
2602 newcon->name, newcon->index);
2603 return;
2604 }
2605 }
2606 }
2607
2608 newcon->thread = NULL;
2609
2610 if (console_drivers && console_drivers->flags & CON_BOOT)
2611 bcon = console_drivers;
2612
2613 if (!has_preferred_console || bcon || !console_drivers)
2614 has_preferred_console = preferred_console >= 0;
2615
2616 /*
2617 * See if we want to use this console driver. If we
2618 * didn't select a console we take the first one
2619 * that registers here.
2620 */
2621 if (!has_preferred_console) {
2622 if (newcon->index < 0)
2623 newcon->index = 0;
2624 if (newcon->setup == NULL ||
2625 newcon->setup(newcon, NULL) == 0) {
2626 newcon->flags |= CON_ENABLED;
2627 if (newcon->device) {
2628 newcon->flags |= CON_CONSDEV;
2629 has_preferred_console = true;
2630 }
2631 }
2632 }
2633
2634 /* See if this console matches one we selected on the command line */
2635 err = try_enable_new_console(newcon, true);
2636
2637 /* If not, try to match against the platform default(s) */
2638 if (err == -ENOENT)
2639 err = try_enable_new_console(newcon, false);
2640
2641 /* printk() messages are not printed to the Braille console. */
2642 if (err || newcon->flags & CON_BRL)
2643 return;
2644
2645 /*
2646 * If we have a bootconsole, and are switching to a real console,
2647 * don't print everything out again, since when the boot console, and
2648 * the real console are the same physical device, it's annoying to
2649 * see the beginning boot messages twice
2650 */
2651 if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) ==
CON_CONSDEV))
2652 newcon->flags &= ~CON_PRINTBUFFER;
2653
2654 /*
2655 * Put this console in the list - keep the
2656 * preferred driver at the head of the list.
2657 */
2658 console_lock();
2659 if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
2660 newcon->next = console_drivers;
2661 console_drivers = newcon;
2662 if (newcon->next)
2663 newcon->next->flags &= ~CON_CONSDEV;
2664 /* Ensure this flag is always set for the head of the list */
2665 newcon->flags |= CON_CONSDEV;
2666 } else {
2667 newcon->next = console_drivers->next;
2668 console_drivers->next = newcon;
2669 }
2670
2671 if (newcon->flags & CON_EXTENDED)
2672 nr_ext_console_drivers++;
2673
2674 if (newcon->flags & CON_PRINTBUFFER)
2675 atomic64_set(&newcon->printk_seq, 0);
2676 else
2677 atomic64_set(&newcon->printk_seq, prb_next_seq(prb));
2678
2679 console_try_thread(newcon);
2680 console_unlock();
2681 console_sysfs_notify();
2682
2683 /*
2684 * By unregistering the bootconsoles after we enable the real console
2685 * we get the "console xxx enabled" message on all the consoles -
2686 * boot consoles, real consoles, etc - this is to ensure that end
2687 * users know there might be something in the kernel's log buffer that
2688 * went to the bootconsole (that they do not see on the real console)
2689 */
2690 pr_info("%sconsole [%s%d] enabled\n",
2691 (newcon->flags & CON_BOOT) ? "boot" : "" ,
2692 newcon->name, newcon->index);
2693 if (bcon &&
2694 ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
2695 !keep_bootcon) {
2696 /* We need to iterate through all boot consoles, to make
2697 * sure we print everything out, before we unregister them.
2698 */
2699 for_each_console(bcon)
2700 if (bcon->flags & CON_BOOT)
2701 unregister_console(bcon);
2702 }
2703 }
2704 EXPORT_SYMBOL(register_console);
2705
2706 int unregister_console(struct console *console)
2707 {
2708 struct console *con;
2709 int res;
2710
2711 pr_info("%sconsole [%s%d] disabled\n",
2712 (console->flags & CON_BOOT) ? "boot" : "" ,
2713 console->name, console->index);
2714
2715 res = _braille_unregister_console(console);
2716 if (res < 0)
2717 return res;
2718 if (res > 0)
2719 return 0;
2720
2721 res = -ENODEV;
2722 console_lock();
2723 if (console_drivers == console) {
2724 console_drivers=console->next;
2725 res = 0;
2726 } else {
2727 for_each_console(con) {
2728 if (con->next == console) {
2729 con->next = console->next;
2730 res = 0;
2731 break;
2732 }
2733 }
2734 }
2735
2736 if (res)
2737 goto out_disable_unlock;
2738
2739 if (console->flags & CON_EXTENDED)
2740 nr_ext_console_drivers--;
2741
2742 /*
2743 * If this isn't the last console and it has CON_CONSDEV set, we
2744 * need to set it on the next preferred console.
2745 */
2746 if (console_drivers != NULL && console->flags & CON_CONSDEV)
2747 console_drivers->flags |= CON_CONSDEV;
2748
2749 console->flags &= ~CON_ENABLED;
2750 console_unlock();
2751 console_sysfs_notify();
2752
2753 if (console->thread && !IS_ERR(console->thread))
2754 kthread_stop(console->thread);
2755
2756 if (console->exit)
2757 res = console->exit(console);
2758
2759 return res;
2760
2761 out_disable_unlock:
2762 console->flags &= ~CON_ENABLED;
2763 console_unlock();
2764
2765 return res;
2766 }
2767 EXPORT_SYMBOL(unregister_console);
2768
2769 /*
2770 * Initialize the console device. This is called *early*, so
2771 * we can't necessarily depend on lots of kernel help here.
2772 * Just do some early initializations, and do the complex setup
2773 * later.
2774 */
2775 void __init console_init(void)
2776 {
2777 int ret;
2778 initcall_t call;
2779 initcall_entry_t *ce;
2780
2781 /* Setup the default TTY line discipline. */
2782 n_tty_init();
2783
2784 /*
2785 * set up the console device so that later boot sequences can
2786 * inform about problems etc..
2787 */
2788 ce = __con_initcall_start;
2789 trace_initcall_level("console");
2790 while (ce < __con_initcall_end) {
2791 call = initcall_from_entry(ce);
2792 trace_initcall_start(call);
2793 ret = call();
2794 trace_initcall_finish(call, ret);
2795 ce++;
2796 }
2797 }
2798
2799 static int printk_kthread_func(void *data)
2800 {
2801 struct console *con = data;
2802 unsigned long dropped = 0;
2803 struct printk_info info;
2804 struct printk_record r;
2805 char *ext_text = NULL;
2806 size_t dropped_len;
2807 char *dropped_text;
2808 int ret = -ENOMEM;
2809 char *write_text;
2810 u64 printk_seq;
2811 size_t len;
2812 char *text;
2813 int error;
2814 u64 seq;
2815
2816 if (con->flags & CON_EXTENDED) {
2817 ext_text = kmalloc(CONSOLE_EXT_LOG_MAX, GFP_KERNEL);
2818 if (!ext_text)
2819 return ret;
2820 }
2821 text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
2822 dropped_text = kmalloc(64, GFP_KERNEL);
2823 if (!text || !dropped_text)
2824 goto out;
2825
2826 if (con->flags & CON_EXTENDED)
2827 write_text = ext_text;
2828 else
2829 write_text = text;
2830
2831 seq = atomic64_read(&con->printk_seq);
2832
2833 prb_rec_init_rd(&r, &info, text, LOG_LINE_MAX + PREFIX_MAX);
2834
2835 for (;;) {
2836 error = wait_event_interruptible(log_wait,
2837 prb_read_valid(prb, seq, &r) || kthread_should_stop());
2838
2839 if (kthread_should_stop())
2840 break;
2841
2842 if (error)
2843 continue;
2844
2845 if (seq != r.info->seq) {
2846 dropped += r.info->seq - seq;
2847 seq = r.info->seq;
2848 }
2849
2850 seq++;
2851
2852 if (!(con->flags & CON_ENABLED))
2853 continue;
2854
2855 if (suppress_message_printing(r.info->level))
2856 continue;
2857
2858 if (con->flags & CON_EXTENDED) {
2859 len = info_print_ext_header(ext_text,
2860 CONSOLE_EXT_LOG_MAX,
2861 r.info);
2862 len += msg_print_ext_body(ext_text + len,
2863 CONSOLE_EXT_LOG_MAX - len,
2864 &r.text_buf[0], r.info->text_len,
2865 &r.info->dev_info);
2866 } else {
2867 len = record_print_text(&r,
2868 console_msg_format & MSG_FORMAT_SYSLOG,
2869 printk_time);
2870 }
2871
2872 printk_seq = atomic64_read(&con->printk_seq);
2873
2874 console_lock();
2875 console_may_schedule = 0;
2876
2877 if (kernel_sync_mode() && con->write_atomic) {
2878 console_unlock();
2879 break;
2880 }
2881
2882 if (!(con->flags & CON_EXTENDED) && dropped) {
2883 dropped_len = snprintf(dropped_text, 64,
2884 "** %lu printk messages dropped **\n",
2885 dropped);
2886 dropped = 0;
2887
2888 con->write(con, dropped_text, dropped_len);
2889 printk_delay(r.info->level);
2890 }
2891
2892 con->write(con, write_text, len);
2893 if (len)
2894 printk_delay(r.info->level);
2895
2896 atomic64_cmpxchg_relaxed(&con->printk_seq, printk_seq, seq);
2897
2898 console_unlock();
2899 }
2900 out:
2901 kfree(dropped_text);
2902 kfree(text);
2903 kfree(ext_text);
2904 pr_info("%sconsole [%s%d]: printing thread stopped\n",
2905 (con->flags & CON_BOOT) ? "boot" : "" ,
2906 con->name, con->index);
2907 return ret;
2908 }
2909
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org