diff --git a/kernel/devobj.c b/kernel/devobj.c index f371ec58..e4dad383 100644 --- a/kernel/devobj.c +++ b/kernel/devobj.c @@ -181,19 +181,21 @@ static void devobj_release(struct memobj *memobj) memobj_unlock(&obj->memobj); if (free_obj) { - int error; - ihk_mc_user_context_t ctx; + if (!(free_obj->memobj.flags & MF_HOST_RELEASED)) { + int error; + ihk_mc_user_context_t ctx; - ihk_mc_syscall_arg0(&ctx) = PAGER_REQ_UNMAP; - ihk_mc_syscall_arg1(&ctx) = handle; - ihk_mc_syscall_arg2(&ctx) = 1; + ihk_mc_syscall_arg0(&ctx) = PAGER_REQ_UNMAP; + ihk_mc_syscall_arg1(&ctx) = handle; + ihk_mc_syscall_arg2(&ctx) = 1; - error = syscall_generic_forwarding(__NR_mmap, &ctx); - if (error) { - kprintf("devobj_release(%p %lx):" - "release failed. %d\n", - free_obj, handle, error); - /* through */ + error = syscall_generic_forwarding(__NR_mmap, &ctx); + if (error) { + kprintf("devobj_release(%p %lx):" + "release failed. %d\n", + free_obj, handle, error); + /* through */ + } } if (obj->pfn_table) { diff --git a/kernel/fileobj.c b/kernel/fileobj.c index 08a2d877..70f11efb 100644 --- a/kernel/fileobj.c +++ b/kernel/fileobj.c @@ -294,6 +294,9 @@ static void fileobj_release(struct memobj *memobj) obj->sref -= free_sref; free_handle = obj->handle; memobj_unlock(&obj->memobj); + if (obj->memobj.flags & MF_HOST_RELEASED) { + free_sref = 0; // don't call syscall_generic_forwarding + } if (free_obj) { dkprintf("%s: release obj 0x%lx cref: %d, free_obj: 0x%lx, %s\n", diff --git a/kernel/include/memobj.h b/kernel/include/memobj.h index ba23678c..24650de4 100644 --- a/kernel/include/memobj.h +++ b/kernel/include/memobj.h @@ -36,6 +36,7 @@ enum { MF_ZEROFILL = 0x0010, MF_REG_FILE = 0x1000, MF_DEV_FILE = 0x2000, + MF_HOST_RELEASED = 0x80000000, MF_END }; diff --git a/kernel/process.c b/kernel/process.c index f390fe23..7607b8d5 100644 --- a/kernel/process.c +++ b/kernel/process.c @@ -2186,6 +2186,9 @@ free_all_process_memory_range(struct process_vm *vm) ihk_mc_spinlock_lock_noirq(&vm->memory_range_lock); 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); if (error) { ekprintf("free_process_memory(%p):"