17 Dec, 2018

5 commits

  • [ Upstream commit c14376de3a1befa70d9811ca2872d47367b48767 ]

    wake_klogd is a local variable in console_unlock(). The information
    is lost when the console_lock owner using the busy wait added by
    the commit dbdda842fe96f8932 ("printk: Add console owner and waiter
    logic to load balance console writes"). The following race is
    possible:

    CPU0 CPU1
    console_unlock()

    for (;;)
    /* calling console for last message */

    printk()
    log_store()
    log_next_seq++;

    /* see new message */
    if (seen_seq != log_next_seq) {
    wake_klogd = true;
    seen_seq = log_next_seq;
    }

    console_lock_spinning_enable();

    if (console_trylock_spinning())
    /* spinning */

    if (console_lock_spinning_disable_and_check()) {
    printk_safe_exit_irqrestore(flags);
    return;

    console_unlock()
    if (seen_seq != log_next_seq) {
    /* already seen */
    /* nothing to do */

    Result: Nobody would wakeup klogd.

    One solution would be to make a global variable from wake_klogd.
    But then we would need to manipulate it under a lock or so.

    This patch wakes klogd also when console_lock is passed to the
    spinning waiter. It looks like the right way to go. Also userspace
    should have a chance to see and store any "flood" of messages.

    Note that the very late klogd wake up was a historic solution.
    It made sense on single CPU systems or when sys_syslog() operations
    were synchronized using the big kernel lock like in v2.1.113.
    But it is questionable these days.

    Fixes: dbdda842fe96f8932 ("printk: Add console owner and waiter logic to load balance console writes")
    Link: http://lkml.kernel.org/r/20180226155734.dzwg3aovqnwtvkoy@pathway.suse.cz
    Cc: Steven Rostedt
    Cc: linux-kernel@vger.kernel.org
    Cc: Tejun Heo
    Suggested-by: Sergey Senozhatsky
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Sasha Levin

    Petr Mladek
     
  • [ Upstream commit fd5f7cde1b85d4c8e09ca46ce948e008a2377f64 ]

    This patch, basically, reverts commit 6b97a20d3a79 ("printk:
    set may_schedule for some of console_trylock() callers").
    That commit was a mistake, it introduced a big dependency
    on the scheduler, by enabling preemption under console_sem
    in printk()->console_unlock() path, which is rather too
    critical. The patch did not significantly reduce the
    possibilities of printk() lockups, but made it possible to
    stall printk(), as has been reported by Tetsuo Handa [1].

    Another issues is that preemption under console_sem also
    messes up with Steven Rostedt's hand off scheme, by making
    it possible to sleep with console_sem both in console_unlock()
    and in vprintk_emit(), after acquiring the console_sem
    ownership (anywhere between printk_safe_exit_irqrestore() in
    console_trylock_spinning() and printk_safe_enter_irqsave()
    in console_unlock()). This makes hand off less likely and,
    at the same time, may result in a significant amount of
    pending logbuf messages. Preempted console_sem owner makes
    it impossible for other CPUs to emit logbuf messages, but
    does not make it impossible for other CPUs to append new
    messages to the logbuf.

    Reinstate the old behavior and make printk() non-preemptible.
    Should any printk() lockup reports arrive they must be handled
    in a different way.

    [1] http://lkml.kernel.org/r/201603022101.CAH73907.OVOOMFHFFtQJSL%20()%20I-love%20!%20SAKURA%20!%20ne%20!%20jp
    Fixes: 6b97a20d3a79 ("printk: set may_schedule for some of console_trylock() callers")
    Link: http://lkml.kernel.org/r/20180116044716.GE6607@jagdpanzerIV
    To: Tetsuo Handa
    Cc: Sergey Senozhatsky
    Cc: Tejun Heo
    Cc: akpm@linux-foundation.org
    Cc: linux-mm@kvack.org
    Cc: Cong Wang
    Cc: Dave Hansen
    Cc: Johannes Weiner
    Cc: Mel Gorman
    Cc: Michal Hocko
    Cc: Vlastimil Babka
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: Jan Kara
    Cc: Mathieu Desnoyers
    Cc: Byungchul Park
    Cc: Pavel Machek
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sergey Senozhatsky
    Reported-by: Tetsuo Handa
    Reviewed-by: Steven Rostedt (VMware)
    Signed-off-by: Petr Mladek
    Signed-off-by: Sasha Levin

    Sergey Senozhatsky
     
  • [ Upstream commit c162d5b4338d72deed61aa65ed0f2f4ba2bbc8ab ]

    The commit ("printk: Add console owner and waiter logic to load balance
    console writes") made vprintk_emit() and console_unlock() even more
    complicated.

    This patch extracts the new code into 3 helper functions. They should
    help to keep it rather self-contained. It will be easier to use and
    maintain.

    This patch just shuffles the existing code. It does not change
    the functionality.

    Link: http://lkml.kernel.org/r/20180112160837.GD24497@linux.suse
    Cc: akpm@linux-foundation.org
    Cc: linux-mm@kvack.org
    Cc: Cong Wang
    Cc: Dave Hansen
    Cc: Johannes Weiner
    Cc: Mel Gorman
    Cc: Michal Hocko
    Cc: Vlastimil Babka
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: Jan Kara
    Cc: Mathieu Desnoyers
    Cc: Tetsuo Handa
    Cc: rostedt@home.goodmis.org
    Cc: Byungchul Park
    Cc: Tejun Heo
    Cc: Pavel Machek
    Cc: linux-kernel@vger.kernel.org
    Reviewed-by: Steven Rostedt (VMware)
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Sasha Levin

    Petr Mladek
     
  • [ Upstream commit dbdda842fe96f8932bae554f0adf463c27c42bc7 ]

    This patch implements what I discussed in Kernel Summit. I added
    lockdep annotation (hopefully correctly), and it hasn't had any splats
    (since I fixed some bugs in the first iterations). It did catch
    problems when I had the owner covering too much. But now that the owner
    is only set when actively calling the consoles, lockdep has stayed
    quiet.

    Here's the design again:

    I added a "console_owner" which is set to a task that is actively
    writing to the consoles. It is *not* the same as the owner of the
    console_lock. It is only set when doing the calls to the console
    functions. It is protected by a console_owner_lock which is a raw spin
    lock.

    There is a console_waiter. This is set when there is an active console
    owner that is not current, and waiter is not set. This too is protected
    by console_owner_lock.

    In printk() when it tries to write to the consoles, we have:

    if (console_trylock())
    console_unlock();

    Now I added an else, which will check if there is an active owner, and
    no current waiter. If that is the case, then console_waiter is set, and
    the task goes into a spin until it is no longer set.

    When the active console owner finishes writing the current message to
    the consoles, it grabs the console_owner_lock and sees if there is a
    waiter, and clears console_owner.

    If there is a waiter, then it breaks out of the loop, clears the waiter
    flag (because that will release the waiter from its spin), and exits.
    Note, it does *not* release the console semaphore. Because it is a
    semaphore, there is no owner. Another task may release it. This means
    that the waiter is guaranteed to be the new console owner! Which it
    becomes.

    Then the waiter calls console_unlock() and continues to write to the
    consoles.

    If another task comes along and does a printk() it too can become the
    new waiter, and we wash rinse and repeat!

    By Petr Mladek about possible new deadlocks:

    The thing is that we move console_sem only to printk() call
    that normally calls console_unlock() as well. It means that
    the transferred owner should not bring new type of dependencies.
    As Steven said somewhere: "If there is a deadlock, it was
    there even before."

    We could look at it from this side. The possible deadlock would
    look like:

    CPU0 CPU1

    console_unlock()

    console_owner = current;

    spin_lockA()
    printk()
    spin = true;
    while (...)

    call_console_drivers()
    spin_lockA()

    This would be a deadlock. CPU0 would wait for the lock A.
    While CPU1 would own the lockA and would wait for CPU0
    to finish calling the console drivers and pass the console_sem
    owner.

    But if the above is true than the following scenario was
    already possible before:

    CPU0

    spin_lockA()
    printk()
    console_unlock()
    call_console_drivers()
    spin_lockA()

    By other words, this deadlock was there even before. Such
    deadlocks are prevented by using printk_deferred() in
    the sections guarded by the lock A.

    By Steven Rostedt:

    To demonstrate the issue, this module has been shown to lock up a
    system with 4 CPUs and a slow console (like a serial console). It is
    also able to lock up a 8 CPU system with only a fast (VGA) console, by
    passing in "loops=100". The changes in this commit prevent this module
    from locking up the system.

    #include
    #include
    #include
    #include
    #include
    #include

    static bool stop_testing;
    static unsigned int loops = 1;

    static void preempt_printk_workfn(struct work_struct *work)
    {
    int i;

    while (!READ_ONCE(stop_testing)) {
    for (i = 0; i < loops && !READ_ONCE(stop_testing); i++) {
    preempt_disable();
    pr_emerg("%5d%-75s\n", smp_processor_id(),
    " XXX NOPREEMPT");
    preempt_enable();
    }
    msleep(1);
    }
    }

    static struct work_struct __percpu *works;

    static void finish(void)
    {
    int cpu;

    WRITE_ONCE(stop_testing, true);
    for_each_online_cpu(cpu)
    flush_work(per_cpu_ptr(works, cpu));
    free_percpu(works);
    }

    static int __init test_init(void)
    {
    int cpu;

    works = alloc_percpu(struct work_struct);
    if (!works)
    return -ENOMEM;

    /*
    * This is just a test module. This will break if you
    * do any CPU hot plugging between loading and
    * unloading the module.
    */

    for_each_online_cpu(cpu) {
    struct work_struct *work = per_cpu_ptr(works, cpu);

    INIT_WORK(work, &preempt_printk_workfn);
    schedule_work_on(cpu, work);
    }

    return 0;
    }

    static void __exit test_exit(void)
    {
    finish();
    }

    module_param(loops, uint, 0);
    module_init(test_init);
    module_exit(test_exit);
    MODULE_LICENSE("GPL");

    Link: http://lkml.kernel.org/r/20180110132418.7080-2-pmladek@suse.com
    Cc: akpm@linux-foundation.org
    Cc: linux-mm@kvack.org
    Cc: Cong Wang
    Cc: Dave Hansen
    Cc: Johannes Weiner
    Cc: Mel Gorman
    Cc: Michal Hocko
    Cc: Vlastimil Babka
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: Jan Kara
    Cc: Mathieu Desnoyers
    Cc: Tetsuo Handa
    Cc: Byungchul Park
    Cc: Tejun Heo
    Cc: Pavel Machek
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Steven Rostedt (VMware)
    [pmladek@suse.com: Commit message about possible deadlocks]
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Sasha Levin

    Steven Rostedt (VMware)
     
  • This reverts commit c9b8d580b3fb0ab65d37c372aef19a318fda3199.

    This is just a technical revert to make the printk fix apply cleanly,
    this patch will be re-picked in about 3 commits.

    Sasha Levin
     

21 Nov, 2018

1 commit

  • commit fd5f7cde1b85d4c8e09ca46ce948e008a2377f64 upstream.

    This patch, basically, reverts commit 6b97a20d3a79 ("printk:
    set may_schedule for some of console_trylock() callers").
    That commit was a mistake, it introduced a big dependency
    on the scheduler, by enabling preemption under console_sem
    in printk()->console_unlock() path, which is rather too
    critical. The patch did not significantly reduce the
    possibilities of printk() lockups, but made it possible to
    stall printk(), as has been reported by Tetsuo Handa [1].

    Another issues is that preemption under console_sem also
    messes up with Steven Rostedt's hand off scheme, by making
    it possible to sleep with console_sem both in console_unlock()
    and in vprintk_emit(), after acquiring the console_sem
    ownership (anywhere between printk_safe_exit_irqrestore() in
    console_trylock_spinning() and printk_safe_enter_irqsave()
    in console_unlock()). This makes hand off less likely and,
    at the same time, may result in a significant amount of
    pending logbuf messages. Preempted console_sem owner makes
    it impossible for other CPUs to emit logbuf messages, but
    does not make it impossible for other CPUs to append new
    messages to the logbuf.

    Reinstate the old behavior and make printk() non-preemptible.
    Should any printk() lockup reports arrive they must be handled
    in a different way.

    [1] http://lkml.kernel.org/r/201603022101.CAH73907.OVOOMFHFFtQJSL%20()%20I-love%20!%20SAKURA%20!%20ne%20!%20jp
    Fixes: 6b97a20d3a79 ("printk: set may_schedule for some of console_trylock() callers")
    Link: http://lkml.kernel.org/r/20180116044716.GE6607@jagdpanzerIV
    To: Tetsuo Handa
    Cc: Sergey Senozhatsky
    Cc: Tejun Heo
    Cc: akpm@linux-foundation.org
    Cc: linux-mm@kvack.org
    Cc: Cong Wang
    Cc: Dave Hansen
    Cc: Johannes Weiner
    Cc: Mel Gorman
    Cc: Michal Hocko
    Cc: Vlastimil Babka
    Cc: Peter Zijlstra
    Cc: Linus Torvalds
    Cc: Jan Kara
    Cc: Mathieu Desnoyers
    Cc: Byungchul Park
    Cc: Pavel Machek
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sergey Senozhatsky
    Reported-by: Tetsuo Handa
    Reviewed-by: Steven Rostedt (VMware)
    Signed-off-by: Petr Mladek
    Signed-off-by: Sudip Mukherjee
    Signed-off-by: Greg Kroah-Hartman

    Sergey Senozhatsky
     

14 Nov, 2018

1 commit

  • commit 277fcdb2cfee38ccdbe07e705dbd4896ba0c9930 upstream.

    log_buf_len_setup does not check input argument before passing it to
    simple_strtoull. The argument would be a NULL pointer if "log_buf_len",
    without its value, is set in command line and thus causes the following
    panic.

    PANIC: early exception 0xe3 IP 10:ffffffffaaeacd0d error 0 cr2 0x0
    [ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.19.0-rc4-yocto-standard+ #1
    [ 0.000000] RIP: 0010:_parse_integer_fixup_radix+0xd/0x70
    ...
    [ 0.000000] Call Trace:
    [ 0.000000] simple_strtoull+0x29/0x70
    [ 0.000000] memparse+0x26/0x90
    [ 0.000000] log_buf_len_setup+0x17/0x22
    [ 0.000000] do_early_param+0x57/0x8e
    [ 0.000000] parse_args+0x208/0x320
    [ 0.000000] ? rdinit_setup+0x30/0x30
    [ 0.000000] parse_early_options+0x29/0x2d
    [ 0.000000] ? rdinit_setup+0x30/0x30
    [ 0.000000] parse_early_param+0x36/0x4d
    [ 0.000000] setup_arch+0x336/0x99e
    [ 0.000000] start_kernel+0x6f/0x4ee
    [ 0.000000] x86_64_start_reservations+0x24/0x26
    [ 0.000000] x86_64_start_kernel+0x6f/0x72
    [ 0.000000] secondary_startup_64+0xa4/0xb0

    This patch adds a check to prevent the panic.

    Link: http://lkml.kernel.org/r/1538239553-81805-1-git-send-email-zhe.he@windriver.com
    Cc: stable@vger.kernel.org
    Cc: rostedt@goodmis.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: He Zhe
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Greg Kroah-Hartman

    He Zhe
     

10 Sep, 2018

1 commit

  • commit d1c392c9e2a301f38998a353f467f76414e38725 upstream.

    I hit the following splat in my tests:

    ------------[ cut here ]------------
    IRQs not enabled as expected
    WARNING: CPU: 3 PID: 0 at kernel/time/tick-sched.c:982 tick_nohz_idle_enter+0x44/0x8c
    Modules linked in: ip6t_REJECT nf_reject_ipv6 ip6table_filter ip6_tables ipv6
    CPU: 3 PID: 0 Comm: swapper/3 Not tainted 4.19.0-rc2-test+ #2
    Hardware name: MSI MS-7823/CSM-H87M-G43 (MS-7823), BIOS V1.6 02/22/2014
    EIP: tick_nohz_idle_enter+0x44/0x8c
    Code: ec 05 00 00 00 75 26 83 b8 c0 05 00 00 00 75 1d 80 3d d0 36 3e c1 00
    75 14 68 94 63 12 c1 c6 05 d0 36 3e c1 01 e8 04 ee f8 ff 0b 58 fa bb a0
    e5 66 c1 e8 25 0f 04 00 64 03 1d 28 31 52 c1 8b
    EAX: 0000001c EBX: f26e7f8c ECX: 00000006 EDX: 00000007
    ESI: f26dd1c0 EDI: 00000000 EBP: f26e7f40 ESP: f26e7f38
    DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 EFLAGS: 00010296
    CR0: 80050033 CR2: 0813c6b0 CR3: 2f342000 CR4: 001406f0
    Call Trace:
    do_idle+0x33/0x202
    cpu_startup_entry+0x61/0x63
    start_secondary+0x18e/0x1ed
    startup_32_smp+0x164/0x168
    irq event stamp: 18773830
    hardirqs last enabled at (18773829): [] trace_hardirqs_on_thunk+0xc/0x10
    hardirqs last disabled at (18773830): [] trace_hardirqs_off_thunk+0xc/0x10
    softirqs last enabled at (18773824): [] __do_softirq+0x25f/0x2bf
    softirqs last disabled at (18773767): [] call_on_stack+0x45/0x4b
    ---[ end trace b7c64aa79e17954a ]---

    After a bit of debugging, I found what was happening. This would trigger
    when performing "perf" with a high NMI interrupt rate, while enabling and
    disabling function tracer. Ftrace uses breakpoints to convert the nops at
    the start of functions to calls to the function trampolines. The breakpoint
    traps disable interrupts and this makes calls into lockdep via the
    trace_hardirqs_off_thunk in the entry.S code. What happens is the following:

    do_idle {

    [interrupts enabled]

    [interrupts disabled]
    TRACE_IRQS_OFF [lockdep says irqs off]
    [...]
    TRACE_IRQS_IRET
    test if pt_regs say return to interrupts enabled [yes]
    TRACE_IRQS_ON [lockdep says irqs are on]


    nmi_enter() {
    printk_nmi_enter() [traced by ftrace]
    [ hit ftrace breakpoint ]

    TRACE_IRQS_OFF [lockdep says irqs off]
    [...]
    TRACE_IRQS_IRET [return from breakpoint]
    test if pt_regs say interrupts enabled [no]
    [iret back to interrupt]
    [iret back to code]

    tick_nohz_idle_enter() {

    lockdep_assert_irqs_enabled() [lockdep say no!]

    Although interrupts are indeed enabled, lockdep thinks it is not, and since
    we now do asserts via lockdep, it gives a false warning. The issue here is
    that printk_nmi_enter() is called before lockdep_off(), which disables
    lockdep (for this reason) in NMIs. By simply not allowing ftrace to see
    printk_nmi_enter() (via notrace annotation) we keep lockdep from getting
    confused.

    Cc: stable@vger.kernel.org
    Fixes: 42a0bb3f71383 ("printk/nmi: generic solution for safe printk in NMI")
    Acked-by: Sergey Senozhatsky
    Acked-by: Petr Mladek
    Signed-off-by: Steven Rostedt (VMware)
    Signed-off-by: Greg Kroah-Hartman

    Steven Rostedt (VMware)
     

05 Sep, 2018

3 commits

  • commit 03fc7f9c99c1e7ae2925d459e8487f1a6f199f79 upstream.

    The commit 719f6a7040f1bdaf96 ("printk: Use the main logbuf in NMI
    when logbuf_lock is available") brought back the possible deadlocks
    in printk() and NMI.

    The check of logbuf_lock is done only in printk_nmi_enter() to prevent
    mixed output. But another CPU might take the lock later, enter NMI, and:

    + Both NMIs might be serialized by yet another lock, for example,
    the one in nmi_cpu_backtrace().

    + The other CPU might get stopped in NMI, see smp_send_stop()
    in panic().

    The only safe solution is to use trylock when storing the message
    into the main log-buffer. It might cause reordering when some lines
    go to the main lock buffer directly and others are delayed via
    the per-CPU buffer. It means that it is not useful in general.

    This patch replaces the problematic NMI deferred context with NMI
    direct context. It can be used to mark a code that might produce
    many messages in NMI and the risk of losing them is more critical
    than problems with eventual reordering.

    The context is then used when dumping trace buffers on oops. It was
    the primary motivation for the original fix. Also the reordering is
    even smaller issue there because some traces have their own time stamps.

    Finally, nmi_cpu_backtrace() need not longer be serialized because
    it will always us the per-CPU buffers again.

    Fixes: 719f6a7040f1bdaf96 ("printk: Use the main logbuf in NMI when logbuf_lock is available")
    Cc: stable@vger.kernel.org
    Link: http://lkml.kernel.org/r/20180627142028.11259-1-pmladek@suse.com
    To: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: Tetsuo Handa
    Cc: Sergey Senozhatsky
    Cc: linux-kernel@vger.kernel.org
    Cc: stable@vger.kernel.org
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Greg Kroah-Hartman

    Petr Mladek
     
  • commit a338f84dc196f44b63ba0863d2f34fd9b1613572 upstream.

    It is just a preparation step. The patch does not change
    the existing behavior.

    Link: http://lkml.kernel.org/r/20180627140817.27764-3-pmladek@suse.com
    To: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: Tetsuo Handa
    Cc: Sergey Senozhatsky
    Cc: linux-kernel@vger.kernel.org
    Cc: stable@vger.kernel.org
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Greg Kroah-Hartman

    Petr Mladek
     
  • commit ba552399954dde1b388f7749fecad5c349216981 upstream.

    It is just a preparation step. The patch does not change
    the existing behavior.

    Link: http://lkml.kernel.org/r/20180627140817.27764-2-pmladek@suse.com
    To: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: Tetsuo Handa
    Cc: Sergey Senozhatsky
    Cc: linux-kernel@vger.kernel.org
    Cc: stable@vger.kernel.org
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Greg Kroah-Hartman

    Petr Mladek
     

03 Aug, 2018

1 commit

  • [ Upstream commit 554755be08fba31c74f66b82a485e5513205af84 ]

    Drop the in_nmi() check from printk_safe_flush_on_panic()
    and attempt to re-init (IOW unlock) locked logbuf spinlock
    from panic CPU regardless of its context.

    Otherwise, theoretically, we can deadlock on logbuf trying to flush
    per-CPU buffers:

    a) Panic CPU is running in non-NMI context
    b) Panic CPU sends out shutdown IPI via reboot vector
    c) Panic CPU fails to stop all remote CPUs
    d) Panic CPU sends out shutdown IPI via NMI vector
    One of the CPUs that we bring down via NMI vector can hold
    logbuf spin lock (theoretically).

    Link: http://lkml.kernel.org/r/20180530070350.10131-1-sergey.senozhatsky@gmail.com
    To: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Sasha Levin
    Signed-off-by: Greg Kroah-Hartman

    Sergey Senozhatsky
     

03 Jul, 2018

1 commit

  • commit 988a35f8da1dec5a8cd2788054d1e717be61bf25 upstream.

    I noticed that there is a possibility that printk_safe_log_store() causes
    kernel oops because "args" parameter is passed to vsnprintf() again when
    atomic_cmpxchg() detected that we raced. Fix this by using va_copy().

    Link: http://lkml.kernel.org/r/201805112002.GIF21216.OFVHFOMLJtQFSO@I-love.SAKURA.ne.jp
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: dvyukov@google.com
    Cc: syzkaller@googlegroups.com
    Cc: fengguang.wu@intel.com
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Tetsuo Handa
    Fixes: 42a0bb3f71383b45 ("printk/nmi: generic solution for safe printk in NMI")
    Cc: 4.7+ # v4.7+
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek
    Signed-off-by: Greg Kroah-Hartman

    Tetsuo Handa
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

08 Sep, 2017

1 commit

  • Pull printk updates from Petr Mladek:

    - Do not allow use of freed init data and code even when boot consoles
    are forced to stay. Also check for the init memory more precisely.

    - Some code clean up by starting contributors.

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk:
    printk: Clean up do_syslog() error handling
    printk/console: Enhance the check for consoles using init memory
    printk/console: Always disable boot consoles that use init memory before it is freed
    printk: Modify operators of printed_len and text_len

    Linus Torvalds
     

18 Aug, 2017

1 commit

  • This reverts commit 68c4a4f8abc60c9440ede9cd123d48b78325f7a3, with
    various conflict clean-ups.

    The capability check required too much privilege compared to simple DAC
    controls. A system builder was forced to have crash handler processes
    run with CAP_SYSLOG which would give it the ability to read (and wipe)
    the _current_ dmesg, which is much more access than being given access
    only to the historical log stored in pstorefs.

    With the prior commit to make the root directory 0750, the files are
    protected by default but a system builder can now opt to give access
    to a specific group (via chgrp on the pstorefs root directory) without
    being forced to also give away CAP_SYSLOG.

    Suggested-by: Nick Kralevich
    Signed-off-by: Kees Cook
    Reviewed-by: Petr Mladek
    Reviewed-by: Sergey Senozhatsky

    Kees Cook
     

15 Aug, 2017

1 commit

  • The error variable in do_syslog() is preemptively set to the error code
    before the error condition is checked, and then set to 0 if the error
    condition is not encountered. This is not necessary, as it is likely
    simpler to return immediately upon encountering the error condition. A
    redundant set of the error variable to 0 is also removed.

    This patch has been build-tested on x86_64, but not tested for
    functionality.

    Link: http://lkml.kernel.org/r/20170730033636.GA935@vostro
    Cc: Steven Rostedt
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Nikitas Angelinas
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Nikitas Angelinas
     

27 Jul, 2017

3 commits

  • printk_late_init() is responsible for disabling boot consoles that
    use init memory. It checks the address of struct console for this.

    But this is not enough. For example, there are several early
    consoles that have write() method in the init section and
    struct console in the normal section. They are not disabled
    and could cause fancy and hard to debug system states.

    It is even more complicated by the macros EARLYCON_DECLARE() and
    OF_EARLYCON_DECLARE() where various struct members are set at
    runtime by the provided setup() function.

    I have tried to reproduce this problem and forced the classic uart
    early console to stay using keep_bootcon parameter. In particular
    I used earlycon=uart,io,0x3f8 keep_bootcon console=ttyS0,115200.
    The system did not boot:

    [ 1.570496] PM: Image not found (code -22)
    [ 1.570496] PM: Image not found (code -22)
    [ 1.571886] PM: Hibernation image not present or could not be loaded.
    [ 1.571886] PM: Hibernation image not present or could not be loaded.
    [ 1.576407] Freeing unused kernel memory: 2528K
    [ 1.577244] kernel tried to execute NX-protected page - exploit attempt? (uid: 0)

    The double lines are caused by having both early uart console and
    ttyS0 console enabled at the same time. The early console stopped
    working when the init memory was freed. Fortunately, the invalid
    call was caught by the NX-protexted page check and did not cause
    any silent fancy problems.

    This patch adds a check for many other addresses stored in
    struct console. It omits setup() and match() that are used
    only when the console is registered. Therefore they have
    already been used at this point and there is no reason
    to use them again.

    Link: http://lkml.kernel.org/r/1500036673-7122-3-git-send-email-pmladek@suse.com
    Cc: Steven Rostedt
    Cc: Andrew Morton
    Cc: Peter Zijlstra
    Cc: Matt Redfearn
    Cc: Greg Kroah-Hartman
    Cc: Jiri Slaby
    Cc: "David S. Miller"
    Cc: Alan Cox
    Cc: "Fabio M. Di Nitto"
    Cc: linux-serial@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Petr Mladek
     
  • Commit 4c30c6f566c0 ("kernel/printk: do not turn off bootconsole in
    printk_late_init() if keep_bootcon") added a check on keep_bootcon to
    ensure that boot consoles were kept around until the real console is
    registered.

    This can lead to problems if the boot console data and code are in the
    init section, since it can be freed before the boot console is
    unregistered.

    Commit 81cc26f2bd11 ("printk: only unregister boot consoles when
    necessary") fixed this a better way. It allowed to keep boot consoles
    that did not use init data. Unfortunately it did not remove the check
    of keep_bootcon.

    This can lead to crashes and weird panics when the bootconsole is
    accessed after free, especially if page poisoning is in use and the
    code / data have been overwritten with a poison value.

    To prevent this, always free the boot console if it is within the init
    section. In addition, print a warning about that the console is removed
    prematurely.

    Finally there is a new comment how to avoid the warning. It replaced
    an explanation that duplicated a more comprehensive function
    description few lines above.

    Fixes: 4c30c6f566c0 ("kernel/printk: do not turn off bootconsole in printk_late_init() if keep_bootcon")
    Link: http://lkml.kernel.org/r/1500036673-7122-2-git-send-email-pmladek@suse.com
    Cc: Steven Rostedt
    Cc: Andrew Morton
    Cc: Peter Zijlstra
    Cc: Greg Kroah-Hartman
    Cc: Jiri Slaby
    Cc: "David S. Miller"
    Cc: Alan Cox
    Cc: "Fabio M. Di Nitto"
    Cc: linux-serial@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Matt Redfearn
    [pmladek@suse.com: print the warning, code and comments clean up]
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Matt Redfearn
     
  • With commit ("printk: report lost messages in printk
    safe/nmi contexts") and commit ("printk: remove zap_locks()
    function"), it seems we can remove initialization, "=0", of text_len and
    directly assign result of log_output to printed_len.

    Link: http://lkml.kernel.org/r/1499755255-6258-1-git-send-email-vichy.kuo@gmail.com
    Cc: rostedt@goodmis.org
    Cc: linux-kernel@vger.kernel.org
    Cc: joe@perches.com
    Signed-off-by: Pierre Kuo
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Pierre Kuo
     

06 Jul, 2017

1 commit

  • Pull printk updates from Petr Mladek:

    - Store printk() messages into the main log buffer directly even in NMI
    when the lock is available. It is the best effort to print even large
    chunk of text. It is handy, for example, when all ftrace messages are
    printed during the system panic in NMI.

    - Add missing annotations to calm down compiler warnings

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk:
    printk: add __printf attributes to internal functions
    printk: Use the main logbuf in NMI when logbuf_lock is available

    Linus Torvalds
     

03 Jul, 2017

1 commit


20 Jun, 2017

1 commit


13 Jun, 2017

1 commit

  • When compiling with -Wsuggest-attribute=format, gcc complains that some
    functions in kernel/printk/printk_safe.c transmit their argument to
    printf-like functions without having a printf attribute. Silence these
    warnings by adding relevant __printf attributes.

    Link: http://lkml.kernel.org/r/20170524054950.6722-1-nicolas.iooss_linux@m4x.org
    Cc: Steven Rostedt
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Nicolas Iooss
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Nicolas Iooss
     

09 Jun, 2017

1 commit

  • Pull printk fix from Petr Mladek:
    "This reverts a fix added into 4.12-rc1. It caused the kernel log to be
    printed on another console when two consoles of the same type were
    defined, e.g. console=ttyS0 console=ttyS1.

    This configuration was never supported by kernel itself, but it
    started to make sense with systemd. In other words, the commit broke
    userspace"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk:
    Revert "printk: fix double printing with earlycon"

    Linus Torvalds
     

08 Jun, 2017

1 commit

  • This reverts commit cf39bf58afdaabc0b86f141630fb3fd18190294e.

    The commit regression to users that define both console=ttyS1
    and console=ttyS0 on the command line, see
    https://lkml.kernel.org/r/20170509082915.GA13236@bistromath.localdomain

    The kernel log messages always appeared only on one serial port. It is
    even documented in Documentation/admin-guide/serial-console.rst:

    "Note that you can only define one console per device type (serial,
    video)."

    The above mentioned commit changed the order in which the command line
    parameters are searched. As a result, the kernel log messages go to
    the last mentioned ttyS* instead of the first one.

    We long thought that using two console=ttyS* on the command line
    did not make sense. But then we realized that console= parameters
    were handled also by systemd, see
    http://0pointer.de/blog/projects/serial-console.html

    "By default systemd will instantiate one serial-getty@.service on
    the main kernel console, if it is not a virtual terminal."

    where

    "[4] If multiple kernel consoles are used simultaneously, the main
    console is the one listed first in /sys/class/tty/console/active,
    which is the last one listed on the kernel command line."

    This puts the original report into another light. The system is running
    in qemu. The first serial port is used to store the messages into a file.
    The second one is used to login to the system via a socket. It depends
    on systemd and the historic kernel behavior.

    By other words, systemd causes that it makes sense to define both
    console=ttyS1 console=ttyS0 on the command line. The kernel fix
    caused regression related to userspace (systemd) and need to be
    reverted.

    In addition, it went out that the fix helped only partially.
    The messages still were duplicated when the boot console was
    removed early by late_initcall(printk_late_init). Then the entire
    log was replayed when the same console was registered as a normal one.

    Link: 20170606160339.GC7604@pathway.suse.cz
    Cc: Aleksey Makarov
    Cc: Sabrina Dubroca
    Cc: Sudeep Holla
    Cc: Greg Kroah-Hartman
    Cc: Peter Hurley
    Cc: Jiri Slaby
    Cc: Robin Murphy ,
    Cc: Steven Rostedt
    Cc: "Nair, Jayachandran"
    Cc: linux-serial@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Reported-by: Sabrina Dubroca
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Petr Mladek
     

23 May, 2017

1 commit

  • To enable smp_processor_id() and might_sleep() debug checks earlier, it's
    required to add system states between SYSTEM_BOOTING and SYSTEM_RUNNING.

    Adjust the system_state check in boot_delay_msec() to handle the extra
    states.

    Tested-by: Mark Rutland
    Signed-off-by: Thomas Gleixner
    Signed-off-by: Peter Zijlstra (Intel)
    Reviewed-by: Steven Rostedt (VMware)
    Cc: Greg Kroah-Hartman
    Cc: Linus Torvalds
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/20170516184736.027534895@linutronix.de
    Signed-off-by: Ingo Molnar

    Thomas Gleixner
     

19 May, 2017

1 commit

  • The commit 42a0bb3f71383b457a7d ("printk/nmi: generic solution for safe
    printk in NMI") caused that printk stores messages into a temporary
    buffer in NMI context.

    The buffer is per-CPU and therefore the size is rather limited.
    It works quite well for NMI backtraces. But there are longer logs
    that might get printed in NMI context, for example, lockdep
    warnings, ftrace_dump_on_oops.

    The temporary buffer is used to avoid deadlocks caused by
    logbuf_lock. Also it is needed to avoid races with the other
    temporary buffer that is used when PRINTK_SAFE_CONTEXT is entered.
    But the main buffer can be used in NMI if the lock is available
    and we did not interrupt PRINTK_SAFE_CONTEXT.

    The lock is checked using raw_spin_is_locked(). It might cause
    false negatives when the lock is taken on another CPU and
    this CPU is in the safe context from other reasons. Note that
    the safe context is used also to get console semaphore or when
    calling console drivers. For this reason, we do the check in
    printk_nmi_enter(). It makes the handling consistent for
    the entire NMI handler and avoids reshuffling of the messages.

    The patch also defines special printk context that allows
    to use printk_deferred() in NMI. Note that we could not flush
    the messages to the consoles because console drivers might use
    many other internal locks.

    The newly created vprintk_deferred() disables the preemption
    only around the irq work handling. It is needed there to keep
    the consistency between the two per-CPU variables. But there
    is no reason to disable preemption around vprintk_emit().

    Finally, the patch puts back explicit serialization of the NMI
    backtraces from different CPUs. It was removed by the
    commit a9edc88093287183ac934b ("x86/nmi: Perform a safe
    NMI stack trace on all CPUs"). It was not needed because
    the flushing of the temporary per-CPU buffers was serialized.

    Link: http://lkml.kernel.org/r/1493912763-24873-1-git-send-email-pmladek@suse.com
    Cc: Steven Rostedt
    Cc: Andrew Morton
    Cc: Peter Zijlstra
    Cc: Russell King
    Cc: Daniel Thompson
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Chris Metcalf
    Cc: x86@kernel.org
    Cc: linux-arm-kernel@lists.infradead.org
    Cc: linux-kernel@vger.kernel.org
    Suggested-by: Sergey Senozhatsky
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Petr Mladek
     

09 May, 2017

2 commits

  • Pull tty/serial updates from Greg KH:
    "Here is the "big" TTY/Serial patch updates for 4.12-rc1

    Not a lot of new things here, the normal number of serial driver
    updates and additions, tiny bugs fixed, and some core files split up
    to make future changes a bit easier for Nicolas's "tiny-tty" work.

    All of these have been in linux-next for a while"

    * tag 'tty-4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty: (62 commits)
    serial: small Makefile reordering
    tty: split job control support into a file of its own
    tty: move baudrate handling code to a file of its own
    console: move console_init() out of tty_io.c
    serial: 8250_early: Add earlycon support for Palmchip UART
    tty: pl011: use "qdf2400_e44" as the earlycon name for QDF2400 E44
    vt: make mouse selection of non-ASCII consistent
    vt: set mouse selection word-chars to gpm's default
    imx-serial: Reduce RX DMA startup latency when opening for reading
    serial: omap: suspend device on probe errors
    serial: omap: fix runtime-pm handling on unbind
    tty: serial: omap: add UPF_BOOT_AUTOCONF flag for DT init
    serial: samsung: Remove useless spinlock
    serial: samsung: Add missing checks for dma_map_single failure
    serial: samsung: Use right device for DMA-mapping calls
    serial: imx: setup DCEDTE early and ensure DCD and RI irqs to be off
    tty: fix comment typo s/repsonsible/responsible/
    tty: amba-pl011: Fix spurious TX interrupts
    serial: xuartps: Enable clocks in the pm disable case also
    serial: core: Re-use struct uart_port {name} field
    ...

    Linus Torvalds
     
  • Patch series "kexec/fadump: remove dependency with CONFIG_KEXEC and
    reuse crashkernel parameter for fadump", v4.

    Traditionally, kdump is used to save vmcore in case of a crash. Some
    architectures like powerpc can save vmcore using architecture specific
    support instead of kexec/kdump mechanism. Such architecture specific
    support also needs to reserve memory, to be used by dump capture kernel.
    crashkernel parameter can be a reused, for memory reservation, by such
    architecture specific infrastructure.

    This patchset removes dependency with CONFIG_KEXEC for crashkernel
    parameter and vmcoreinfo related code as it can be reused without kexec
    support. Also, crashkernel parameter is reused instead of
    fadump_reserve_mem to reserve memory for fadump.

    The first patch moves crashkernel parameter parsing and vmcoreinfo
    related code under CONFIG_CRASH_CORE instead of CONFIG_KEXEC_CORE. The
    second patch reuses the definitions of append_elf_note() & final_note()
    functions under CONFIG_CRASH_CORE in IA64 arch code. The third patch
    removes dependency on CONFIG_KEXEC for firmware-assisted dump (fadump)
    in powerpc. The next patch reuses crashkernel parameter for reserving
    memory for fadump, instead of the fadump_reserve_mem parameter. This
    has the advantage of using all syntaxes crashkernel parameter supports,
    for fadump as well. The last patch updates fadump kernel documentation
    about use of crashkernel parameter.

    This patch (of 5):

    Traditionally, kdump is used to save vmcore in case of a crash. Some
    architectures like powerpc can save vmcore using architecture specific
    support instead of kexec/kdump mechanism. Such architecture specific
    support also needs to reserve memory, to be used by dump capture kernel.
    crashkernel parameter can be a reused, for memory reservation, by such
    architecture specific infrastructure.

    But currently, code related to vmcoreinfo and parsing of crashkernel
    parameter is built under CONFIG_KEXEC_CORE. This patch introduces
    CONFIG_CRASH_CORE and moves the above mentioned code under this config,
    allowing code reuse without dependency on CONFIG_KEXEC. There is no
    functional change with this patch.

    Link: http://lkml.kernel.org/r/149035338104.6881.4550894432615189948.stgit@hbathini.in.ibm.com
    Signed-off-by: Hari Bathini
    Acked-by: Dave Young
    Cc: Fenghua Yu
    Cc: Tony Luck
    Cc: Eric Biederman
    Cc: Mahesh Salgaonkar
    Cc: Vivek Goyal
    Cc: Michael Ellerman
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Hari Bathini
     

04 May, 2017

1 commit

  • Pull printk updates from Petr Mladek:

    - There is a situation when early console is not deregistered because
    the preferred one matches a wrong entry. It caused messages to appear
    twice.

    This is the 2nd attempt to fix it. The first one was wrong, see the
    commit c6c7d83b9c9e ('Revert "console: don't prefer first registered
    if DT specifies stdout-path"').

    The fix is coupled with some small code clean up. Well, the console
    registration code would deserve a big one. We need to think about it.

    - Do not lose information about the preemtive context when the console
    semaphore is re-taken.

    - Do not block CPU hotplug when someone else is already pushing
    messages to the console.

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/pmladek/printk:
    printk: fix double printing with earlycon
    printk: rename selected_console -> preferred_console
    printk: fix name/type/scope of preferred_console var
    printk: Correctly handle preemption in console_unlock()
    printk: use console_trylock() in console_cpu_notify()

    Linus Torvalds
     

19 Apr, 2017

1 commit


12 Apr, 2017

3 commits

  • If a console was specified by ACPI SPCR table _and_ command line
    parameters like "console=ttyAMA0" _and_ "earlycon" were specified,
    then log messages appear twice.

    The root cause is that the code traverses the list of specified
    consoles (the `console_cmdline` array) and stops at the first match.
    But it may happen that the same console is referred by the elements
    of this array twice:

    pl011,mmio,0x87e024000000,115200 -- from SPCR
    ttyAMA0 -- from command line

    but in this case `preferred_console` points to the second entry and
    the flag CON_CONSDEV is not set, so bootconsole is not deregistered.

    To fix that, introduce an invariant "The last non-braille console
    is always the preferred one" on the entries of the console_cmdline
    array. Then traverse it in reverse order to be sure that if
    the console is preferred then it will be the first matching entry.
    Introduce variable console_cmdline_cnt that keeps the number
    of elements of the console_cmdline array (Petr Mladek). It helps
    to get rid of the loop that searches for the end of this array.

    Link: http://lkml.kernel.org/r/20170405202006.18234-1-aleksey.makarov@linaro.org
    Cc: Steven Rostedt
    Cc: Greg Kroah-Hartman
    Cc: Peter Hurley
    Cc: Jiri Slaby
    Cc: Robin Murphy
    Cc: "Nair, Jayachandran"
    Cc: linux-serial@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Aleksey Makarov
    Reported-by: Sudeep Holla
    Acked-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Aleksey Makarov
     
  • The variable selected_console is set in __add_preferred_console()
    to point to the last console parameter that was added to the
    console_cmdline array.

    Rename it to preferred_console so that the name reflects the usage.

    Petr Mladek:
    "[..] the selected_console/preferred_console
    value is used to keep the console first in the console_drivers list.
    IMHO, the main effect is that each line will first appear on this
    console, see call_console_drivers(). But the message will still
    appear also on all other enabled consoles. From this point,
    the name "preferred" sounds better to me. More consoles
    are selected (enabled) and only one is preferred (first)."

    Link: http://lkml.kernel.org/r/20170315102854.1763-3-aleksey.makarov@linaro.org
    Cc: Sudeep Holla
    Cc: Greg Kroah-Hartman
    Cc: Jiri Slaby
    Cc: Robin Murphy
    Cc: "Nair, Jayachandran"
    Cc: linux-serial@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Aleksey Makarov
    Suggested-by: Peter Hurley
    Acked-by: Steven Rostedt (VMware)
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Aleksey Makarov
     
  • The variable preferred_console is used only inside register_console()
    and its semantics is boolean. It is negative when no console has been
    made preferred.

    Make it static bool and rename to has_preferred.

    Renaming was suggested by Peter Hurley

    Link: http://lkml.kernel.org/r/20170315102854.1763-2-aleksey.makarov@linaro.org
    Cc: Sudeep Holla
    Cc: Greg Kroah-Hartman
    Cc: Peter Hurley
    Cc: Jiri Slaby
    Cc: Robin Murphy
    Cc: "Nair, Jayachandran"
    Cc: linux-serial@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Aleksey Makarov
    Reviewed-by: Steven Rostedt (VMware)
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Aleksey Makarov
     

04 Apr, 2017

1 commit

  • Some console drivers code calls console_conditional_schedule()
    that looks at @console_may_schedule. The value must be cleared
    when the drivers are called from console_unlock() with
    interrupts disabled. But rescheduling is fine when the same
    code is called, for example, from tty operations where the
    console semaphore is taken via console_lock().

    This is why @console_may_schedule is cleared before calling console
    drivers. The original value is stored to decide if we could sleep
    between lines.

    Now, @console_may_schedule is not cleared when we call
    console_trylock() and jump back to the "again" goto label.
    This has become a problem, since the commit 6b97a20d3a7909daa066
    ("printk: set may_schedule for some of console_trylock() callers").
    @console_may_schedule might get enabled now.

    There is also the opposite problem. console_lock() can be called
    only from preemptive context. It can always enable scheduling in
    the console code. But console_trylock() is not able to detect it
    when CONFIG_PREEMPT_COUNT is disabled. Therefore we should use the
    original @console_may_schedule value after re-acquiring
    the console semaphore in console_unlock().

    This patch solves both problems by moving the "again" goto label.

    Alternative solution was to clear and restore the value around
    call_console_drivers(). Then console_conditional_schedule() could
    be used also inside console_unlock(). But there was a potential race
    with console_flush_on_panic() as reported by Sergey Senozhatsky.
    That function should be called only where there is only one CPU
    and with interrupts disabled. But better be on the safe side
    because stopping CPUs might fail.

    Fixes: 6b97a20d3a7909 ("printk: set may_schedule for some of console_trylock() callers")
    Link: http://lkml.kernel.org/r/1490372045-22288-1-git-send-email-pmladek@suse.com
    Suggested-by: Tetsuo Handa
    Cc: Steven Rostedt
    Cc: Peter Zijlstra
    Cc: Andrew Morton
    Cc: Greg Kroah-Hartman
    Cc: Jiri Slaby
    Cc: linux-fbdev@vger.kernel.org
    Cc: linux-kernel@vger.kernel.org
    Reviewed-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Petr Mladek
     

31 Mar, 2017

1 commit

  • commit bbeddf52adc1 ("printk: move braille console support into
    separate braille.[ch] files") introduced _braille_console_setup()
    to outline the braille initialization code. There was however some
    confusion over the value it was supposed to return. commit 2cfe6c4ac7ee
    ("printk: Fix return of braille_register_console()") tried to fix it
    but failed to.

    This fixes and documents the returned value according to the use
    in printk.c: non-zero return means a parsing error, and thus this
    console configuration should be ignored.

    Signed-off-by: Samuel Thibault
    Cc: Aleksey Makarov
    Cc: Joe Perches
    Cc: Ming Lei
    Cc: Steven Rostedt
    Acked-by: Petr Mladek
    Signed-off-by: Greg Kroah-Hartman

    Samuel Thibault
     

24 Mar, 2017

1 commit

  • There is no need to always call blocking console_lock() in
    console_cpu_notify(), it's quite possible that console_sem can
    be locked by other CPU on the system, either already printing
    or soon to begin printing the messages. console_lock() in this
    case can simply block CPU hotplug for unknown period of time
    (console_unlock() is time unbound). Not that hotplug is very
    fast, but still, with other CPUs being online and doing
    printk() console_cpu_notify() can stuck.

    Use console_trylock() instead and opt-out if console_sem is
    already acquired from another CPU, since that CPU will do
    the printing for us.

    Link: http://lkml.kernel.org/r/20170121104729.8585-1-sergey.senozhatsky@gmail.com
    Cc: Steven Rostedt
    Cc: Andrew Morton
    Cc: Thomas Gleixner
    Cc: Sebastian Andrzej Siewior
    Cc: Ingo Molnar
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: Sergey Senozhatsky
    Signed-off-by: Petr Mladek

    Sergey Senozhatsky
     

02 Mar, 2017

2 commits