From 5468c1833d18f257b9b79abf3105f2162df2453e Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Sat, 8 Nov 2008 13:19:15 +0200 Subject: [PATCH] Utcbs of exiting children are successfully unmapped from vfs via sys_shmdt The shared memory addresses are returned back to their pools via the deletion function of such objects. They don't get released via do_munmap(). --- src/api/space.c | 2 +- tasks/mm0/src/clone.c | 1 + tasks/mm0/src/shm.c | 14 +++++++------- tasks/mm0/src/utcb.c | 3 ++- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/api/space.c b/src/api/space.c index c3248e7..7af8ee7 100644 --- a/src/api/space.c +++ b/src/api/space.c @@ -51,7 +51,7 @@ int sys_unmap(syscall_context_t *regs) unsigned long npages = regs->r1; unsigned int tid = regs->r2; struct ktcb *target; - int ret, retval; + int ret = 0, retval = 0; if (tid == current->tid) target = current; diff --git a/tasks/mm0/src/clone.c b/tasks/mm0/src/clone.c index e23f01c..695698a 100644 --- a/tasks/mm0/src/clone.c +++ b/tasks/mm0/src/clone.c @@ -83,6 +83,7 @@ int sys_fork(struct tcb *parent) /* Create and prefault a utcb for child and map it to vfs task */ utcb_map_to_task(child, find_task(VFS_TID), UTCB_NEW_ADDRESS | UTCB_NEW_SHM | UTCB_PREFAULT); + // printf("Mapped 0x%p to vfs as utcb of %d\n", child->utcb, child->tid); /* We can now notify vfs about forked process */ vfs_notify_fork(child, parent); diff --git a/tasks/mm0/src/shm.c b/tasks/mm0/src/shm.c index 1f05550..ec5a615 100644 --- a/tasks/mm0/src/shm.c +++ b/tasks/mm0/src/shm.c @@ -182,13 +182,13 @@ void shm_destroy_priv_data(struct vm_file *shm_file) /* Release the shared memory address */ if ((unsigned long)shm_desc->shm_addr >= UTCB_AREA_START && - (unsigned long)shm_desc->shm_addr < UTCB_AREA_END) - utcb_delete_address(shm_desc->shm_addr); - else if ((unsigned long)shm_desc->shm_addr >= SHM_AREA_START && - (unsigned long)shm_desc->shm_addr < SHM_AREA_END) - shm_delete_address(shm_desc->shm_addr, - shm_file->vm_obj.npages); - else + (unsigned long)shm_desc->shm_addr < UTCB_AREA_END) { + BUG_ON(utcb_delete_address(shm_desc->shm_addr) < 0); + } else if ((unsigned long)shm_desc->shm_addr >= SHM_AREA_START && + (unsigned long)shm_desc->shm_addr < SHM_AREA_END) { + BUG_ON(shm_delete_address(shm_desc->shm_addr, + shm_file->vm_obj.npages) < 0); + } else BUG(); /* Release the shared memory id */ diff --git a/tasks/mm0/src/utcb.c b/tasks/mm0/src/utcb.c index e2f4d05..005b153 100644 --- a/tasks/mm0/src/utcb.c +++ b/tasks/mm0/src/utcb.c @@ -12,6 +12,7 @@ #include #include #include +#include #include INC_GLUE(memlayout.h) static struct address_pool utcb_vaddr_pool; @@ -102,5 +103,5 @@ int utcb_map_to_task(struct tcb *owner, struct tcb *mapper, unsigned int flags) int utcb_unmap_from_task(struct tcb *owner, struct tcb *mapper) { - return 0; + return sys_shmdt(mapper, owner->utcb); }