From 972d14611a67ab4baeee04cde49d08dbad04aace Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 22 Dec 2016 10:15:31 +0900 Subject: [PATCH] mcctrl: move prepare waitqueue to per-process data --- executer/kernel/mcctrl/control.c | 65 ++++++++++++++++++++------------ executer/kernel/mcctrl/ikc.c | 1 - executer/kernel/mcctrl/mcctrl.h | 2 +- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/executer/kernel/mcctrl/control.c b/executer/kernel/mcctrl/control.c index 6290fc93..74508c0d 100644 --- a/executer/kernel/mcctrl/control.c +++ b/executer/kernel/mcctrl/control.c @@ -82,16 +82,17 @@ int (*mcctrl_sys_umount)(char *dir_name, int flags) = sys_umount; #endif #endif -//static DECLARE_WAIT_QUEUE_HEAD(wq_prepare); //extern struct mcctrl_channel *channels; int mcctrl_ikc_set_recv_cpu(ihk_os_t os, int cpu); static long mcexec_prepare_image(ihk_os_t os, struct program_load_desc * __user udesc) { - struct program_load_desc *desc, *pdesc; + struct program_load_desc *desc = NULL; + struct program_load_desc *pdesc = NULL; struct ikc_scd_packet isp; - void *args, *envs; + void *args = NULL; + void *envs = NULL; long ret = 0; struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os); struct mcctrl_per_proc_data *ppd = NULL; @@ -108,42 +109,53 @@ static long mcexec_prepare_image(ihk_os_t os, sizeof(struct program_load_desc))) { printk("%s: error: copying program_load_desc\n", __FUNCTION__); - kfree(desc); - return -EFAULT; + ret = -EFAULT; + goto free_out; + } + + ppd = mcctrl_get_per_proc_data(usrdata, desc->pid); + if (!ppd) { + printk("%s: ERROR: no per process data for PID %d\n", + __FUNCTION__, desc->pid); + ret = -EINVAL; + goto free_out; } num_sections = desc->num_sections; if (num_sections <= 0 || num_sections > 16) { - printk("# of sections: %d\n", num_sections); - return -EINVAL; + printk("%s: ERROR: # of sections: %d\n", + __FUNCTION__, num_sections); + ret = -EINVAL; + goto free_out; } + pdesc = kmalloc(sizeof(struct program_load_desc) + sizeof(struct program_image_section) * num_sections, GFP_KERNEL); memcpy(pdesc, desc, sizeof(struct program_load_desc)); + if (copy_from_user(pdesc->sections, udesc->sections, sizeof(struct program_image_section) * num_sections)) { - kfree(desc); - kfree(pdesc); - return -EFAULT; + ret = -EFAULT; + goto free_out; } kfree(desc); + desc = NULL; pdesc->pid = task_tgid_vnr(current); if (reserve_user_space(usrdata, &pdesc->user_start, &pdesc->user_end)) { - kfree(pdesc); - return -ENOMEM; + ret = -ENOMEM; + goto free_out; } args = kmalloc(pdesc->args_len, GFP_KERNEL); if (copy_from_user(args, pdesc->args, pdesc->args_len)) { - kfree(args); - kfree(pdesc); - return -EFAULT; + ret = -EFAULT; + goto free_out; } envs = kmalloc(pdesc->envs_len, GFP_KERNEL); @@ -169,20 +181,13 @@ static long mcexec_prepare_image(ihk_os_t os, pdesc->status = 0; mcctrl_ikc_send(os, pdesc->cpu, &isp); - while (wait_event_interruptible(usrdata->wq_prepare, pdesc->status) != 0); + while (wait_event_interruptible(ppd->wq_prepare, pdesc->status) != 0); - if(pdesc->err < 0){ + if (pdesc->err < 0) { ret = pdesc->err; goto free_out; } - ppd = mcctrl_get_per_proc_data(usrdata, task_tgid_vnr(current)); - if (!ppd) { - printk("ERROR: no per process data for PID %d\n", task_tgid_vnr(current)); - ret = -EINVAL; - goto free_out; - } - /* Update rpgtable */ ppd->rpgtable = pdesc->rpgtable; @@ -201,6 +206,7 @@ free_out: kfree(args); kfree(pdesc); kfree(envs); + kfree(desc); return ret; } @@ -1178,6 +1184,7 @@ int mcexec_open_exec(ihk_os_t os, char * __user filename) INIT_LIST_HEAD(&ppd->wq_list); INIT_LIST_HEAD(&ppd->wq_req_list); INIT_LIST_HEAD(&ppd->wq_list_exact); + init_waitqueue_head(&ppd->wq_prepare); spin_lock_init(&ppd->wq_list_lock); memset(&ppd->cpu_set, 0, sizeof(cpumask_t)); ppd->ikc_target_cpu = 0; @@ -1530,10 +1537,18 @@ void mcexec_prepare_ack(ihk_os_t os, unsigned long arg, int err) { struct program_load_desc *desc = phys_to_virt(arg); struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os); + struct mcctrl_per_proc_data *ppd = NULL; + + ppd = mcctrl_get_per_proc_data(usrdata, desc->pid); + if (!ppd) { + printk("%s: ERROR: no per process data for PID %d\n", + __FUNCTION__, desc->pid); + return; + } desc->err = err; desc->status = 1; - wake_up_all(&usrdata->wq_prepare); + wake_up_all(&ppd->wq_prepare); } diff --git a/executer/kernel/mcctrl/ikc.c b/executer/kernel/mcctrl/ikc.c index d563fa1f..4b011c75 100644 --- a/executer/kernel/mcctrl/ikc.c +++ b/executer/kernel/mcctrl/ikc.c @@ -283,7 +283,6 @@ int prepare_ikc_channels(ihk_os_t os) } usrdata->os = os; - init_waitqueue_head(&usrdata->wq_prepare); ihk_host_os_set_usrdata(os, usrdata); memcpy(&usrdata->listen_param, &listen_param, sizeof listen_param); ihk_ikc_listen_port(os, &usrdata->listen_param); diff --git a/executer/kernel/mcctrl/mcctrl.h b/executer/kernel/mcctrl/mcctrl.h index 0a3b3ac3..3af0dd97 100644 --- a/executer/kernel/mcctrl/mcctrl.h +++ b/executer/kernel/mcctrl/mcctrl.h @@ -195,6 +195,7 @@ struct mcctrl_per_proc_data { struct list_head wq_req_list; struct list_head wq_list_exact; ihk_spinlock_t wq_list_lock; + wait_queue_head_t wq_prepare; struct list_head per_thread_data_hash[MCCTRL_PER_THREAD_DATA_HASH_SIZE]; rwlock_t per_thread_data_hash_lock[MCCTRL_PER_THREAD_DATA_HASH_SIZE]; @@ -280,7 +281,6 @@ struct mcctrl_usrdata { int job_pos; int mcctrl_dma_abort; unsigned long last_thread_exec; - wait_queue_head_t wq_prepare; struct list_head per_proc_data_hash[MCCTRL_PER_PROC_DATA_HASH_SIZE]; rwlock_t per_proc_data_hash_lock[MCCTRL_PER_PROC_DATA_HASH_SIZE];