diff options
author | Anton Kling <anton@kling.gg> | 2024-10-14 21:43:20 +0200 |
---|---|---|
committer | Anton Kling <anton@kling.gg> | 2024-10-14 21:43:20 +0200 |
commit | 8913568be10385abdba07285162506a36827e16e (patch) | |
tree | 50ab2114680baf0395d6682e72a595c6d9aa9587 /kernel/sched | |
parent | 87af93c7521be331a5794c6a53f31d13b3a24baa (diff) |
kernel: small bug fixes
Diffstat (limited to 'kernel/sched')
-rw-r--r-- | kernel/sched/scheduler.c | 7 | ||||
-rw-r--r-- | kernel/sched/scheduler.h | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/kernel/sched/scheduler.c b/kernel/sched/scheduler.c index 9fec2b7..98df414 100644 --- a/kernel/sched/scheduler.c +++ b/kernel/sched/scheduler.c @@ -193,7 +193,7 @@ void free_process(process_t *p) { continue; } MemoryMap *m = p->maps[i]; - mmu_remove_virtual_physical_address_mapping(m->u_address, m->length); + munmap(m->u_address, m->length); } list_free(&p->read_list); @@ -660,6 +660,9 @@ int munmap(void *addr, size_t length) { continue; } if (addr == m->u_address) { + assert(m->underlying_object->num_of_references > 0); + m->underlying_object->num_of_references--; + mmu_remove_virtual_physical_address_mapping(m->u_address, m->length); current_task->maps[i] = NULL; return 0; } @@ -722,5 +725,7 @@ void *mmap(void *addr, size_t length, int prot, int flags, int fd, free_map->k_address = NULL; free_map->length = length; free_map->fd = fd; + free_map->underlying_object = vmobject; + vmobject->num_of_references++; return rc; } diff --git a/kernel/sched/scheduler.h b/kernel/sched/scheduler.h index 85c2a4c..9d548a3 100644 --- a/kernel/sched/scheduler.h +++ b/kernel/sched/scheduler.h @@ -37,6 +37,7 @@ typedef struct { void *k_address; u32 length; int fd; + struct vfs_vm_object *underlying_object; } MemoryMap; typedef struct { |