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
F149514920: D42460.id129698.diff
Tue, Mar 24, 11:39 PM
Unknown Object (File)
Mon, Mar 23, 3:36 AM
Unknown Object (File)
Mon, Mar 23, 3:35 AM
Unknown Object (File)
Sun, Mar 15, 7:59 AM
Unknown Object (File)
Mon, Mar 9, 8:01 PM
Unknown Object (File)
Jan 16 2026, 3:50 PM
Unknown Object (File)
Jan 16 2026, 6:31 AM
Unknown Object (File)
Jan 7 2026, 9:38 PM
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.