memobj_release: don't call syscall_generic_forwarding after process termination

refs #816
This commit is contained in:
Tomoki Shirasawa
2017-03-10 12:58:47 +09:00
parent d8112f92f8
commit e936b2ebe1
4 changed files with 20 additions and 11 deletions

View File

@ -181,19 +181,21 @@ static void devobj_release(struct memobj *memobj)
memobj_unlock(&obj->memobj); memobj_unlock(&obj->memobj);
if (free_obj) { if (free_obj) {
int error; if (!(free_obj->memobj.flags & MF_HOST_RELEASED)) {
ihk_mc_user_context_t ctx; int error;
ihk_mc_user_context_t ctx;
ihk_mc_syscall_arg0(&ctx) = PAGER_REQ_UNMAP; ihk_mc_syscall_arg0(&ctx) = PAGER_REQ_UNMAP;
ihk_mc_syscall_arg1(&ctx) = handle; ihk_mc_syscall_arg1(&ctx) = handle;
ihk_mc_syscall_arg2(&ctx) = 1; ihk_mc_syscall_arg2(&ctx) = 1;
error = syscall_generic_forwarding(__NR_mmap, &ctx); error = syscall_generic_forwarding(__NR_mmap, &ctx);
if (error) { if (error) {
kprintf("devobj_release(%p %lx):" kprintf("devobj_release(%p %lx):"
"release failed. %d\n", "release failed. %d\n",
free_obj, handle, error); free_obj, handle, error);
/* through */ /* through */
}
} }
if (obj->pfn_table) { if (obj->pfn_table) {

View File

@ -294,6 +294,9 @@ static void fileobj_release(struct memobj *memobj)
obj->sref -= free_sref; obj->sref -= free_sref;
free_handle = obj->handle; free_handle = obj->handle;
memobj_unlock(&obj->memobj); memobj_unlock(&obj->memobj);
if (obj->memobj.flags & MF_HOST_RELEASED) {
free_sref = 0; // don't call syscall_generic_forwarding
}
if (free_obj) { if (free_obj) {
dkprintf("%s: release obj 0x%lx cref: %d, free_obj: 0x%lx, %s\n", dkprintf("%s: release obj 0x%lx cref: %d, free_obj: 0x%lx, %s\n",

View File

@ -36,6 +36,7 @@ enum {
MF_ZEROFILL = 0x0010, MF_ZEROFILL = 0x0010,
MF_REG_FILE = 0x1000, MF_REG_FILE = 0x1000,
MF_DEV_FILE = 0x2000, MF_DEV_FILE = 0x2000,
MF_HOST_RELEASED = 0x80000000,
MF_END MF_END
}; };

View File

@ -2186,6 +2186,9 @@ free_all_process_memory_range(struct process_vm *vm)
ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock); ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock);
list_for_each_entry_safe(range, next, &vm->vm_range_list, list) { list_for_each_entry_safe(range, next, &vm->vm_range_list, list) {
if (range->memobj) {
range->memobj->flags |= MF_HOST_RELEASED;
}
error = free_process_memory_range(vm, range); error = free_process_memory_range(vm, range);
if (error) { if (error) {
ekprintf("free_process_memory(%p):" ekprintf("free_process_memory(%p):"