From 76981bcc1850f7d9a960978dc08d1e5c42fbb8e8 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Thu, 4 Aug 2016 15:22:40 +0900 Subject: [PATCH] mcctrl: move procfs TID processing into dedicated work queue --- executer/kernel/mcctrl/ikc.c | 5 +--- executer/kernel/mcctrl/mcctrl.h | 1 + executer/kernel/mcctrl/procfs.c | 51 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/executer/kernel/mcctrl/ikc.c b/executer/kernel/mcctrl/ikc.c index d5493db0..df854d52 100644 --- a/executer/kernel/mcctrl/ikc.c +++ b/executer/kernel/mcctrl/ikc.c @@ -88,11 +88,8 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c, break; case SCD_MSG_PROCFS_TID_CREATE: - add_tid_entry(ihk_host_os_get_index(__os), pisp->pid, pisp->arg); - break; - case SCD_MSG_PROCFS_TID_DELETE: - delete_tid_entry(ihk_host_os_get_index(__os), pisp->pid, pisp->arg); + return procfsm_packet_handler(__os, pisp->msg, pisp->pid, pisp->arg); break; case SCD_MSG_GET_VDSO_INFO: diff --git a/executer/kernel/mcctrl/mcctrl.h b/executer/kernel/mcctrl/mcctrl.h index cbf483f9..9f60326a 100644 --- a/executer/kernel/mcctrl/mcctrl.h +++ b/executer/kernel/mcctrl/mcctrl.h @@ -301,6 +301,7 @@ struct procfs_file { }; void procfs_answer(unsigned int arg, int err); +int procfsm_packet_handler(void *os, int msg, int pid, unsigned long arg); void add_tid_entry(int osnum, int pid, int tid); void add_pid_entry(int osnum, int pid); void delete_tid_entry(int osnum, int pid, int tid); diff --git a/executer/kernel/mcctrl/procfs.c b/executer/kernel/mcctrl/procfs.c index 42b25e8e..cbc4470f 100644 --- a/executer/kernel/mcctrl/procfs.c +++ b/executer/kernel/mcctrl/procfs.c @@ -713,6 +713,57 @@ mckernel_procfs_lseek(struct file *file, loff_t offset, int orig) return file->f_pos; } +struct procfs_work { + void *os; + int msg; + int pid; + unsigned long arg; + struct work_struct work; +}; + +static void procfsm_work_main(struct work_struct *work0) +{ + struct procfs_work *work = container_of(work0, struct procfs_work, work); + + switch (work->msg) { + case SCD_MSG_PROCFS_TID_CREATE: + add_tid_entry(ihk_host_os_get_index(work->os), work->pid, work->arg); + break; + + case SCD_MSG_PROCFS_TID_DELETE: + delete_tid_entry(ihk_host_os_get_index(work->os), work->pid, work->arg); + break; + + default: + printk("%s: unknown work: msg: %d, pid: %d, arg: %lu)\n", + __FUNCTION__, work->msg, work->pid, work->arg); + break; + } + + kfree(work); + return; +} + +int procfsm_packet_handler(void *os, int msg, int pid, unsigned long arg) +{ + struct procfs_work *work = NULL; + + work = kzalloc(sizeof(*work), GFP_ATOMIC); + if (!work) { + printk("%s: kzalloc failed\n", __FUNCTION__); + return -1; + } + + work->os = os; + work->msg = msg; + work->pid = pid; + work->arg = arg; + INIT_WORK(&work->work, &procfsm_work_main); + + schedule_work(&work->work); + return 0; +} + static const struct file_operations mckernel_forward_ro = { .llseek = mckernel_procfs_lseek, .read = mckernel_procfs_read,