Valentin Schneider <vschneid@xxxxxxxxxx> writes: > Attempting to get a crash dump out of a debug PREEMPT_RT kernel via an NMI > panic() doesn't work. The cause of that lies in the PREEMPT_RT definition > of mutex_trylock(): > > if (IS_ENABLED(CONFIG_DEBUG_RT_MUTEXES) && WARN_ON_ONCE(!in_task())) > return 0; > > This prevents an NMI panic() from executing the main body of > __crash_kexec() which does the actual kexec into the kdump kernel. > The warning and return are explained by: > > 6ce47fd961fa ("rtmutex: Warn if trylock is called from hard/softirq context") > [...] > The reasons for this are: > > 1) There is a potential deadlock in the slowpath > > 2) Another cpu which blocks on the rtmutex will boost the task > which allegedly locked the rtmutex, but that cannot work > because the hard/softirq context borrows the task context. > > Furthermore, grabbing the lock isn't NMI safe, so do away with it and > use an atomic variable to serialize reads vs writes of > kexec_crash_image. > > Tested by triggering NMI panics via: > > $ echo 1 > /proc/sys/kernel/panic_on_unrecovered_nmi > $ echo 1 > /proc/sys/kernel/unknown_nmi_panic > $ echo 1 > /proc/sys/kernel/panic > > $ ipmitool power diag > > Fixes: 6ce47fd961fa ("rtmutex: Warn if trylock is called from hard/softirq context") > Signed-off-by: Valentin Schneider <vschneid@xxxxxxxxxx> I am not particularly fond of this patch as it adds more complexity than is necessary to solve the problem. Calling a spade a spade PREEMPT_RT's mutex_trylock implementation is broken as it can not support the use cases of an ordinary mutex_trylock. I have not seen (possibly I skimmed too quickly) anywhere in the discussion why PREEMPT_RT is not being fixed. Looking at the code there is enough going on in try_to_take_rt_mutex that I can imagine that some part of that code is not nmi safe. So I can believe PREEMPT_RT may be unfix-ably broken. At this point I recommend going back to being ``unconventional'' with the kexec locking and effectively reverting commit 8c5a1cf0ad3a ("kexec: use a mutex for locking rather than xchg()"). That would also mean that we don't have to worry about the lockdep code doing something weird in the future and breaking kexec. Your change starting to is atomic_cmpxchng is most halfway to a revert of commit 8c5a1cf0ad3a ("kexec: use a mutex for locking rather than xchg()"). So we might as well go the whole way and just document that the kexec on panic code can not use conventional kernel locking primitives and has to dig deep and build it's own. At which point it makes no sense for the rest of the kexec code to use anything different. Eric