Commit Graph

91 Commits

Author SHA1 Message Date
Nathaniel Filardo
37766588de Linux PowerPC port 2020-05-23 15:42:10 +00:00
Nathaniel Filardo
44e9abe888 Move OS_PAGE_SIZE to PAL 2020-05-23 15:42:10 +00:00
Matthew Parkinson
87dfd41553 Improve code quality for alloc_size (#196)
* Improve code quality for alloc_size

* Made error noreturn.

* Update docs.

* Move annoation
2020-05-23 16:16:12 +01:00
Nathaniel Wesley Filardo
6dae830ea0 Use cmake to find backtrace() (#187)
On FreeBSD, this notably requires the use of -lexecinfo, as backtrace()
is not available in -lc.  Rather than testing in C, test in cmake.
2020-05-16 12:45:51 +01:00
Matthew Parkinson
a9cfc3a2b4 Various minor changes to aid compiling with std14 (#182)
These changes make the code compile in clang10 with -std14.
2020-05-07 15:02:31 +01:00
SchrodingerZhu
a43773c5b7 add android support (#171)
* adjust for android

* update docs

* add const qualifier to `alloc_size`

* check const qualifier in cmake
2020-04-18 07:58:13 +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
06eef5c4c5 Small changes (#159)
* Use NoZero for fresh pages
* MADV_DONTNEED only use for greater than a whole slab
* Simplify free list threading code
2020-04-02 07:04:03 +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
4246d9a065 Workaround for QEMU behaviour. (#147)
* Fixes for ARM

* Workaround for QEMU behaviour.
2020-03-19 12:37:44 +00:00
Matthew Parkinson
0b278747c7 Pal_linux mprotect bug fix
When simulating decommit on Linux enable pages
before zeroing.
2020-03-18 14:49:02 +00:00
David Carlier
55f1237df9 Few build tweaks. 2020-03-17 12:16:21 +00:00
David Carlier
2d4f2c3867 AAL, basic arm implementation proposal. 2020-03-13 08:09:14 +00:00
SchrodingerZhu
65de3c41bc fix mingw 2020-03-08 22:13:49 +08:00
Matthew Parkinson
9dc689762c Apply suggestions from code review 2020-03-04 17:44:54 +00:00
Amaury Chamayou
acbcbce597 replace assert with SNMALLOC_ASSERT 2020-03-04 16:57:44 +00:00
Matthew Parkinson
814f3ba289 Merge pull request #128 from microsoft/low-memory-async
Make Lazy Decomit asynchronous
2020-03-03 11:29:23 +00:00
Matthew Parkinson
813367286e Make Lazy Decomit asynchronous
On platforms that support low-memory notifications register callbacks
that perform lazy decommit. This allows idle processes to return memory
to the OS. Without incurring the cost of constantly committing and
decommitting memory.

Code review and CI changes

* Fixed test to use a template to make constexpr magic work
* Factored out basic notification mechanism so can be reused on other
platforms.
2020-02-27 20:05:44 +00:00
Amaury Chamayou
bd5702fa05 Fix recent OpenEnclave + snmalloc Release build 2020-02-27 14:12:28 +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
3775a625a4 Fix systematic testing for Verona. 2020-02-10 12:12:51 +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
4b175fceeb Make Posix platforms check Commit in Debug
By turning page access on and off, we can simulate the Windows
Commit/Decommit states on Posix platforms.

This is just enabled in Debug for now.
2020-02-04 10:19:23 +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
0affc069cf Make snmalloc build on Windows with Clang
Fixes a few places where Clang complains about Windows specific code,
and also uses macros supported by Clang on Windows.  A few places
separating platform and compiler specific code, as MSVC and WIN32 were
used interchangably previously.
2020-01-26 19:46:18 +00:00
Nathaniel Filardo
4d6759aca4 Make "pal_supports" not a function
But rather a template vardecl, as per C++14
2019-12-04 16:54:41 +00:00
Nathaniel Filardo
44f80c00fc pal_open_enclave: use pointers, not uintptr_t 2019-11-26 15:50:22 +00:00
Nathaniel Filardo
20e804728b Move bits::is_aligned_block to address.h
And chase consequences
2019-11-26 15:33:09 +00:00
David Chisnall
31941eac06 Add explicit qualification.
Calling a superclass method requires explicit qualification when the
superclass is a templated class.
2019-11-18 13:16:51 +00:00
David Carlier
281a88d404 Templatize the Tag ID value 2019-08-27 13:10:50 +00:00
David Carlier
eed50baf8e Little tweaks 2019-08-27 10:42:57 +00:00
David Carlier
c881429e2e Using the macro instead 2019-08-27 10:20:16 +00:00
David Carlier
24ae5d704e darwin: override zero/non zeroed pages to tag them. 2019-08-26 18:57:45 +01:00
Matthew Parkinson
4827b7615b Fix inline statics in Pal_Windows. 2019-08-15 11:38:45 +01:00
David Chisnall
6dbe24da2e [NFC] Replace HEADER_GLOBAL with inline (C++17).
HEADER_GLOBAL was using non-standard attributes to achieve what C++17
now permits with a keyword.  Use the standard formulation.

Update the README to note that gcc is still not recommended, but because
of its poor codegen for 128-bit atomic compare and exchange, rather than
because it doesn't support the attribute used for HEADER_GLOBAL.
2019-08-13 17:30:37 +01:00
David Chisnall
b1e4146239 Remove leftover (incorrect) conditional compilation. 2019-08-01 15:31:21 +01:00
David Chisnall
84140722fa Fix typo in NetBSD PAL. 2019-08-01 14:57:15 +01:00
David Chisnall
d24ad45abe [NFC] clangformat. 2019-08-01 12:03:35 +01:00
David Chisnall
81a0f0aed8 [NFC] Remove one more unneeded include. 2019-08-01 11:50:35 +01:00
David Chisnall
d11f09e4ec [NFC] Remove incorrect guard and some unused includes. 2019-08-01 11:50:27 +01:00
David Chisnall
896cc9cf6f [NFC] Rename some PALs to make the naming more consistent. 2019-08-01 11:44:09 +01:00
David Chisnall
2b44b6b5ea Add a NetBSD PAL.
Currently untested, but identical to the FreeBSD one so should work...
The NetBSD man pages for `madvise` and `mmap` mention the flags that we
use.
2019-08-01 11:41:08 +01:00
David Chisnall
fd88b8464b [NFC] Separate out support for aligned allocation from the FreeBSD PAL.
NetBSD also supports `MAP_ALIGNED()` in `mmap` (according to the man
page, at least).
2019-08-01 11:39:26 +01:00
David Chisnall
cf6fca6514 [NFC] Make the Apple PAL use the generic BSD code. 2019-08-01 11:21:32 +01:00
David Chisnall
54cbf8b2bb [NFC] Remove unused headers from OpenBSD PAL. 2019-08-01 11:21:28 +01:00
David Chisnall
0497993d23 Fix typo in OpenBSD PAL. 2019-08-01 11:20:05 +01:00
David Chisnall
d257f60731 [NFC] Add missing doc comments. 2019-08-01 11:03:22 +01:00
David Chisnall
4ed15def79 [NFC] Remove some code duplication in the PALs.
Pull out a generic POSIX PAL as a superclass for the Linux and generic
BSD PALs.  Now we have FreeBSD and Linux adding OS-specific behaviour,
OpenBSD as a named subclass of the generic BSD PAL that doesn't add any
behaviour.

I believe a NetBSD PAL should now be identical to the OpenBSD one -
patches welcome if anyone wants to test one!
2019-08-01 10:56:13 +01:00