Page MenuHomeFreeBSD

reboot: Avoid unlocking Giant if the scheduler is stopped
ClosedPublic

Authored by markj on Nov 3 2023, 8:48 PM.
Tags
None
Referenced Files
F153718175: D42460.diff
Thu, Apr 23, 4:40 AM
Unknown Object (File)
Thu, Apr 9, 2:44 AM
Unknown Object (File)
Tue, Mar 31, 1:46 AM
Unknown Object (File)
Mon, Mar 30, 7:31 PM
Unknown Object (File)
Tue, Mar 24, 11:39 PM
Unknown Object (File)
Mar 23 2026, 3:36 AM
Unknown Object (File)
Mar 23 2026, 3:35 AM
Unknown Object (File)
Mar 15 2026, 7:59 AM
Subscribers

Details

Summary

When the scheduler is stopped, mtx_unlock() turns into a no-op, so the
loop

    while (mtx_owned(&Giant))
	    mtx_unlock(&Giant);

runs forever if the calling thread has Giant locked.

Diff Detail

Repository
rG FreeBSD src repository
Lint
Lint Not Applicable
Unit
Tests Not Applicable

Event Timeline

markj requested review of this revision.Nov 3 2023, 8:48 PM

No objection, but I wonder why we loop at all.

This revision is now accepted and ready to land.Nov 4 2023, 2:44 PM

No objection, but I wonder why we loop at all.

Giant is recursive, so it could in principle be held multiple times by the same thread.

I thought I'd hit accept yesterday this is fine. Crashes are super weird. I can't think of any other place we do this.. Giant really is special.