git: 806ebc9eba2a - main - bcm2835_sdhci: don't use DMA for kernel dumps
Mitchell Horne
mhorne at FreeBSD.org
Tue Sep 21 13:09:53 UTC 2021
The branch main has been updated by mhorne:
URL: https://cgit.FreeBSD.org/src/commit/?id=806ebc9eba2a45638d63ae8a2ed20e6fb44dd06e
commit 806ebc9eba2a45638d63ae8a2ed20e6fb44dd06e
Author: Mitchell Horne <mhorne at FreeBSD.org>
AuthorDate: 2021-09-09 18:07:06 +0000
Commit: Mitchell Horne <mhorne at FreeBSD.org>
CommitDate: 2021-09-21 13:08:39 +0000
bcm2835_sdhci: don't use DMA for kernel dumps
When handling a data irq, the sdhci driver calls the
sdhci_platform_will_handle() method, to determine if it should allow the
platform driver to handle the transfer or fall back to programmed I/O.
While dumping, the data irq path may be invoked directly (not from an
interrupt context), which the bcm2835_sdhci DMA code is not prepared to
handle. Return early in this case, to force the fallback to PIO.
Otherwise, the KASSERT that follows will be triggered, and the dump will
fail. On non-INVARIANTS kernels, the system will hang, waiting for a DMA
interrupt that will never arrive.
Reviewed by: kevans
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D31893
---
sys/arm/broadcom/bcm2835/bcm2835_sdhci.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
index 38617dcd38eb..c8725b6067f6 100644
--- a/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
+++ b/sys/arm/broadcom/bcm2835/bcm2835_sdhci.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/bus.h>
+#include <sys/conf.h>
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/malloc.h>
@@ -762,6 +763,13 @@ bcm_sdhci_will_handle_transfer(device_t dev, struct sdhci_slot *slot)
struct bcm_sdhci_softc *sc = device_get_softc(slot->bus);
#endif
+ /*
+ * We don't want to perform DMA in this context -- interrupts are
+ * disabled, and a transaction may already be in progress.
+ */
+ if (dumping)
+ return (0);
+
/*
* This indicates that we somehow let a data interrupt slip by into the
* SDHCI framework, when it should not have. This really needs to be
More information about the dev-commits-src-all
mailing list