Commit Graph

71 Commits

Author SHA1 Message Date
Matthew Parkinson
77ebff6909 Added simple stats tracking memory usage (#241)
These statistics can be maintained with effectively zero cost to
realistic applications.  They do not track the precise amount of
memory used, but are an over-approximation.
2020-08-28 14:01:52 +01:00
Matthew Parkinson
234c0e2e8e Clang format 2020-08-26 17:51:46 +01:00
Matthew Parkinson
0728db1413 Fixes to ctz on Windows Clang. 2020-08-26 17:51:46 +01:00
David CARLIER
c171de9a89 Include the wait.h from the portable location
Build complains about wrong header inclusion with musl, sys/wait.h ough to be
 instead.

Co-authored-by: David Carlier <dcarlier@afilias.info>
2020-08-18 16:51:05 +01:00
Matthew Parkinson
4e1f5829a7 Change default chunksize to 1MiB (#229)
This change makes the original 16MiB option not the common option.

It also changes the names of the defines to
  SNMALLOC_USE_LARGE_CHUNKS
  SNMALLOC_USE_SMALL_CHUNKS

The second should be set for Open Enclave configuration, and results in
256KiB chunk sizes.  The first being set builds the original 16MiB chunk
sizes.  If neither is set, then we default to 1MiB chunk sizes.
2020-07-09 13:22:32 +01:00
Schrodinger ZHU Yifan
8d1f3c3046 add limited test (#225)
* add limited test

* smaller allocation

* adjust test order

* CR, docs and QEMU
2020-07-08 20:38:54 +01:00
Matthew Parkinson
94a2ba4eda Revert "fixes for mingw (#215)" (#216)
This reverts commit 8f6b8db4ed.
2020-06-23 09:40:06 +01:00
Schrodinger ZHU Yifan
8f6b8db4ed fixes for mingw (#215)
* fix mingw

* fix mingw malloc test
2020-06-23 07:05:06 +01:00
Matthew Parkinson
e393ac882f New configuration of slab sizes for OE. 2020-06-18 13:09:06 +01:00
Theo Butler
61afa77898 Fix sizeclass rounding error 2020-06-08 07:55:32 +01:00
Anand Krishnamoorthi
c7736a2def OpenEnclave PAL: Store enclave heap base/end in inline variables. (#201)
PALOpenEnclave object is lazily constructed. I couldn't
figure out a straight-forward way to pass the heap bounds to
the constructor of PALOpenEnclave object.
As an alternative, store the bounds in inline static variables of
the PALOpenEnclave class and set them via static setup_initial_range
function.

- two_alloc_types/alloc1.cc
  Define oe_allocator_init to forward base, end values to
  PALOpenEnclave::setup_inital_range
- two_alloc_types/main.cc
  Use oe_allocator_init function to set up heap range.

- fixed_region/fixed_region.cc
  Initialize heap range via call to PALOpenEnclave::setup_inital_range.

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
2020-05-28 19:04:33 +01:00
Matthew Parkinson
c899ee7ab2 Large alloc fix (#178)
* Improved malloc style tests

Added comprehensive testing of realloc, and other minor improvements
to reporting errors.

* Fix realloc resizing for large sizeclasses.

The rounding by sizeclass was incorrect for large allocation.  This fixes
that.

* Ensure alloc_size is committed

There is an awkward interaction between alloc_size and
committing only what is requested.  If the user assumes
everything up to alloc_size is available, then we need to
either store the more precise size for alloc_size to return
or commit the whole 2^n range, so that alloc_size stays simple.

This changes to just make the whole range committed.
In the future, we might want to store a more precise size, so
that the allocation can be sized more precisely.

* Reduce size of objects.
2020-05-07 06:31:37 +01:00
Matthew Parkinson
d135786ad5 Test case for large non-pagealigned calloc size. 2020-04-14 12:11:04 +01:00
Matthew Parkinson
070aa9467d First calloc test. 2020-04-14 11:39:00 +01:00
Matthew Parkinson
74657d9dbc Defensive code for alloc/dealloc during TLS teardown (#161)
* Defensive code for alloc/dealloc during TLS teardown

If an allocation or deallocation occurs during TLS teardown, then it is
possible for a new allocator to be created and then this is leaked. On
the mimalloc-bench mstressN benchmark this was observed leading to a
large memory leak.

This fix, detects if we are in the TLS teardown phase, and if so,
the calls to alloc or dealloc must return the allocator once they have
perform the specific operation.

Uses a separate variable to represent if a thread_local's destructor has
run already.  This is used to detect thread teardown to put the
allocator into a special slow path to avoid leaks.

* Added some printing first operation to track progress

* Improve error messages on posix

Flush errors, print assert details, and present stack traces.

* Detect incorrect use of pool.

* Clang format.

* Replace broken LL/SC implementation

LL/SC implementation was broken, this replaces it with
a locking implementation. Changes the API to support LL/SC
for future implementation on ARM.

* Improve TLS teardown.

* Make std::function fully inlined.

* Factor out PALLinux stack trace.

* Add checks for leaking allocators.

* Add release build of Windows Clang
2020-04-07 15:37:26 +01:00
Matthew Parkinson
d900e29424 Improve slow path performance for allocation (#143)
* Remote dealloc refactor.

* Improve remote dealloc

Change remote to count down to 0, so fast path does not need a constant.

Use signed value so that branch does not depend on addition.

* Inline remote_dealloc

The fast path of remote_dealloc is sufficiently compact that it can be
inlined.

* Improve fast path in Slab::alloc

Turn the internal structure into tail calls, to improve fast path.
Should be no algorithmic changes.

* Refactor initialisation to help fast path.

Break lazy initialisation into two functions, so it is easier to codegen
fast paths.

* Minor tidy to statically sized dealloc.

* Refactor semi-slow path for alloc

Make the backup path a bit faster.  Only algorithmic change is to delay
checking for first allocation. Otherwise, should be unchanged.

* Test initial operation of a thread

The first operation a new thread takes is special.  It results in
allocating an allocator, and swinging it into the TLS.  This makes
this a very special path, that is rarely tested.  This test generates
a lot of threads to cover the first alloc and dealloc operations.

* Correctly handle reusing get_noncachable

* Fix large alloc stats

Large alloc stats aren't necessarily balanced on a thread, this changes
to tracking individual pushs and pops, rather than the net effect
(with an unsigned value).

* Fix TLS init on large alloc path

* Add Bump ptrs to allocator

Each allocator has a bump ptr for each size class.  This is no longer
slab local.

Slabs that haven't been fully allocated no longer need to be in the DLL
for this sizeclass.

* Change to a cycle non-empty list

This change reduces the branching in the case of finding a new free
list. Using a non-empty cyclic list enables branch free add, and a
single branch in remove to detect the empty case.

* Update differences

* Rename first allocation

Use needs initialisation as makes more sense for other scenarios.

* Use a ptrdiff to help with zero init.

* Make GlobalPlaceholder zero init

The GlobalPlaceholder allocator is now a zero init block of memory.
This removes various issues for when things are initialised. It is made read-only
to we detect write to it on some platforms.
2020-03-31 09:17:53 +01:00
Matthew Parkinson
77c453600b OE fixes (#157)
* Only compile OE PAL if required.

* OE:reserve: Fix bug in loop.

* Handle out of memory by returning nullptr.
2020-03-25 08:10:39 +00:00
Matthew Parkinson
f301fdd2a0 Added SGX AAL. (#149) 2020-03-19 15:07:29 +00:00
Amaury Chamayou
8e3efcb1dc Assert not going through the PAL (#140)
* Assert not going through the PAL

* Make it more difficult to assert() accidentally
2020-03-11 15:58:44 +00:00
Amaury Chamayou
acbcbce597 replace assert with SNMALLOC_ASSERT 2020-03-04 16:57:44 +00:00
Amaury Chamayou
9f31f8075c Use UNUSED 2020-02-27 17:24:07 +00:00
Amaury Chamayou
fdc582b619 Fix formatting 2020-02-27 16:21:24 +00:00
Amaury Chamayou
bd5702fa05 Fix recent OpenEnclave + snmalloc Release build 2020-02-27 14:12:28 +00:00
Matthew Parkinson
be47aea0c8 Tidying 2020-02-26 21:24:02 +00:00
Matthew Parkinson
c1c8a7bfee Clang format. 2020-02-26 20:59:38 +00:00
Matthew Parkinson
136dd23932 Fixed test. 2020-02-26 20:39:31 +00:00
Matthew Parkinson
9f53ec0ef8 Reduce dependence on C++ runtime
If the external thread statics are used, then
we don't need to include some C++ runtime
concepts. This refactoring moves some global initialization under
conditional compilation.
2020-02-26 17:55:29 +00:00
Matthew Parkinson
28658a47f0 Code review feedback. 2020-02-05 12:47:24 +00:00
Matthew Parkinson
bad94e80d3 Clangformat 2020-02-04 10:24:57 +00:00
Matthew Parkinson
350df5d13d New strategy for producing aligned blocks of memory
On platforms that do not support aligned mmap/VirtualAlloc,
we need to produce heavily aligned blocks to guarantee we can meet
all possible alignment requests.

This commit grabs a block much larger than requested, and then produces
"offcuts" before and after the block of smaller/same "large_classes".  This
enables one mmap/virtual alloc request to services many other requests
for aligned memory.
2020-02-04 10:19:22 +00:00
Matthew Parkinson
4fea7b8bb1 Make Pals only return amount of memory requested
The PAL API previously allowed for returning more memory than asked for.
This was when the PAL performed the alignment work, now this is done in
large alloc, so removing from the PAL.
2020-02-04 10:19:22 +00:00
Matthew Parkinson
6e8edefc99 Make all large allocations naturally aligned
This makes any large allocation naturally aligned to its size. This
means all alignment requests can be handled without checks.
2020-02-04 10:19:22 +00:00
SchrodingerZhu
8304dedd17 add rust support (#113)
* add rust support

* move aligned_size to sizeclass.h

* add static qualifier

* adjust CMakeLists.txt, may broke CI tests

* fix msvc's complaining on c++17

* use SNMALLOC_FAST_PATH as the decorator of aligned_size

* adapt new alignment algorithm and add related test

Co-authored-by: mjp41 <mattpark@microsoft.com>

* fix test cases for msvc

* add extra test for size == 0

* treat memory block of same sizeclass as the same

* fix formatting problem

* remove extra declarations

Co-authored-by: Matthew Parkinson <mjp41@users.noreply.github.com>
2020-01-23 07:08:18 +00:00
Nathaniel Filardo
c7d509e418 test/func/malloc: align check as size_t
If the test happens as uintptr_t on CHERI, then we attempt to construct
a capability and use a capability-based test rather than an
integer-based one, and things go south.
2019-11-26 15:50:22 +00:00
Nathaniel Filardo
0b47145526 test/func/malloc: posix_memalign vs. size_t
posix_memalign requires that the alignment parameter be a multiple of
sizeof(uintptr_t), but the test begins with alignments as small as
sizeof(size_t).  While those are very likely the same value out in the
wild right now, they're not on CHERI.

Begin the test loop at sizeof(uintptr_t) and add a test that a request
for a reasonable amount of memory but with an alignment of
sizeof(uintptr_t)/2 fails with EINVAL.
2019-11-26 15:50:22 +00:00
Nathaniel Filardo
261249d9cb Preserve provenance through pointer offsetting 2019-11-26 14:59:54 +00:00
Matthew Parkinson
18da679042 Missing setup call. 2019-08-15 10:52:08 +01:00
Matthew Parkinson
9eaadcd6d8 Reduce parallism in tests
If some tests on Windows are co-scheduled, then they run out of commit
space and crash. For example, in func-memory,
test_external_pointer_large can cause the small CI machines to run out
of commit space on Windows.
2019-08-15 10:50:54 +01:00
Matthew Parkinson
e9432fe9ca Shrink reserve as failing in CI. 2019-08-13 16:31:41 +01:00
Matthew Parkinson
16b084f501 Changed abort behaviour for Windows CI. 2019-08-13 15:37:54 +01:00
Matthew Parkinson
bef2fb94d8 Clangformat 2019-08-13 13:27:33 +01:00
Matthew Parkinson
f545c1c790 Test for debug_check_emtpy. 2019-08-13 13:04:29 +01:00
Matthew Parkinson
6151b7a9b2 Make test_realloc not leak in failure case. 2019-08-13 13:03:06 +01:00
Matthew Parkinson
a32882cd55 Make malloc functional test check for leaks. 2019-08-13 13:03:06 +01:00
Matthew Parkinson
df1896d55f Improved ThreadAlloc::get API
Made the API so that get always returns an initialised Alloc*.  Added
new fast path that doesn't perform checking, but can lead to very slow
behaviour if called and reused.
2019-07-15 15:02:47 +01:00
David Chisnall
14b5c57b55 Fix all of the tests. 2019-07-05 13:24:28 +01:00
Matthew Parkinson
7a8eaec2cc Made a sizecass_t to wrap the sizeclass
This is useful as codegen is nicer if we use size_t, but the semantics
is uint8_t, and is stored as that in many places in the metadata.
Ultimately should introduce a wrapper to check this invariant.
2019-07-01 14:30:05 +01:00
Matthew Parkinson
5030fff9bd Missing include from test. 2019-04-29 11:02:47 +01:00
David Chisnall
ca804c1815 [NFC] clang-format 2019-04-11 17:36:14 +01:00
David Chisnall
5c1abffdda Fix missing const. 2019-04-11 17:25:53 +01:00