memobj_release: don't call syscall_generic_forwarding after process termination
refs #816
This commit is contained in:
@ -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) {
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -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):"
|
||||||
|
|||||||
Reference in New Issue
Block a user