aboutsummaryrefslogtreecommitdiff
path: root/common/mem_regions.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-12-02 21:12:11 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2022-12-02 21:12:11 +0200
commit10ae2e6ebc7e9776b9f124c9fc530c79f5e84460 (patch)
tree6687cf98db623f8c38c5d5aea234014a27302e10 /common/mem_regions.c
parent131af4eec38752a27e6e56579fbf76178e022ec1 (diff)
downloadkmi-10ae2e6ebc7e9776b9f124c9fc530c79f5e84460.tar.gz
kmi-10ae2e6ebc7e9776b9f124c9fc530c79f5e84460.zip
initial shared memory working
Diffstat (limited to 'common/mem_regions.c')
-rw-r--r--common/mem_regions.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/common/mem_regions.c b/common/mem_regions.c
index eee9230..17f3a1e 100644
--- a/common/mem_regions.c
+++ b/common/mem_regions.c
@@ -323,12 +323,14 @@ struct mem_region *find_first_region(struct mem_region_root *r)
* @param m Free memory region to carve used memory region out of.
* @param pages Number of base order pages to give used region.
* @param align Alignment of used region. In this case, start of used region
+ * @param pid Process ID to associate with region if shared. 0 if private.
* from start of free region.
* @param flags Flags of used region.
* @return Start address of used region.
*/
static vm_t __partition_region(struct mem_region_root *r, struct mem_region *m,
- size_t pages, size_t align, vmflags_t flags)
+ size_t pages, size_t align, vmflags_t flags,
+ id_t pid)
{
sp_remove(&sp_root(&r->free_regions), &m->sp_n);
@@ -364,6 +366,7 @@ static vm_t __partition_region(struct mem_region_root *r, struct mem_region *m,
m->end = end;
m->start = start;
m->flags = flags;
+ m->pid = pid;
mark_region_used(m->flags);
__insert_used_region(r, m);
return __addr(start);
@@ -373,8 +376,9 @@ static vm_t __partition_region(struct mem_region_root *r, struct mem_region *m,
* just ignore them for now. Note that alloc_region should only be used when
* mmap is called with MAP_ANON, all other situations should be handled in some
* fs server */
-vm_t alloc_region(struct mem_region_root *r, size_t size, size_t *actual_size,
- vmflags_t flags)
+stat_t alloc_shared_region(struct mem_region_root *r, size_t size,
+ size_t *actual_size,
+ vmflags_t flags, id_t pid)
{
size_t asize = align_up(size, BASE_PAGE_SIZE);
if (actual_size)
@@ -388,7 +392,13 @@ vm_t alloc_region(struct mem_region_root *r, size_t size, size_t *actual_size,
if (!m)
return 0;
- return __partition_region(r, m, pages, align, flags);
+ return __partition_region(r, m, pages, align, flags, pid);
+}
+
+vm_t alloc_region(struct mem_region_root *r, size_t size, size_t *actual_size,
+ vmflags_t flags)
+{
+ return alloc_shared_region(r, size, actual_size, flags, 0);
}
vm_t alloc_fixed_region(struct mem_region_root *r, vm_t start, size_t size,
@@ -406,7 +416,7 @@ vm_t alloc_fixed_region(struct mem_region_root *r, vm_t start, size_t size,
return 0;
/* locate actual region where start is between the region start and end */
- while (!((m->start <= start) && (start <= m->end))) {
+ while (!((m->start <= start) && (start < m->end))) {
if (start > m->start)
m = m->next;
else
@@ -422,7 +432,7 @@ vm_t alloc_fixed_region(struct mem_region_root *r, vm_t start, size_t size,
return 0;
/* actually start marking region used */
- return __partition_region(r, m, pages, start - m->start, flags);
+ return __partition_region(r, m, pages, start - m->start, flags, 0);
}
/**