Hi, On Fri, May 29, 2020 at 4:27 AM Sumit Garg <sumit.g...@linaro.org> wrote: > > While rounding up CPUs via NMIs, its possible that a rounded up CPU > maybe holding a console port lock leading to kgdb master CPU stuck in > a deadlock during invocation of console write operations. A similar > deadlock could also be possible while using synchronous breakpoints. > > So in order to avoid such a deadlock, set oops_in_progress to encourage > the console drivers to disregard their internal spin locks: in the > current calling context the risk of deadlock is a bigger problem than > risks due to re-entering the console driver. We operate directly on > oops_in_progress rather than using bust_spinlocks() because the calls > bust_spinlocks() makes on exit are not appropriate for this calling > context. > > Suggested-by: Petr Mladek <pmla...@suse.com> > Signed-off-by: Sumit Garg <sumit.g...@linaro.org> > --- > kernel/debug/kdb/kdb_io.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c > index fad38eb..9e5a40d 100644 > --- a/kernel/debug/kdb/kdb_io.c > +++ b/kernel/debug/kdb/kdb_io.c > @@ -566,7 +566,18 @@ static void kdb_msg_write(char *msg, int msg_len) > for_each_console(c) { > if (!(c->flags & CON_ENABLED)) > continue; > + /* > + * Set oops_in_progress to encourage the console drivers to > + * disregard their internal spin locks: in the current calling > + * context the risk of deadlock is a bigger problem than risks > + * due to re-entering the console driver. We operate directly > on > + * oops_in_progress rather than using bust_spinlocks() because > + * the calls bust_spinlocks() makes on exit are not > appropriate > + * for this calling context. > + */ > + ++oops_in_progress; > c->write(c, msg, msg_len); > + --oops_in_progress;
This seems sane to me, especially when combined with your next patch that tries really hard not to run this flow. ;-) Reviewed-by: Douglas Anderson <diand...@chromium.org>