Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Alter PAGE_SIZE usage #534

Merged
merged 3 commits into from
May 31, 2022
Merged

Alter PAGE_SIZE usage #534

merged 3 commits into from
May 31, 2022

Conversation

mjp41
Copy link
Member

@mjp41 mjp41 commented May 30, 2022

Using PAGE_SIZE as the minimum size of the CHUNK means that if this is
configured to 2MiB, then there is a gap between
MAX_SMALL_SIZECLASS_SIZE, and MIN_CHUNK_SIZE, and thus
we can't represent certain sizes.

This removes that connection, and adds a static assert to check for the issue.

@mjp41
Copy link
Member Author

mjp41 commented May 30, 2022

#485 I believe this will fix the crashes that @misakikasumi observed when trying to build Windows Huge page support.

@mjp41 mjp41 requested a review from nwf-msr May 30, 2022 13:54
@mjp41
Copy link
Member Author

mjp41 commented May 30, 2022

@nwf-msr this primarily affects your PowerPC setup, so if you could make sure I haven't broken anything that would be great.

@mjp41 mjp41 force-pushed the huge_page_prep branch from bf61372 to 9cdf0d7 Compare May 30, 2022 13:56
@nwf-msr
Copy link
Contributor

nwf-msr commented May 30, 2022

This breaks a debug build of snmalloc on my PowerPC machine; many of the -check tests fail. With apologies, the call stack is below.

Starting program: /cheri/build/mainline/snmalloc2-native-build/func-memory-check
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/powerpc64le-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
snmalloc::BuddyInplaceRep::set (ptr=0x7ebfa8479000, r=...) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/smallbuddyrange.h:37
37                reinterpret_cast<FreeChunk*>((*ptr).unsafe_uintptr() & MASK));
(gdb) bt
#0  snmalloc::BuddyInplaceRep::set (ptr=0x7ebfa8479000, r=...) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/smallbuddyrange.h:37
#1  0x000000001004dc18 in snmalloc::RBTree<snmalloc::BuddyInplaceRep, true, false>::ChildRef::operator= (this=0x7fffd1dd8dd8, t=...) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/../ds/../pal/../aal/../ds_core/redblacktree.h:134
#2  0x000000001004f240 in snmalloc::RBTree<snmalloc::BuddyInplaceRep, true, false>::insert_path (
    this=0x10090878 <snmalloc::StaticParent<snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, sn
malloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyR
ange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>,
14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::Pa
geMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > > >::parent+72>, path=..., value=...) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/../ds/../pal/../aal/../ds_core/redblacktree.h:649
#3  0x000000001004c4f4 in snmalloc::Buddy<snmalloc::BuddyInplaceRep, 4ul, 14ul>::add_block (
    this=0x10090838 <snmalloc::StaticParent<snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, sn
malloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyR
ange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>,
14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::Pa
geMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > > >::parent+8>, addr=..., size=4096) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/buddy.h:85
#4  0x000000001005057c in snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagema
p<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyRange<24ul, 63ul, s
nmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::Pa
gemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>
, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > >::add_range(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long)::{lambda(snmalloc::CapPtr<void, snma
lloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long, bool)#1}::operator()(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::Addr
essSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long, bool) const (this=0x7fffd1dd9958, base=..., align=4096) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/smallbuddyrange.h:165
#5  0x0000000010050480 in snmalloc::range_to_pow_2_blocks<4ul, snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snm
alloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, sn
malloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::Pag
eMapEntry, false>, 14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::P
ALLinux, false>::PageMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > >::add_range(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long)
::{lambda(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long, bool)#1}>(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmallo
c::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long, snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::Backen
dAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmall
oc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::Backen
dAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, fals
e>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > >::add_range(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr
::dimension::Wildness)1> >, unsigned long)::{lambda(snmalloc::CapPtr<void, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)1, (snmalloc::capptr::dimension::AddressSpaceControl)1, (snmalloc::capptr::dimension::Wildness)1> >, unsigned long, bool)#1}) (base=..., length=12288, f=...)
    at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/range_helpers.h:30
#6  0x0000000010050270 in snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagema
p<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyRange<24ul, 63ul, s
nmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::Pa
gemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>
, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > >::add_range (
    this=0x10090830 <snmalloc::StaticParent<snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, sn
malloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyR
ange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>,
14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::Pa
geMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > > >::parent>, base=..., length=12288) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/smallbuddyrange.h:162
#7  0x00000000100501f4 in snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagema
p<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyRange<24ul, 63ul, s
nmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::Pa
gemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>
, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > >::refill (
    this=0x10090830 <snmalloc::StaticParent<snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, sn
malloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyR
ange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>,
14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::Pa
geMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > > >::parent>, size=4096) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/smallbuddyrange.h:177
#8  0x0000000010050110 in snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagema
p<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyRange<24ul, 63ul, s
nmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::Pa
gemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>
, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > >::alloc_range (
    this=0x10090830 <snmalloc::StaticParent<snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, sn
malloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBuddyR
ange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>,
14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::Pa
geMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > > >::parent>, size=4096) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/smallbuddyrange.h:210
#9  0x0000000010041cc8 in snmalloc::GlobalRange<snmalloc::SmallBuddyRange<snmalloc::StatsRange<snmalloc::CommitRange<snmalloc::PALLinux, snmalloc::GlobalRange<snmalloc::LogRange<4ul, snmalloc::LargeBuddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux
, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, false>, 14ul, snmalloc::SubRange<snmalloc::PALLinux, 6ul, snmalloc::GlobalRange<snmalloc::LogRange<2ul, snmalloc::LargeBu
ddyRange<24ul, 63ul, snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, fals
e>, 14ul, snmalloc::PagemapRegisterRange<snmalloc::BasicPagemap<snmalloc::BackendAllocator<snmalloc::PALLinux, false>, snmalloc::PALLinux, snmalloc::FlatPagemap<14ul, snmalloc::BackendAllocator<snmalloc::PALLinux, false>::PageMapEntry, snmalloc::PALLinux, false>, snmalloc::BackendAllocator<snmalloc::PALLinux, false>
::PageMapEntry, false>, true, snmalloc::PalRange<snmalloc::PALLinux> > > > > > > > > > > > >::alloc_range (this=0x7fffd1dd9d00, size=4096) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/globalrange.h:39
#10 0x00000000100410cc in snmalloc::BackendAllocator<snmalloc::PALLinux, false>::alloc_meta_data<snmalloc::CoreAllocator<snmalloc::Globals> > (local_state=0x0, size=2304) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend/../backend/backend.h:247
#11 0x000000001003e940 in snmalloc::Pool<snmalloc::CoreAllocator<snmalloc::Globals>, snmalloc::Globals, &snmalloc::Globals::pool>::acquire<snmalloc::LocalCache*> (args=@0x7fffd1dd9eb8: 0x7fffa8dd5640) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/pool.h:135
#12 0x000000001003e4dc in snmalloc::LocalAllocator<snmalloc::Globals>::init (this=0x7fffa8dd5640) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/localalloc.h:383
#13 0x0000000010061c98 in snmalloc::LocalAllocator<snmalloc::Globals>::lazy_init<snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0>(unsigned long)::{lambda(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension
::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*)#1}::operator()(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmal
loc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*) const::{lambda(snmallo
c::CoreAllocator<snmalloc::Globals>*, unsigned long)#1}, unsigned long>(snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0>(unsigned long)::{lambda(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::Address
SpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*)#1}::operator()(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capp
tr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*) const::{lambda(snmalloc::CoreAl
locator<snmalloc::Globals>*, unsigned long)#1}, unsigned long) (this=0x7fffa8dd5640, action=..., args=0) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/localalloc.h:138
#14 0x000000001002f5c8 in snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0>(unsigned long)::{lambda(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::
Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*)#1}::operator()(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::d
--Type <RET> for more, q to quit, c to continue without paging--
imension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*) const (this=0x7fffd1de2808, sizeclass=0, fl=0x7fffa8dd5640)
    at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/localalloc.h:235
#15 snmalloc::LocalCache::alloc<(snmalloc::ZeroMem)0, snmalloc::Globals, snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0>(unsigned long)::{lambda(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::Addres
sSpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*)#1}, snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0>(unsigned l
ong)::{lambda(snmalloc::CapPtr<snmalloc::freelist::Object::T<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension
::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >)#1}>(snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0>(unsigned long)::{lambda(snmalloc::CapPtr<snmalloc::freelist::Object::T<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension
::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >)#1}, unsigned long, snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmallo
c::ZeroMem)0>(unsigned long)::{lambda(unsigned long, snmalloc::freelist::Iter<snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::capptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)1>, snmalloc::capptr::bound<(snmalloc::capptr::dimension::Spatial)0, (snmalloc::ca
pptr::dimension::AddressSpaceControl)0, (snmalloc::capptr::dimension::Wildness)0> >*)#1}) (this=0x7fffa8dd5640, domesticate=..., size=16, slowpath=...) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/localcache.h:113
#16 snmalloc::LocalAllocator<snmalloc::Globals>::small_alloc<(snmalloc::ZeroMem)0> (this=0x7fffa8dd5640, size=16) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/localalloc.h:242
#17 snmalloc::LocalAllocator<snmalloc::Globals>::alloc<(snmalloc::ZeroMem)0> (this=0x7fffa8dd5640, size=16) at /cheri/source/mainline/snmalloc2/src/snmalloc/backend_helpers/../mem/localalloc.h:442
#18 test_alloc_dealloc_64k () at /cheri/source/mainline/snmalloc2/src/test/func/memory/memory.cc:97
#19 0x000000001003bc40 in main (argc=1, argv=0x7fffd1de2f18) at /cheri/source/mainline/snmalloc2/src/test/func/memory/memory.cc:542

@nwf-msr
Copy link
Contributor

nwf-msr commented May 30, 2022

Ah, a little prodding and some belated understanding:

capptr::Chunk<void> refill(size_t size)
{
auto refill = parent.alloc_range(MIN_CHUNK_SIZE);
if (refill != nullptr)
add_range(pointer_offset(refill, size), MIN_CHUNK_SIZE - size);
return refill;
}

needs to grab things in multiples of OS_PAGE_SIZE otherwise the mprotect inside
template<ZeroMem zero_mem>
static void notify_using(void* p, size_t size) noexcept
{
SNMALLOC_ASSERT(
is_aligned_block<OS::page_size>(p, size) || (zero_mem == NoZero));
if constexpr (PalEnforceAccess)
mprotect(p, size, PROT_READ | PROT_WRITE);
else
{
UNUSED(p, size);
}
if constexpr (zero_mem == YesZero)
zero<true>(p, size);
}

will return EINVAL (as it is here; should we SNMALLOC_ASSERT on that returning 0?). The assert isn't saving us because CommitRange passes NoZero:
capptr::Chunk<void> alloc_range(size_t size)
{
auto range = parent.alloc_range(size);
if (range != nullptr)
PAL::template notify_using<NoZero>(range.unsafe_ptr(), size);
return range;
}

Maybe the PAL's assertion should actually be

is_aligned_block<OS::page_size>(p, size) || (!PalEnforceAccess && (zero_mem == NoZero)) 

or maybe just

is_aligned_block<OS::page_size>(p, size)

since PalEnforceAccess is a static, global configuration knob?

@mjp41 mjp41 marked this pull request as draft May 30, 2022 20:20
@mjp41
Copy link
Member Author

mjp41 commented May 30, 2022

Moving to draft. To fix this issue is going to conflict with #530. To fix, we need

  • Explicit OS_PAGE_SIZE as the minimum size for the LargeBuddyRange in a few places so that we don't make sub page requests to the CommitRange.
  • Add assert to CommitRange, so it fails more cleanly
  • Probably a static_assert to check minimium size <= request_size on LargeBuddyRange.

mjp41 added 3 commits May 31, 2022 11:55
Using PAGE_SIZE as the minimum size of the CHUNK means that if this is
configured to 2MiB, then there is a gap between
MAX_SMALL_SIZECLASS_SIZE, and MIN_CHUNK_SIZE, and thus
we can't represent certain sizes,
@mjp41 mjp41 force-pushed the huge_page_prep branch from 9cdf0d7 to 23f50a1 Compare May 31, 2022 12:23
Copy link
Contributor

@nwf-msr nwf-msr left a comment

Choose a reason for hiding this comment

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

LGTM and passes on POWER

@mjp41 mjp41 marked this pull request as ready for review May 31, 2022 12:59
@mjp41 mjp41 merged commit 53d9fd2 into microsoft:main May 31, 2022
@mjp41 mjp41 deleted the huge_page_prep branch May 31, 2022 12:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants