# HG changeset patch # User Paul Boddie # Date 1719316586 -7200 # Node ID 17fdaa8a8117ae1e6c1d36acd889c3e7e73f7a3e # Parent 7201710c78748d92ae2dd130861f5d36e85313ad Fixed memory deallocation to properly discard dataspaces, extending the signature of ipc_detach_dataspace to expose the capability involved. This prevents the accumulation of redundant dataspace capabilities, such as in filesystem server tasks. diff -r 7201710c7874 -r 17fdaa8a8117 libexec/lib/src/external_pager.cc --- a/libexec/lib/src/external_pager.cc Tue Jun 25 13:53:18 2024 +0200 +++ b/libexec/lib/src/external_pager.cc Tue Jun 25 13:56:26 2024 +0200 @@ -90,7 +90,7 @@ MemoryArea *r = *it; if (r->is_mapped()) - ipc_detach_dataspace((void *) r->dataspace_start()); + ipc_detach_dataspace((void *) r->dataspace_start(), NULL); } /* Free all capabilities. */ diff -r 7201710c7874 -r 17fdaa8a8117 libexec/lib/src/segment.cc --- a/libexec/lib/src/segment.cc Tue Jun 25 13:53:18 2024 +0200 +++ b/libexec/lib/src/segment.cc Tue Jun 25 13:56:26 2024 +0200 @@ -39,7 +39,7 @@ if (_allocated) { if (_attached) - ipc_detach_dataspace(_buf); + ipc_detach_dataspace(_buf, NULL); /* Also unmap the dataspace, not apparently done by the underlying functions. */ diff -r 7201710c7874 -r 17fdaa8a8117 libfsclient/lib/src/file.cc --- a/libfsclient/lib/src/file.cc Tue Jun 25 13:53:18 2024 +0200 +++ b/libfsclient/lib/src/file.cc Tue Jun 25 13:56:26 2024 +0200 @@ -120,7 +120,7 @@ } if (file->memory != NULL) - ipc_detach_dataspace(file->memory); + ipc_detach_dataspace(file->memory, NULL); file_init(file); } @@ -380,7 +380,7 @@ if (file->memory != NULL) { - err = ipc_detach_dataspace(file->memory); + err = ipc_detach_dataspace(file->memory, NULL); if (err) return err; @@ -419,7 +419,7 @@ if (file->memory != NULL) { - err = ipc_detach_dataspace(file->memory); + err = ipc_detach_dataspace(file->memory, NULL); if (err) return err; @@ -766,7 +766,7 @@ _update_extent(pipe); if (pipe->memory != NULL) - err = ipc_detach_dataspace(pipe->memory); + err = ipc_detach_dataspace(pipe->memory, NULL); if (err) return err; diff -r 7201710c7874 -r 17fdaa8a8117 libipc/include/ipc/mem_ipc.h --- a/libipc/include/ipc/mem_ipc.h Tue Jun 25 13:53:18 2024 +0200 +++ b/libipc/include/ipc/mem_ipc.h Tue Jun 25 13:56:26 2024 +0200 @@ -40,7 +40,7 @@ rm_flags_t flags, unsigned char align, void **addr); -long ipc_detach_dataspace(void *addr); +long ipc_detach_dataspace(void *addr, l4_cap_idx_t *cap); long ipc_dataspace_size(l4_cap_idx_t cap, offset_t *size); diff -r 7201710c7874 -r 17fdaa8a8117 libipc/lib/src/mem_ipc.c --- a/libipc/lib/src/mem_ipc.c Tue Jun 25 13:53:18 2024 +0200 +++ b/libipc/lib/src/mem_ipc.c Tue Jun 25 13:56:26 2024 +0200 @@ -107,9 +107,9 @@ return err; } -/* Detach a dataspace region. Equivalent to l4re_rm_detach_unmap. */ +/* Detach a dataspace region. Equivalent to l4re_rm_detach_ds_unmap. */ -long ipc_detach_dataspace(void *addr) +long ipc_detach_dataspace(void *addr, l4_cap_idx_t *cap) { long err; @@ -117,7 +117,10 @@ if (err) return err; - err = l4re_rm_detach_unmap((l4_addr_t) addr, L4RE_THIS_TASK_CAP); + if (cap != NULL) + err = l4re_rm_detach_ds_unmap((l4_addr_t) addr, cap, L4RE_THIS_TASK_CAP); + else + err = l4re_rm_detach_unmap((l4_addr_t) addr, L4RE_THIS_TASK_CAP); ipc_semaphore_up(ipc_mem_semaphore); diff -r 7201710c7874 -r 17fdaa8a8117 libipc/lib/src/message.c --- a/libipc/lib/src/message.c Tue Jun 25 13:53:18 2024 +0200 +++ b/libipc/lib/src/message.c Tue Jun 25 13:56:26 2024 +0200 @@ -436,7 +436,7 @@ void ipc_message_discard_dataspace(ipc_message_t *msg, l4_cap_idx_t mem, l4_addr_t addr) { ipc_message_discard_capability(msg, mem); - ipc_detach_dataspace((void *) addr); + ipc_detach_dataspace((void *) addr, NULL); } /* Reserve the given number slots from zero for incoming capabilities. */ diff -r 7201710c7874 -r 17fdaa8a8117 libmem/lib/src/memory_incremental.cc --- a/libmem/lib/src/memory_incremental.cc Tue Jun 25 13:53:18 2024 +0200 +++ b/libmem/lib/src/memory_incremental.cc Tue Jun 25 13:56:26 2024 +0200 @@ -24,6 +24,7 @@ #include "memory_incremental.h" +#include #include #include @@ -101,7 +102,13 @@ void MemoryIncremental::deallocate(Region *region) { - ipc_detach_dataspace((void *) region->start); + l4_cap_idx_t cap; + + ipc_detach_dataspace((void *) region->start, &cap); + + if (l4_is_valid_cap(cap)) + ipc_cap_free_um(cap); + delete region; }