Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation by Copilot · Pull Request #125675 · dotnet/runtime · GitHub
Skip to content

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation - #125675

Merged
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah
Mar 18, 2026
Merged

Fix CrstILStubGen/CrstLoaderAllocatorReferences lock level violation#125675
jkotas merged 2 commits into
mainfrom
copilot/husky-cheetah

Conversation

CopilotAI commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

CreateInteropILStub holds CrstILStubGen while type loading can reach EnsureInstantiationCrstLoaderAllocatorReferences, but this ordering was undeclared in CrstTypes.def. With CrstILStubGen at level 14 and CrstLoaderAllocatorReferences at level 17, attempting to acquire the latter while holding the former triggered a lock-level violation (e.g., during P/Invoke stub generation for types involving InlineArray<T> generics).

Changes

  • CrstTypes.def — Add ILStubGen to AcquiredAfter for LoaderAllocatorReferences, formally declaring that CrstLoaderAllocatorReferences may be acquired while CrstILStubGen is held.

  • crsttypes_generated.h — Regenerated via CrstTypeTool; CrstILStubGen level raised 14 → 18 (must exceed CrstLoaderAllocatorReferences at 17).

Original prompt

fix#125638 issue with these changes

[Chronological Review] 1. User requested investigation of bug https://github.com//issues/125638 - a Crst lock level violation in CoreCLR runtime 2. Read the GitHub issue (#125638) and revert PR (#125664), plus the original triggering PR (#125574) 3. Read issue comments to get the full stack trace from jkotas 4. Read PR #125664 diff to understand the revert (InlineArrays back to fixed buffers) 5. Launched background explore agent to find lock-related code paths 6. In parallel, grepped for CrstILStubGen, CrstLoaderAllocatorReferences, EnsureInstantiation 7. Examined loaderallocator.cpp (EnsureInstantiation, EnsureReference methods) 8. Examined ilstubcache.cpp (GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature) 9. Examined dllimport.cpp (CreateInteropILStub - where CrstILStubGen is held via ListLockHolder) 10. Examined crst.cpp (IsSafeToTake - the lock level violation check logic) 11. Found CrstTypes.def - the configuration file for lock ordering 12. Read lock ordering declarations for ILStubGen and LoaderAllocatorReferences 13. Found Debug_CanTake() implementation - it actually Enter()/Leave() the lock 14. Created plan.md and todos 15. Implemented 3 changes: moved asserts in loaderallocator.cpp, updated CrstTypes.def, regenerated header 16. Built coreclr checked - first attempts had environment issues, clean rebuild succeeded 17. Ran self code review, verified all changes are correct 18. Marked all todos done

[Intent Mapping]

[Technical Inventory]

  • CoreCLR VM runtime (C++)
  • Crst (Critical Section) lock ordering system with levels
  • CrstTypes.def → CrstTypeTool → crsttypes_generated.h pipeline
  • CrstILStubGen: level 14→18, used by IL stub generation
  • CrstLoaderAllocatorReferences: level 17, used by LoaderAllocator
  • Debug_CanTake() actually calls Enter()/Leave() triggering level checks
  • ListLock/ListLockHolder pattern for ILStubGen lock
  • InlineArray generic types replacing fixed buffers in P/Invoke structs

[Code Archaeology]

  • src/coreclr/vm/loaderallocator.cpp: EnsureReference (line 261), EnsureInstantiation (line 287) - moved Debug_CanTake() asserts after IsCollectible() checks
  • src/coreclr/inc/CrstTypes.def: Added ILStubGen to AcquiredAfter for LoaderAllocatorReferences
  • src/coreclr/inc/crsttypes_generated.h: Regenerated, CrstILStubGen level 14→18
  • src/coreclr/vm/ilstubcache.cpp: GetStubMethodDesc, CreateNewMethodDesc, CreateModuleIndependentSignature
  • src/coreclr/vm/dllimport.cpp: CreateInteropILStub holds CrstILStubGen via ListLockHolder
  • src/coreclr/vm/siginfo.cpp: ConvertToInternalExactlyOne triggers type loading via GetTypeHandleThrowing
  • src/coreclr/vm/crst.cpp: IsSafeToTake (level violation check), crst.h: Debug_CanTake()
  • src/coreclr/vm/generics.cpp: CreateTypeHandleForNonCanonicalGenericInstantiation calls EnsureInstantiation

[Progress Assessment]

  • All tasks complete: assert relocation, CrstTypes.def update, header regeneration, build verification
  • Build succeeded: 0 errors, 0 warnings
  • Code review completed

[Context Validation]

  • Full root cause understood and documented
  • Fix implemented and verified
  • No PR created yet to the upstream repo

[Recent Commands Analysis]

  • Last significant commands: code-review skill execution, final verification of diffs and build output
  • Build succeeded with .\build.cmd clr.runtime -rc checked after clean rebuild
  • All 4 todos marked done
1. Conversation Overview: - Primary Objectives: User requested: "please investigate a bug in coreclr runtime system https://github.com//issues/125638 we know it was exposed by an unrelated change that replaced fixed-size buffers with InlineArrays, this PR reverts that change so we can unblock the CI: https://github.com//pull/125664 but we still want to fix the type system bug." - Session Context: Investigated a Crst lock level violation in CoreCLR where `CrstILStubGen` (level 14) was held while trying to acquire `CrstLoaderAllocatorReferences` (level 17). Traced full call chain, identified root cause as (a) `Debug_CanTake()` assert firing before early-return guards and (b) missing lock ordering declaration. Implemented fix across 3 files, built successfully. - User Intent Evolution: Single clear objective throughout - fix the underlying type system/lock ordering bug exposed by PR #125574.
  1. Technical Foundation:
    • CoreCLR VM Runtime: C++ codebase at C:\prj\runtime-main2\src\coreclr\vm
    • Crst Lock Ordering System: Levels defined in CrstTypes.def, processed by CrstTypeTool.cs → generates `crsttypes_gen...

Created from Copilot CLI via the copilot delegate command.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @agocke
See info in area-owners.md if you want to be subscribed.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
CopilotAI changed the title [WIP] [DOTNET-125638] Fix Crst lock level violation in CoreCLR runtimeFix CrstILStubGen/CrstLoaderAllocatorReferences lock level violationMar 17, 2026
CopilotAI requested a review from EgorBoMarch 17, 2026 20:39
…fix is sufficient
Co-authored-by: jkotas <6668460+jkotas@users.noreply.github.com>
CopilotAI requested a review from jkotasMarch 17, 2026 20:44
@jkotas
jkotas marked this pull request as ready for review March 17, 2026 20:53
CopilotAI review requested due to automatic review settings March 17, 2026 20:53

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates CoreCLR Crst (lock) hierarchy metadata to allow CrstLoaderAllocatorReferences to be taken after CrstILStubGen, and regenerates the derived lock-level map used for debug-time deadlock validation.

Changes:

  • Adds ILStubGen to the AcquiredAfter list for LoaderAllocatorReferences in CrstTypes.def.
  • Regenerates crsttypes_generated.h so CrstILStubGen’s computed level reflects the updated dependency graph.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
src/coreclr/inc/CrstTypes.defAdds ILStubGen as an allowed “acquired after” predecessor for LoaderAllocatorReferences to encode the intended lock ordering.
src/coreclr/inc/crsttypes_generated.hUpdates the generated debug lock-level map to reflect the new ordering constraints (CrstILStubGen level change).

@jkotas
jkotas merged commit 0389510 into mainMar 18, 2026
106 of 110 checks passed
@jkotas
jkotas deleted the copilot/husky-cheetah branch March 18, 2026 04:33
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 17, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Crst Level violation: Can't take level 17 lock CrstLoaderAllocatorReferences

4 participants

@jkotas@EgorBo