Re: [PATCH] mmc: host: meson-gx-mmc: fix possible deadlock condition for preempt_rt
From: Jerome Brunet <jbrunet@baylibre.com>
Date: 2020-09-25 14:14:18
Also in:
linux-amlogic, linux-mmc, linux-rt-users, lkml
On Fri 25 Sep 2020 at 15:44, Sebastian Andrzej Siewior [off-list ref] wrote:
On 2020-09-25 11:11:42 [+0200], Jerome Brunet wrote:quoted
I'm not sure about this. As you have explained on IRC, I understand that IRQF_ONESHOT is causing trouble with RT as the hard IRQ part of the thread will not be migrated to a thread. That was certainly not the intent when putting this flag.That is my understanding as well.quoted
This seems pretty unsafe to me. Maybe we could improve the driver so it copes with this case gracefully. ATM, I don't think it would.Running the primary handler in hardirq context is bad, because it invokes meson_mmc_request_done() at the very end. And here: - mmc_complete_cmd() -> complete_all() There is a lockdep_assert_RT_in_threaded_ctx() which should trigger. - led_trigger_event() -> led_trigger_event() This should trigger a might_sleep() warning somewhere. So removing IRQF_ONESHOT is okay but it should additionally disable the IRQ source in meson_mmc_irq() and re-enable back in meson_mmc_irq_thread(). Otherwise the IRQ remains asserted and may fire multiple times before the thread has a chance to run.
Looks like we need to do manually what IRQF_ONESHOT was doing for us :( This brings a few questions: * The consideration you described is not mentioned near the description of IRQF_ONESHOT. Maybe it should so other drivers with same intent don't end up in the same pitfall ? * Why doesn't RT move the IRQ with this flag ? Seems completly unrelated to RT (maybe it is the same documentation problem) * Can't we have flag doing the irq disable in the same way while still allowing to RT to do its magic ? seems better than open coding it in the driver ?
Sebastian
_______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel