Page MenuHomeFreeBSD

nda: Don't sleep with non-sleepable lock held
Needs ReviewPublic

Authored by cperciva on Tue, Jul 14, 6:50 PM.
Tags
None
Referenced Files
F162976234: D58230.diff
Sat, Jul 18, 8:45 PM
Unknown Object (File)
Sat, Jul 18, 3:34 AM
Unknown Object (File)
Sat, Jul 18, 2:59 AM
Unknown Object (File)
Fri, Jul 17, 2:35 AM
Unknown Object (File)
Wed, Jul 15, 1:55 PM
Subscribers

Details

Reviewers
imp
Group Reviewers
cam
Summary

We reach ndaasync with the CAM device lock held, so we must pass
M_NOWAIT to disk_* rather than M_WAITOK.

Fixes: 628d7a3270b6 ("nda: AC_GETDEV_CHANGED calls media chanaged for sectorsize change")
MFC after: 1 week
Sponsored by: Amazon

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Skipped
Unit
Tests Skipped
Build Status
Buildable 74800
Build 71683: arc lint + arc unit

Event Timeline

@imp In 824530a5c4fd59427cda0eae0a4ac85212814958 you wrote nda: Assume all cases in ndaasync can sleep and changed a different M_NOWAIT to M_WAITOK, but WITNESS complained about this code path:

Jul 14 08:32:08 freebsd kernel: uma_zalloc_debug: zone "malloc-256" with the following non-sleepable locks held:
Jul 14 08:32:08 freebsd kernel: exclusive sleep mutex CAM device lock (CAM device lock) r = 0 (0xfffff801ae8e24d0) locked @ /usr/src/sys/cam/cam_xpt.c:2238
Jul 14 08:32:08 freebsd kernel: stack backtrace:
Jul 14 08:32:08 freebsd kernel: #0 0xffffffff80c8b62c at witness_debugger+0x6c
Jul 14 08:32:08 freebsd kernel: #1 0xffffffff80c8cf2c at witness_warn+0x4bc
Jul 14 08:32:08 freebsd kernel: #2 0xffffffff810002bf at uma_zalloc_debug+0x3f
Jul 14 08:32:08 freebsd kernel: #3 0xffffffff80fffe07 at uma_zalloc_arg+0x27
Jul 14 08:32:08 freebsd kernel: #4 0xffffffff80bdcd1d at malloc+0x7d
Jul 14 08:32:08 freebsd kernel: #5 0xffffffff80b31e8c at g_post_event+0x7c
Jul 14 08:32:08 freebsd kernel: #6 0xffffffff803b43d2 at ndaasync+0x192
Jul 14 08:32:08 freebsd kernel: #7 0xffffffff803ab4ba at xpt_async_process_dev+0x1ba
Jul 14 08:32:08 freebsd kernel: #8 0xffffffff803aa30c at xptdevicetraverse+0x9c
Jul 14 08:32:08 freebsd kernel: #9 0xffffffff803aa0b4 at xpttargettraverse+0x74
Jul 14 08:32:08 freebsd kernel: #10 0xffffffff803a6b1a at xpt_async_process+0x26a
Jul 14 08:32:08 freebsd kernel: #11 0xffffffff803a73a0 at xpt_done_process+0x3e0
Jul 14 08:32:08 freebsd kernel: #12 0xffffffff803a9775 at xpt_async_td+0xe5
Jul 14 08:32:08 freebsd kernel: #13 0xffffffff80bba112 at fork_exit+0x82
Jul 14 08:32:08 freebsd kernel: #14 0xffffffff8116961e at fork_trampoline+0xe
Jul 14 08:32:08 freebsd kernel: GEOM_PART: nda0 was automatically resized.
Jul 14 08:32:08 freebsd kernel:   Use `gpart commit nda0` to save changes or `gpart undo nda0` to revert them.

I'm not 100% certain if this same backtrace would apply to the AC_ADVINFO_CHANGED code path but perhaps that change needs to be reverted too?