1.1 --- a/libexec/lib/src/external_pager.cc Tue Jun 04 18:12:44 2024 +0200
1.2 +++ b/libexec/lib/src/external_pager.cc Tue Jun 25 13:57:06 2024 +0200
1.3 @@ -90,7 +90,7 @@
1.4 MemoryArea *r = *it;
1.5
1.6 if (r->is_mapped())
1.7 - ipc_detach_dataspace((void *) r->dataspace_start());
1.8 + ipc_detach_dataspace((void *) r->dataspace_start(), NULL);
1.9 }
1.10
1.11 /* Free all capabilities. */
2.1 --- a/libexec/lib/src/segment.cc Tue Jun 04 18:12:44 2024 +0200
2.2 +++ b/libexec/lib/src/segment.cc Tue Jun 25 13:57:06 2024 +0200
2.3 @@ -39,7 +39,7 @@
2.4 if (_allocated)
2.5 {
2.6 if (_attached)
2.7 - ipc_detach_dataspace(_buf);
2.8 + ipc_detach_dataspace(_buf, NULL);
2.9
2.10 /* Also unmap the dataspace, not apparently done by the underlying
2.11 functions. */
3.1 --- a/libfsclient/lib/src/file.cc Tue Jun 04 18:12:44 2024 +0200
3.2 +++ b/libfsclient/lib/src/file.cc Tue Jun 25 13:57:06 2024 +0200
3.3 @@ -120,7 +120,7 @@
3.4 }
3.5
3.6 if (file->memory != NULL)
3.7 - ipc_detach_dataspace(file->memory);
3.8 + ipc_detach_dataspace(file->memory, NULL);
3.9
3.10 file_init(file);
3.11 }
3.12 @@ -380,7 +380,7 @@
3.13
3.14 if (file->memory != NULL)
3.15 {
3.16 - err = ipc_detach_dataspace(file->memory);
3.17 + err = ipc_detach_dataspace(file->memory, NULL);
3.18 if (err)
3.19 return err;
3.20
3.21 @@ -419,7 +419,7 @@
3.22
3.23 if (file->memory != NULL)
3.24 {
3.25 - err = ipc_detach_dataspace(file->memory);
3.26 + err = ipc_detach_dataspace(file->memory, NULL);
3.27 if (err)
3.28 return err;
3.29
3.30 @@ -794,7 +794,7 @@
3.31 _update_extent(pipe);
3.32
3.33 if (pipe->memory != NULL)
3.34 - err = ipc_detach_dataspace(pipe->memory);
3.35 + err = ipc_detach_dataspace(pipe->memory, NULL);
3.36
3.37 if (err)
3.38 return err;
4.1 --- a/libfsserver/lib/pages/page_queue.cc Tue Jun 04 18:12:44 2024 +0200
4.2 +++ b/libfsserver/lib/pages/page_queue.cc Tue Jun 25 13:57:06 2024 +0200
4.3 @@ -1,7 +1,7 @@
4.4 /*
4.5 * A page queue abstraction.
4.6 *
4.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk>
4.8 + * Copyright (C) 2021, 2024 Paul Boddie <paul@boddie.org.uk>
4.9 *
4.10 * This program is free software; you can redistribute it and/or
4.11 * modify it under the terms of the GNU General Public License as
4.12 @@ -29,6 +29,8 @@
4.13
4.14
4.15
4.16 +/* Utility methods to be used within critical sections. */
4.17 +
4.18 void PageQueue::discard(Queue &queue, Memory *memory)
4.19 {
4.20 while (!queue.empty())
5.1 --- a/libfsserver/lib/pages/page_queue_partitioned.cc Tue Jun 04 18:12:44 2024 +0200
5.2 +++ b/libfsserver/lib/pages/page_queue_partitioned.cc Tue Jun 25 13:57:06 2024 +0200
5.3 @@ -1,7 +1,7 @@
5.4 /*
5.5 * A page queue retaining two internal collections of memory pages.
5.6 *
5.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk>
5.8 + * Copyright (C) 2021, 2024 Paul Boddie <paul@boddie.org.uk>
5.9 *
5.10 * This program is free software; you can redistribute it and/or
5.11 * modify it under the terms of the GNU General Public License as
5.12 @@ -27,6 +27,8 @@
5.13
5.14 void PageQueuePartitioned::close(Memory *memory)
5.15 {
5.16 + std::lock_guard<std::mutex> guard(_lock);
5.17 +
5.18 discard(_available, memory);
5.19 discard(_issued, memory);
5.20 }
5.21 @@ -127,6 +129,8 @@
5.22
5.23 bool PageQueuePartitioned::remove(PageOwner *owner, Flexpage *flexpage)
5.24 {
5.25 + std::lock_guard<std::mutex> guard(_lock);
5.26 +
5.27 return PageQueue::remove(_issued, _positions, owner, flexpage);
5.28 }
5.29
6.1 --- a/libfsserver/lib/pages/page_queue_shared.cc Tue Jun 04 18:12:44 2024 +0200
6.2 +++ b/libfsserver/lib/pages/page_queue_shared.cc Tue Jun 25 13:57:06 2024 +0200
6.3 @@ -1,7 +1,7 @@
6.4 /*
6.5 * A page queue whose users take turns to access pages.
6.6 *
6.7 - * Copyright (C) 2021 Paul Boddie <paul@boddie.org.uk>
6.8 + * Copyright (C) 2021, 2024 Paul Boddie <paul@boddie.org.uk>
6.9 *
6.10 * This program is free software; you can redistribute it and/or
6.11 * modify it under the terms of the GNU General Public License as
6.12 @@ -27,6 +27,8 @@
6.13
6.14 void PageQueueShared::close(Memory *memory)
6.15 {
6.16 + std::lock_guard<std::mutex> guard(_lock);
6.17 +
6.18 discard(_queue, memory);
6.19 }
6.20
6.21 @@ -106,6 +108,8 @@
6.22
6.23 bool PageQueueShared::remove(PageOwner *owner, Flexpage *flexpage)
6.24 {
6.25 + std::lock_guard<std::mutex> guard(_lock);
6.26 +
6.27 return PageQueue::remove(_queue, _positions, owner, flexpage);
6.28 }
6.29
7.1 --- a/libipc/include/ipc/mem_ipc.h Tue Jun 04 18:12:44 2024 +0200
7.2 +++ b/libipc/include/ipc/mem_ipc.h Tue Jun 25 13:57:06 2024 +0200
7.3 @@ -40,7 +40,7 @@
7.4 rm_flags_t flags, unsigned char align,
7.5 void **addr);
7.6
7.7 -long ipc_detach_dataspace(void *addr);
7.8 +long ipc_detach_dataspace(void *addr, l4_cap_idx_t *cap);
7.9
7.10 long ipc_dataspace_size(l4_cap_idx_t cap, offset_t *size);
7.11
8.1 --- a/libipc/lib/src/mem_ipc.c Tue Jun 04 18:12:44 2024 +0200
8.2 +++ b/libipc/lib/src/mem_ipc.c Tue Jun 25 13:57:06 2024 +0200
8.3 @@ -107,9 +107,9 @@
8.4 return err;
8.5 }
8.6
8.7 -/* Detach a dataspace region. Equivalent to l4re_rm_detach_unmap. */
8.8 +/* Detach a dataspace region. Equivalent to l4re_rm_detach_ds_unmap. */
8.9
8.10 -long ipc_detach_dataspace(void *addr)
8.11 +long ipc_detach_dataspace(void *addr, l4_cap_idx_t *cap)
8.12 {
8.13 long err;
8.14
8.15 @@ -117,7 +117,10 @@
8.16 if (err)
8.17 return err;
8.18
8.19 - err = l4re_rm_detach_unmap((l4_addr_t) addr, L4RE_THIS_TASK_CAP);
8.20 + if (cap != NULL)
8.21 + err = l4re_rm_detach_ds_unmap((l4_addr_t) addr, cap, L4RE_THIS_TASK_CAP);
8.22 + else
8.23 + err = l4re_rm_detach_unmap((l4_addr_t) addr, L4RE_THIS_TASK_CAP);
8.24
8.25 ipc_semaphore_up(ipc_mem_semaphore);
8.26
9.1 --- a/libipc/lib/src/message.c Tue Jun 04 18:12:44 2024 +0200
9.2 +++ b/libipc/lib/src/message.c Tue Jun 25 13:57:06 2024 +0200
9.3 @@ -436,7 +436,7 @@
9.4 void ipc_message_discard_dataspace(ipc_message_t *msg, l4_cap_idx_t mem, l4_addr_t addr)
9.5 {
9.6 ipc_message_discard_capability(msg, mem);
9.7 - ipc_detach_dataspace((void *) addr);
9.8 + ipc_detach_dataspace((void *) addr, NULL);
9.9 }
9.10
9.11 /* Reserve the given number slots from zero for incoming capabilities. */
10.1 --- a/libmem/lib/src/memory_incremental.cc Tue Jun 04 18:12:44 2024 +0200
10.2 +++ b/libmem/lib/src/memory_incremental.cc Tue Jun 25 13:57:06 2024 +0200
10.3 @@ -24,6 +24,7 @@
10.4
10.5 #include "memory_incremental.h"
10.6
10.7 +#include <ipc/cap_alloc.h>
10.8 #include <ipc/mem_ipc.h>
10.9
10.10 #include <stdlib.h>
10.11 @@ -101,7 +102,13 @@
10.12
10.13 void MemoryIncremental::deallocate(Region *region)
10.14 {
10.15 - ipc_detach_dataspace((void *) region->start);
10.16 + l4_cap_idx_t cap;
10.17 +
10.18 + ipc_detach_dataspace((void *) region->start, &cap);
10.19 +
10.20 + if (l4_is_valid_cap(cap))
10.21 + ipc_cap_free_um(cap);
10.22 +
10.23 delete region;
10.24 }
10.25