NetBSD/sys/dev/sdmmc
riastradh 3521f8238e ld@sdmmc(4): Hack around deadlock in cache sync on detach.
Yanking a card triggers the sdmmc discovery task, which runs in the
sdmmc task thread, to detach any attached child devices.

Detaching ld@sdmmc triggers a cache flush (via ldbegindetach ->
disk_begindetach -> ld_lastclose -> ld_flush -> ioctl DIOCCACHESYNC),
which is implemented by scheduling a task to do sdmmc_mem_flush_cache
and then waiting for it to complete.

The sdmmc_mem_cache_flush is done by an sdmmc task so it happens
after all previously scheduled I/O operations -- that way the cache
flush doesn't complete until the previously scheduled I/O operations
are complete.

However, when the cache flush task is issued from the discovery task,
this doesn't work, because the cache flush task can't start until the
discovery task has returned -- but the discovery task won't return
until the cache flush task has completed.

To work around this deadlock, which usually happens only when the
device has been yanked anyway so further I/O would be lost anyway,
just do the cache flush synchronously in DIOCCACHESYNC if we're
running in the task thread.

This isn't quite right -- implementation details of the task thread
shouldn't bleed into ld@sdmmc, and running the cache sync _before_
any subsequently scheduled I/O tasks is asking for trouble -- but it
should serve to avoid the deadlock in PR kern/57870 until we can fix
a host of concurrency bugs in sdmmc by fixing the locking scheme and
running discovery in a separate thread from tasks.

XXX pullup-10
2024-01-23 23:13:05 +00:00
..
Makefile.sdmmcdevs
devlist2h.awk
files.sdmmc
if_bwfm_sdio.c Fix bug in protocol parser that often caused fatal 'checksum error'. 2022-12-03 16:06:20 +00:00
if_bwfm_sdio.h
ld_sdmmc.c ld@sdmmc(4): Hack around deadlock in cache sync on detach. 2024-01-23 23:13:05 +00:00
sbt.c
sdhc.c sdmmc: add support for optional delay after register write 2024-01-20 00:22:11 +00:00
sdhcreg.h
sdhcvar.h sdmmc: add support for optional delay after register write 2024-01-20 00:22:11 +00:00
sdmmc.c
sdmmc_cis.c
sdmmc_io.c
sdmmc_ioreg.h
sdmmc_mem.c sdmmc: Only check chipset WP status for SD cards. 2023-04-29 13:21:31 +00:00
sdmmcchip.h
sdmmcdevs
sdmmcdevs.h
sdmmcreg.h
sdmmcvar.h