Skip to content

[release/9.0] [Mono] Fix c11 ARM64 atomics to issue full memory barrier. #115635

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
May 16, 2025

Conversation

github-actions[bot]
Copy link
Contributor

@github-actions github-actions bot commented May 16, 2025

Backport of #115573 to release/9.0

/cc @steveisok @lateralusX

Customer Impact

  • Customer reported
  • Found internally

Customers both in #114262 and through normal support channels have reported weird and random crashes in their .NET 9 MAUI apps when running on iOS. All of the data provided to us pointed at an issue with Task continuations, but with no clear way to tell why as customers indicated they were doing nothing remarkable when the crashes happened.

A reliable repro was hard to come by and it took some time for us to get something going. Once we had a repro in place, we found an issue with the mono runtime's use of C11 atomics, specifically around when we call Interlocked functions. The callers to these functions have an expectation of a full memory barrier whereas our .NET 9 implementation only guaranteed a half barrier. It just so happens Task makes heavy use of interlocked functions.

The fix adds a full memory barrier around the interlocked functions.

Regression

  • Yes
  • No

We completed C11 atomics support in 12ecfe7. This change inadvertently guaranteed a half memory barrier instead a full, breaking consistency expectations.

Testing

We added tests extracted from our repro to validate the before and after. Before the fix, the crash would happen fairly quickly. After the fix was applied, not at all.

As to why we didn't hit this before, we did not have the kind of stress tests in place to simulate the contention customers would see at random.

Risk

Low - even though this is a sensitive area, the fix is targeted and has been well tested.

IMPORTANT: If this backport is for a servicing release, please verify that:

  • The PR target branch is release/X.0-staging, not release/X.0.

Package authoring no longer needed in .NET 9

IMPORTANT: Starting with .NET 9, you no longer need to edit a NuGet package's csproj to enable building and bump the version.
Keep in mind that we still need package authoring in .NET 8 and older versions.

@steveisok
Copy link
Member

Approved by tactics over email.

@steveisok steveisok enabled auto-merge (squash) May 16, 2025 13:53
@steveisok
Copy link
Member

/ba-g Generic infra timeouts.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Servicing-approved Approved for servicing release
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants