summaryrefslogtreecommitdiff
path: root/rts/sm
Commit message (Collapse)AuthorAgeFilesLines
* nonmoving: Non-concurrent collectionBen Gamari2023-03-085-71/+107
|
* rts: Capture GC configuration in a structBen Gamari2023-03-082-17/+24
| | | | | The number of distinct arguments passed to GarbageCollect was getting a bit out of hand.
* rts: Fix incorrect STATIC_INLINEBen Gamari2023-03-081-1/+1
| | | | This should be INLINE_HEADER lest we get unused declaration warnings.
* rts: Rename clear_segment(_free_blocks)?Ben Gamari2023-03-083-9/+9
| | | | | To reflect the fact that these are to do with the nonmoving collector, now since they are exposed no longer static.
* nonmoving: Split out nonmovingAllocateGCBen Gamari2023-03-084-15/+55
|
* nonmoving: Move allocator into new source fileBen Gamari2023-03-086-198/+236
|
* nonmoving: Ensure that sanity checker accounts for saved_filled segmentsBen Gamari2023-03-081-0/+1
|
* nonmoving: Fix unregisterised buildBen Gamari2023-03-081-0/+4
|
* rts: Encapsulate block allocator spinlockBen Gamari2023-03-086-16/+28
| | | | | This makes it a bit easier to add instrumentation on this spinlock while debugging.
* nonmoving: Don't call prepareUnloadCheckBen Gamari2023-03-081-1/+2
| | | | | | When the nonmoving GC is in use we do not call `checkUnload` (since we don't unload code) and therefore should not call `prepareUnloadCheck`, lest we run into assertions.
* rts/Sanity: Fix block count assertion with non-moving collectorBen Gamari2023-03-081-3/+13
| | | | | | | The nonmoving collector does not use `oldest_gen->blocks` to track its block list. However, it nevertheless updates `oldest_gen->n_blocks` to ensure that its size is accounted for by the storage manager. Consequently, we must not attempt to assert consistency between the two.
* nonmoving: Fix Note referencesBen Gamari2023-03-086-7/+7
| | | | | Some references to Note [Deadlock detection under the non-moving collector] were missing an article.
* nonmoving: Move current segment array into CapabilityBen Gamari2023-03-088-137/+80
| | | | | | | | | | | | | | The current segments are conceptually owned by the mutator, not the collector. Consequently, it was quite tricky to prove that the mutator would not race with the collect due to this shared state. It turns out that such races are possible: when resizing the current segment array we may concurrently try to take a heap census. This will attempt to walk the current segment array, causing a data race. Fix this by moving the current segment array into `Capability`, where it belongs. Fixes #22926.
* rts: Reenable assertionBen Gamari2023-03-081-1/+1
|
* nonmoving: Allow pinned gen0 objects to be WEAK keysBen Gamari2023-03-081-4/+14
|
* nonmoving: Sync-phase mark budgetingBen Gamari2023-03-083-12/+86
| | | | | | | | | | Here we significantly improve the bound on sync phase pause times by imposing a limit on the amount of work that we can perform during the sync. If we find that we have exceeded our marking budget then we allow the mutators to resume, return to concurrent marking, and try synchronizing again later. Fixes #22929.
* nonmoving: Be more paranoid in segment trackingBen Gamari2023-03-083-1/+7
| | | | | Previously we left various segment link pointers dangling. None of this wrong per se, but it did make it harder than necessary to debug.
* nonmoving: Don't push if nonmoving collector isn't enabledBen Gamari2023-03-081-1/+1
|
* nonmoving: Avoid n_caps raceBen Gamari2023-03-081-4/+4
|
* nonmoving: Post-sweep sanity checkingBen Gamari2023-03-081-1/+13
|
* nonmoving: Add missing write barriers in selector optimisationBen Gamari2023-03-082-6/+62
| | | | | | | This fixes the selector optimisation, adding a few write barriers which are necessary for soundness. See the inline comments for details. Fixes #22930.
* nonmoving: Don't clobber update rem sets of old capabilitiesBen Gamari2023-03-081-1/+1
| | | | | | | | | Previously `storageAddCapabilities` (called by `setNumCapabilities`) would clobber the update remembered sets of existing capabilities when increasing the capability count. Fix this by only initializing the update remembered sets of the newly-created capabilities. Fixes #22927.
* nonmoving: Handle new closures in nonmovingIsNowAliveBen Gamari2023-03-082-8/+18
| | | | | We must conservatively assume that new closures are reachable since we are not guaranteed to mark such blocks.
* nonmoving: Assert state of swept segmentsBen Gamari2023-03-082-0/+3
|
* nonmoving: Fix tracking of FILLED_SWEEPING segmentsBen Gamari2023-03-081-1/+1
| | | | | Previously we only updated the state of the segment at the head of each allocator's filled list.
* nonmoving: Don't show occupancy if we didn't collect live wordsBen Gamari2023-03-083-17/+41
|
* nonmoving: Sanity check mutable listBen Gamari2023-03-081-0/+1
| | | | | Assert that entries in the nonmoving generation's generational remembered set (a.k.a. mutable list) live in nonmoving generation.
* nonmoving: Sanity check nonmoving large objects and compactsBen Gamari2023-03-081-0/+5
|
* nonmoving: Fix handling of weak pointersBen Gamari2023-03-085-79/+161
| | | | | | | | | | | | | This fixes an interaction between aging and weak pointer handling which prevented the finalization of some weak pointers. In particular, weak pointers could have their keys incorrectly marked by the preparatory collector, preventing their finalization by the subsequent concurrent collection. While in the area, we also significantly improve the assertions regarding weak pointers. Fixes #22327.
* nonmoving: Add missing no-op in busy-wait loopBen Gamari2023-03-081-2/+5
|
* nonmoving: Clarify commentBen Gamari2023-03-081-1/+1
|
* nonmoving: Clarify implementationBen Gamari2023-03-081-10/+11
| | | | This makes the intent of this implementation a bit clearer.
* Evac: Squash data race in eval_selector_chainBen Gamari2023-03-081-2/+3
|
* rts/Sanity: Look at nonmoving saved_filled listsBen Gamari2023-03-081-0/+2
|
* rts/Sanity: Mark pinned_object_blocksBen Gamari2023-03-081-0/+1
|
* rts/BlockAlloc: Allow disabling of internal assertionsBen Gamari2023-03-081-6/+16
| | | | | These can be quite expensive and it is sometimes useful to compile a DEBUG RTS without them.
* nonmoving: Deduplicate assertionBen Gamari2023-03-081-2/+9
|
* nonmoving: Fix styleBen Gamari2023-03-081-2/+3
|
* rts: add the rts_clearMemory functionCheng Shao2023-02-156-4/+71
| | | | | | | This patch adds the rts_clearMemory function that does its best to zero out unused RTS memory for a wasm backend use case. See the comment above rts_clearMemory() prototype declaration for more detailed explanation. Closes #22920.
* rts: make it possible to change mblock size on 32-bit targetsCheng Shao2023-02-143-3/+9
| | | | | | | | The MBLOCK_SHIFT macro must be the single source of truth for defining the mblock size, and changing it should only affect performance, not correctness. This patch makes it truly possible to reconfigure mblock size, at least on 32-bit targets, by fixing places which implicitly relied on the previous MBLOCK_SHIFT constant. Fixes #22901.
* rts: Fix C++ compilation issuesBen Gamari2023-01-271-2/+2
| | | | | Make the RTS compilable with a C++ compiler by inserting necessary casts.
* Only gc sparks locally when we can ensure marking is done.Andreas Klebinger2023-01-121-10/+11
| | | | | | | | When performing GC without work stealing there was no guarantee that spark pruning was happening after marking of the sparks. This could cause us to GC live sparks under certain circumstances. Fixes #22528.
* rts: Drop racy assertionBen Gamari2023-01-121-0/+3
| | | | | | | 0e274c39bf836d5bb846f5fa08649c75f85326ac added an assertion in `dirty_MUT_VAR` checking that the MUT_VAR being dirtied was clean. However, this isn't necessarily the case since another thread may have raced us to dirty the object.
* Revert "rts: Drop racy assertion"Ben Gamari2023-01-121-3/+0
| | | | | | | The logic here was inverted. Reverting the commit to avoid confusion when examining the commit history. This reverts commit b3eacd64fb36724ed6c5d2d24a81211a161abef1.
* rts, tests: limit thread name length to 15 bytesNicolas Trangez2023-01-091-1/+1
| | | | | | | | | | | | | On Linux, `pthread_setname_np` (or rather, the kernel) only allows for thread names up to 16 bytes, including the terminating null byte. This commit adds a note pointing this out in `createOSThread`, and fixes up two instances where a thread name of more than 15 characters long was used (in the RTS, and in a test-case). Fixes: #22366 Fixes: https://gitlab.haskell.org/ghc/ghc/-/issues/22366 See: https://gitlab.haskell.org/ghc/ghc/-/issues/22366#note_460796
* nonmoving: Make free list counter accesses atomicBen Gamari2022-12-231-1/+1
| | | | Since these may race with the allocator(s).
* nonmoving: Fix race in shortcuttingBen Gamari2022-12-231-1/+2
| | | | | We must use an acquire load to read the info table pointer since if we find an indirection we must be certain that we see the indirectee.
* nonmoving: Fix benign race in update remembered set checkBen Gamari2022-12-231-1/+3
| | | | | Relaxed load is fine here since we will take the lock before looking at the list.
* nonmoving: Make bitmap accesses atomicBen Gamari2022-12-231-2/+2
| | | | | | This is a benign race on any sensible hard since these are byte accesses. Nevertheless, atomic accesses are necessary to satisfy TSAN.
* nonmoving: Ensure that we aren't holding locks when closing themBen Gamari2022-12-231-1/+4
| | | | TSAN complains about this sort of thing.