mcctrl: move procfs TID processing into dedicated work queue
This commit is contained in:
@ -88,11 +88,8 @@ static int syscall_packet_handler(struct ihk_ikc_channel_desc *c,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SCD_MSG_PROCFS_TID_CREATE:
|
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:
|
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;
|
break;
|
||||||
|
|
||||||
case SCD_MSG_GET_VDSO_INFO:
|
case SCD_MSG_GET_VDSO_INFO:
|
||||||
|
|||||||
@ -301,6 +301,7 @@ struct procfs_file {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void procfs_answer(unsigned int arg, int err);
|
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_tid_entry(int osnum, int pid, int tid);
|
||||||
void add_pid_entry(int osnum, int pid);
|
void add_pid_entry(int osnum, int pid);
|
||||||
void delete_tid_entry(int osnum, int pid, int tid);
|
void delete_tid_entry(int osnum, int pid, int tid);
|
||||||
|
|||||||
@ -713,6 +713,57 @@ mckernel_procfs_lseek(struct file *file, loff_t offset, int orig)
|
|||||||
return file->f_pos;
|
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 = {
|
static const struct file_operations mckernel_forward_ro = {
|
||||||
.llseek = mckernel_procfs_lseek,
|
.llseek = mckernel_procfs_lseek,
|
||||||
.read = mckernel_procfs_read,
|
.read = mckernel_procfs_read,
|
||||||
|
|||||||
Reference in New Issue
Block a user