Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

@pavelsavara@tannergooding@jkotas@am11
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

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

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

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

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

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

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

@pavelsavara@tannergooding@jkotas@am11
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

@pavelsavara@tannergooding@jkotas@am11
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

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

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR - #127904

Merged
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize
May 11, 2026
Merged

Replace GetOsPageSize() with minipal_getpagesize() in CoreCLR#127904
pavelsavara merged 11 commits into
dotnet:mainfrom
pavelsavara:minipal_getpagesize

Conversation

@pavelsavara

@pavelsavarapavelsavara commented May 7, 2026

Copy link
Copy Markdown
Member

Fixes#127550

Summary

Remove the GetOsPageSize() wrapper from utilcode and replace all call sites in CoreCLR with the new minipal_getpagesize() API introduced in #127328.

Motivation

PR #127328 introduced minipal_getpagesize() in src/native/minipal/ospagesize.h as the canonical way to query the OS page size across all platforms:

  • Windows: inline constant 4096 (no syscall)
  • WASM: inline constant 16384 (reduced from the 64KB memory.grow granularity)
  • Unix: cached getpagesize() result (queried once per process)

The old GetOsPageSize() in src/coreclr/utilcode/util.cpp duplicated this logic with slightly different behavior (used GetSystemInfo().dwAllocationGranularity on the PAL path, hardcoded 0x1000 on Windows). Consolidating on the minipal version eliminates the duplication and ensures consistent page-size semantics, particularly for WASM where the correct value is 16KB.

Changes

minipal_getpagesize() API

  • Return type changed from size_t to uint32_t so the value matches the natural width used by call sites and avoids (uint32_t) casts at every use.
  • Windows and WASM remain inline compile-time constants (the GC requires this to fold into a constant for alignment math).

CoreCLR consumers

  • RemovedGetOsPageSize() and GetOsPageSizeUncached() definitions from src/coreclr/utilcode/util.cpp
  • RemovedGetOsPageSize() declaration from src/coreclr/inc/utilcode.h
  • Added#include <minipal/ospagesize.h> to utilcode.h (covers all VM/utilcode consumers) and to the two PAL test files that don't include utilcode.h
  • Replaced all GetOsPageSize() call sites with minipal_getpagesize()
  • Removed redundant (uint32_t) and (ptrdiff_t) casts at call sites now that minipal_getpagesize() returns uint32_t
  • FixedHARD_GUARD_REGION_SIZE being defined twice in threads.h (removed the redundant first definition)
  • FixedSIZEOF_DEFAULT_STACK_GUARANTEE and HARD_GUARD_REGION_SIZE macro hygiene (wrapped in outer parentheses, removed pointless 1 * multiplier)
  • AdjustedROUND_DOWN_TO_PAGE/ROUND_UP_TO_PAGE in codeman.h to widen the page size to size_t before the bit-NOT mask, avoiding MSVC C4319 (zero-extending uint32_t to size_t)

@pavelsavarapavelsavara added this to the 11.0.0 milestone May 7, 2026
@pavelsavarapavelsavara self-assigned this May 7, 2026
CopilotAI review requested due to automatic review settings May 7, 2026 08:04
@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.

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

This PR standardizes CoreCLR’s “OS page size” queries by removing the utilcode GetOsPageSize() wrapper and migrating call sites to the canonical minipal_getpagesize() API (including updating a few page-size-related macros and PAL tests). This helps ensure consistent semantics across platforms (notably WASM’s 16KB page size behavior).

Changes:

  • Removed GetOsPageSize() / GetOsPageSizeUncached() from utilcode and updated all CoreCLR call sites to use minipal_getpagesize().
  • Added/propagated minipal/ospagesize.h inclusion (via utilcode.h and directly in a couple PAL tests).
  • Cleaned up some page-size-related macro definitions (duplicate define removal + extra parentheses).

Reviewed changes

Copilot reviewed 30 out of 30 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tests/PrecodeStubsTests.csUpdates embedded native-code comment to reflect minipal_getpagesize().
src/coreclr/vm/virtualcallstub.cppUses minipal_getpagesize() for reserve/commit alignment and page computations.
src/coreclr/vm/threads.hReplaces page-size macros with minipal_getpagesize() and removes duplicate define.
src/coreclr/vm/threads.cppReplaces page-size uses in asserts/debug logging/guard-page math with minipal_getpagesize().
src/coreclr/vm/peimagelayout.cppUses minipal_getpagesize() for mapping alignment and validation.
src/coreclr/vm/loaderallocator.cppUses minipal_getpagesize() for collectible heap sizing constants.
src/coreclr/vm/jitinterface.hUpdates UNIX null-check offset definition to use minipal_getpagesize().
src/coreclr/vm/jitinterface.cppReports osPageSize via minipal_getpagesize() in EE info.
src/coreclr/vm/i386/jitinterfacex86.cppUpdates debug asserts to use minipal_getpagesize().
src/coreclr/vm/hosting.cppUpdates UEF section page calculations to use minipal_getpagesize().
src/coreclr/vm/frames.cppUpdates “frame order” relaxation logic to use minipal_getpagesize().
src/coreclr/vm/excep.hUses minipal_getpagesize() for NULL_AREA_SIZE on UNIX.
src/coreclr/vm/debughelp.cppUses minipal_getpagesize() when walking/touching pages for readability checks.
src/coreclr/vm/codeman.hUpdates rounding-to-page macros and comments to use minipal_getpagesize().
src/coreclr/vm/ceemain.cppAligns mini-metadata buffer sizing using minipal_getpagesize().
src/coreclr/vm/appdomain.hppUpdates loader heap reserve/commit sizing macros to use minipal_getpagesize().
src/coreclr/utilcode/util.cppRemoves the old GetOsPageSize* implementations.
src/coreclr/utilcode/loaderheap.cppUses minipal_getpagesize() for commit sizing alignment.
src/coreclr/utilcode/interleavedloaderheap.cppUses minipal_getpagesize() for alignment/assertions.
src/coreclr/utilcode/explicitcontrolloaderheap.cppUses minipal_getpagesize() for commit block sizing and alignment.
src/coreclr/utilcode/executableallocator.cppUses minipal_getpagesize() when randomizing preferred range start.
src/coreclr/utilcode/dacutil.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/utilcode/clrhost_nodependencies.cppUses minipal_getpagesize() for page-aligned region checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test3/test3.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cppIncludes ospagesize.h and uses minipal_getpagesize() in allocations/checks.
src/coreclr/inc/utilcode.hIncludes minipal/ospagesize.h and removes GetOsPageSize() declaration.
src/coreclr/inc/pedecoder.inlUses minipal_getpagesize() when temporarily setting decoder size to 2 pages.
src/coreclr/inc/loaderheap.hUpdates stub code page sizing logic to use minipal_getpagesize().
src/coreclr/debug/di/shimlocaldatatarget.cppUses minipal_getpagesize() for page-boundary-limited reads.
src/coreclr/debug/daccess/enummem.cppUses minipal_getpagesize() for page-chunked memory reporting.

Comment threadsrc/coreclr/vm/loaderallocator.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
Comment threadsrc/coreclr/vm/threads.cpp Outdated
@pavelsavara
pavelsavara marked this pull request as ready for review May 7, 2026 12:31
CopilotAI review requested due to automatic review settings May 7, 2026 12:31
@pavelsavara
pavelsavara requested a review from jkotasMay 7, 2026 12:31

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

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

Comment threadsrc/coreclr/pal/tests/palsuite/miscellaneous/IsBadWritePtr/test2/test2.cpp Outdated
@tannergooding

Copy link
Copy Markdown
Member

Windows: inline constant 4096 (no syscall)

Pretty sure this is not a guarantee of Windows. You are expected to call GetSystemInfo() and read the dwPageSize property. https://devblogs.microsoft.com/oldnewthing/20210510-00/?p=105200 notably goes over some processors that deviate and where Windows has attempted deviations in the past.

I would rather expect that this also makes no difference as to perf for the GC. While we cannot know the page size for certain, we can know that it should only ever be a power of 2 and so we can manually optimize the divisions or modulus ourselves via an unsigned right shift -or- simple bitmasking. -- When we query on startup simply cache the log2(pageSize) and then right shift by it for any latter division.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers, and I wouldn't be surprised if that changes for Windows as well.

CopilotAI review requested due to automatic review settings May 8, 2026 09:21
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

You are expected to call GetSystemInfo() and read the dwPageSize property.

Done

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

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

Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.h
@jkotas

jkotas commented May 8, 2026

Copy link
Copy Markdown
Member

Pretty sure this is not a guarantee of Windows.

It is guaranteed on Windows in practice. Every other piece of software for Windows (including many places in Windows itself) has 4kB page size hardcoded somewhere. In case they figure out how to change the page size, it will be an opt-in. We can update this and other places where we depend on the page size indirectly as part of opt-in.

Many other OS are trending towards to larger page sizes on Arm64 (often 16KB) even, particularly for servers

There are also equivalent features being built into the hardware that merge the adjacent page entries into a single TLB cache entry. It provides most of the benefit of large page sizes without breaking software compatibility.

Comment threadsrc/native/minipal/ospagesize.h
Comment threadsrc/native/minipal/ospagesize.c Outdated
CopilotAI review requested due to automatic review settings May 8, 2026 14:56

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

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

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated

@jkotasjkotas left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Thanks

@am11am11 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

nit: standard C11 version

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/native/minipal/ospagesize.c Outdated
Comment threadsrc/coreclr/vm/i386/jitinterfacex86.cpp Outdated
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 9, 2026 10:02
pavelsavaraand others added 3 commits May 9, 2026 12:03
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>
Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com>

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

Copilot reviewed 36 out of 36 changed files in this pull request and generated 3 comments.

Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/native/minipal/ospagesize.c
Comment threadsrc/coreclr/pal/src/exception/machexception.cpp
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g unrelated CI issues

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g first ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g second ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g third ba-g didn't work

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

/ba-g 4th ba-g didn't work

@pavelsavara
pavelsavara merged commit 15aceea into dotnet:mainMay 11, 2026
185 of 191 checks passed
@pavelsavara
pavelsavara deleted the minipal_getpagesize branch May 11, 2026 15:22
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Jun 11, 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.

Replace GetOsPageSize with minipal_getpagesize

5 participants

@pavelsavara@tannergooding@jkotas@am11