diff options
| author | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-12 15:52:25 +0300 |
|---|---|---|
| committer | Kimplul <kimi.h.kuparinen@gmail.com> | 2022-05-12 15:52:25 +0300 |
| commit | 1ea7d9dec1b460ab76dfd6270596c8138c9c2b40 (patch) | |
| tree | 0e8799fe0d7a653e864bd90c65a29e4012026f71 /common/mem_regions.c | |
| parent | 42a1e087ce99f07b48aaea5552f8e1ce5219d228 (diff) | |
| download | kmi-1ea7d9dec1b460ab76dfd6270596c8138c9c2b40.tar.gz kmi-1ea7d9dec1b460ab76dfd6270596c8138c9c2b40.zip | |
initial workings of shared memory
+ Should document this better but essentially a server requests a shared
buffer, and chan then share this buffer to a thread. Freeing the
buffer is done through normal means. MR_SHARED is used for buffers
that are shared, and MR_OWNED tells whoever is freeing that region
that it is allowed to free the physical memory behind the shared
buffer.
Diffstat (limited to 'common/mem_regions.c')
| -rw-r--r-- | common/mem_regions.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/common/mem_regions.c b/common/mem_regions.c index bbd9a3b..b0cbe0e 100644 --- a/common/mem_regions.c +++ b/common/mem_regions.c @@ -1,11 +1,12 @@ #include <apos/mem_regions.h> #include <apos/mem_nodes.h> #include <apos/pmem.h> +#include <apos/bits.h> #include <apos/mem.h> -#define mark_region_used(r) ((r) = 1) -#define mark_region_unused(r) ((r) = 0) -#define region_used(r) (r) +#define mark_region_used(r) __set_bit(r, MR_USED) +#define mark_region_unused(r) __clear_bit(r, MR_USED) +#define region_used(r) __is_set(r, MR_USED) /* pretty major slowdown when we get to some really massive numbers, not * entirely sure why. Will need to check up on this at some point, have I @@ -245,7 +246,7 @@ struct mem_region *find_free_region(struct mem_region_root *r, size_t size, } static vm_t __partition_region(struct mem_region_root *r, struct mem_region *m, - size_t pages, size_t align) + size_t pages, size_t align, vmflags_t flags) { sp_remove(&sp_root(&r->free_regions), &m->sp_n); @@ -280,6 +281,7 @@ static vm_t __partition_region(struct mem_region_root *r, struct mem_region *m, m->end = end; m->start = start; + m->flags = flags; mark_region_used(m->flags); __insert_used_region(r, m); return __addr(start); @@ -289,7 +291,8 @@ 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) +vm_t alloc_region(struct mem_region_root *r, size_t size, size_t *actual_size, + vmflags_t flags) { size_t asize = align_up(size, BASE_PAGE_SIZE); if (actual_size) @@ -303,11 +306,11 @@ 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); + return __partition_region(r, m, pages, align, flags); } vm_t alloc_fixed_region(struct mem_region_root *r, vm_t start, size_t size, - size_t *actual_size) + size_t *actual_size, vmflags_t flags) { size_t asize = align_up(size, BASE_PAGE_SIZE); if (actual_size) @@ -337,7 +340,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); + return __partition_region(r, m, pages, start - m->start, flags); } static void __try_coalesce_prev(struct mem_region_root *r, struct mem_region *m) @@ -403,6 +406,11 @@ stat_t free_region(struct mem_region_root *r, vm_t start) if (!m) return ERR_NF; + return free_known_region(r, m); +} + +stat_t free_known_region(struct mem_region_root *r, struct mem_region *m) +{ sp_remove(&sp_root(&r->used_regions), &m->sp_n); mark_region_unused(m->flags); |
