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
Unknown Object (File)
Thu, Aug 13, 9:03 PM
Unknown Object (File)
Wed, Aug 12, 1:01 PM
Unknown Object (File)
Mon, Aug 10, 10:50 AM
Unknown Object (File)
Mon, Aug 10, 10:38 AM
Unknown Object (File)
Sun, Aug 9, 12:34 PM
Unknown Object (File)
Sat, Aug 8, 7:19 PM
Unknown Object (File)
Thu, Aug 6, 11:26 AM
Unknown Object (File)
Thu, Aug 6, 7:45 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 Skipped
Unit
Tests Skipped
Build Status
Buildable 54273
Build 51163: arc lint + arc unit

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.