From 66fad4c7a435aca7ae12f8dc1d294579684f79a8 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 8 Jun 2017 14:53:57 +0900 Subject: [PATCH] terminate(): do not iterate process hash if no children processes exist --- kernel/host.c | 2 +- kernel/syscall.c | 76 +++++++++++++++++++++++++----------------------- 2 files changed, 40 insertions(+), 38 deletions(-) diff --git a/kernel/host.c b/kernel/host.c index fb38c554..e1bfd88c 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -625,7 +625,7 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, syscall_channel_send(resp_channel, &pckt); rc = do_kill(NULL, info.pid, info.tid, info.sig, &info.info, 0); - kprintf("SCD_MSG_SEND_SIGNAL: do_kill(pid=%d, tid=%d, sig=%d)=%d\n", info.pid, info.tid, info.sig, rc); + dkprintf("SCD_MSG_SEND_SIGNAL: do_kill(pid=%d, tid=%d, sig=%d)=%d\n", info.pid, info.tid, info.sig, rc); ret = 0; break; diff --git a/kernel/syscall.c b/kernel/syscall.c index 354c66c6..5a87d54c 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -811,48 +811,50 @@ terminate(int rc, int sig) kfree(ids); } - // clean up children - for(i = 0; i < HASH_SIZE; i++){ - mcs_rwlock_writer_lock(&resource_set->process_hash->lock[i], - &lock); - list_for_each_entry_safe(child, next, - &resource_set->process_hash->list[i], - hash_list){ - mcs_rwlock_writer_lock_noirq(&child->update_lock, - &updatelock); - if(child->ppid_parent == proc && - child->status == PS_ZOMBIE){ - list_del(&child->hash_list); - list_del(&child->siblings_list); - kfree(child); - } - else if(child->ppid_parent == proc){ - mcs_rwlock_writer_lock_noirq(&proc->children_lock, - &childlock); - mcs_rwlock_writer_lock_noirq(&pid1->children_lock, - &childlock1); - child->ppid_parent = pid1; - if(child->parent == proc){ - child->parent = pid1; + if (!list_empty(&proc->children_list)) { + // clean up children + for(i = 0; i < HASH_SIZE; i++){ + mcs_rwlock_writer_lock(&resource_set->process_hash->lock[i], + &lock); + list_for_each_entry_safe(child, next, + &resource_set->process_hash->list[i], + hash_list){ + mcs_rwlock_writer_lock_noirq(&child->update_lock, + &updatelock); + if(child->ppid_parent == proc && + child->status == PS_ZOMBIE){ + list_del(&child->hash_list); list_del(&child->siblings_list); - list_add_tail(&child->siblings_list, - &pid1->children_list); + kfree(child); } - else{ - list_del(&child->ptraced_siblings_list); - list_add_tail(&child->ptraced_siblings_list, - &pid1->ptraced_children_list); + else if(child->ppid_parent == proc){ + mcs_rwlock_writer_lock_noirq(&proc->children_lock, + &childlock); + mcs_rwlock_writer_lock_noirq(&pid1->children_lock, + &childlock1); + child->ppid_parent = pid1; + if(child->parent == proc){ + child->parent = pid1; + list_del(&child->siblings_list); + list_add_tail(&child->siblings_list, + &pid1->children_list); + } + else{ + list_del(&child->ptraced_siblings_list); + list_add_tail(&child->ptraced_siblings_list, + &pid1->ptraced_children_list); + } + mcs_rwlock_writer_unlock_noirq(&pid1->children_lock, + &childlock1); + mcs_rwlock_writer_unlock_noirq(&proc->children_lock, + &childlock); } - mcs_rwlock_writer_unlock_noirq(&pid1->children_lock, - &childlock1); - mcs_rwlock_writer_unlock_noirq(&proc->children_lock, - &childlock); + mcs_rwlock_writer_unlock_noirq(&child->update_lock, + &updatelock); } - mcs_rwlock_writer_unlock_noirq(&child->update_lock, - &updatelock); + mcs_rwlock_writer_unlock(&resource_set->process_hash->lock[i], + &lock); } - mcs_rwlock_writer_unlock(&resource_set->process_hash->lock[i], - &lock); } dkprintf("terminate,pid=%d\n", proc->pid);