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);
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) {

View File

@ -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",

View File

@ -36,6 +36,7 @@ enum {
MF_ZEROFILL = 0x0010,
MF_REG_FILE = 0x1000,
MF_DEV_FILE = 0x2000,
MF_HOST_RELEASED = 0x80000000,
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);
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):"