Register PPD and release_handler at the same time.
Fix that process will remain even if signal is received between PPD registration and release_handler registration. Refs: #1201 Fujitsu: POSTK_DEBUG_TEMP_FIX_64 Change-Id: I571781963578df8cedb327f19298f595cfb137a3
This commit is contained in:
@@ -38,7 +38,6 @@
|
||||
#define MCEXEC_UP_SEND_SIGNAL 0x30a02906
|
||||
#define MCEXEC_UP_GET_CPU 0x30a02907
|
||||
#define MCEXEC_UP_STRNCPY_FROM_USER 0x30a02908
|
||||
#define MCEXEC_UP_NEW_PROCESS 0x30a02909
|
||||
#define MCEXEC_UP_GET_CRED 0x30a0290a
|
||||
#define MCEXEC_UP_GET_CREDV 0x30a0290b
|
||||
#define MCEXEC_UP_GET_NODES 0x30a0290c
|
||||
@@ -230,10 +229,6 @@ struct signal_desc {
|
||||
char info[128];
|
||||
};
|
||||
|
||||
struct newprocess_desc {
|
||||
int pid;
|
||||
};
|
||||
|
||||
struct sys_mount_desc {
|
||||
char *dev_name;
|
||||
char *dir_name;
|
||||
|
||||
@@ -389,21 +389,15 @@ static void release_handler(ihk_os_t os, void *param)
|
||||
__FUNCTION__, info);
|
||||
}
|
||||
|
||||
static long mcexec_newprocess(ihk_os_t os,
|
||||
struct newprocess_desc *__user udesc,
|
||||
struct file *file)
|
||||
static long mcexec_newprocess(ihk_os_t os, struct file *file)
|
||||
{
|
||||
struct newprocess_desc desc;
|
||||
struct mcos_handler_info *info;
|
||||
|
||||
if (copy_from_user(&desc, udesc, sizeof(struct newprocess_desc))) {
|
||||
return -EFAULT;
|
||||
}
|
||||
info = new_mcos_handler_info(os, file);
|
||||
if (info == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
info->pid = desc.pid;
|
||||
info->pid = task_tgid_vnr(current);
|
||||
ihk_os_register_release_handler(file, release_handler, info);
|
||||
ihk_os_set_mcos_private_data(file, info);
|
||||
return 0;
|
||||
@@ -1720,12 +1714,14 @@ mcexec_getcredv(int __user *virt)
|
||||
}
|
||||
|
||||
int mcexec_create_per_process_data(ihk_os_t os,
|
||||
struct rpgtable_desc * __user rpt)
|
||||
struct rpgtable_desc * __user rpt,
|
||||
struct file *file)
|
||||
{
|
||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||
struct mcctrl_per_proc_data *ppd = NULL;
|
||||
int i;
|
||||
struct rpgtable_desc krpt;
|
||||
long ret;
|
||||
|
||||
if (rpt &&
|
||||
copy_from_user(&krpt, rpt, sizeof(krpt))) {
|
||||
@@ -1745,6 +1741,10 @@ int mcexec_create_per_process_data(ihk_os_t os,
|
||||
printk("%s: ERROR: allocating per-process data\n", __FUNCTION__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
if ((ret = mcexec_newprocess(os, file))) {
|
||||
kfree(ppd);
|
||||
return ret;
|
||||
}
|
||||
memset(ppd, 0, sizeof(struct mcctrl_per_proc_data)); /* debug */
|
||||
|
||||
ppd->ud = usrdata;
|
||||
@@ -3159,7 +3159,7 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
|
||||
case MCEXEC_UP_CREATE_PPD:
|
||||
return mcexec_create_per_process_data(os,
|
||||
(struct rpgtable_desc * __user)arg);
|
||||
(struct rpgtable_desc * __user)arg, file);
|
||||
|
||||
case MCEXEC_UP_GET_NODES:
|
||||
return mcexec_get_nodes(os);
|
||||
@@ -3171,10 +3171,6 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
return mcexec_strncpy_from_user(os,
|
||||
(struct strncpy_from_user_desc *)arg);
|
||||
|
||||
case MCEXEC_UP_NEW_PROCESS:
|
||||
return mcexec_newprocess(os, (struct newprocess_desc *)arg,
|
||||
file);
|
||||
|
||||
case MCEXEC_UP_OPEN_EXEC:
|
||||
return mcexec_open_exec(os, (char *)arg);
|
||||
|
||||
|
||||
@@ -74,7 +74,6 @@ static struct ihk_os_user_call_handler mcctrl_uchs[] = {
|
||||
{ .request = MCEXEC_UP_GET_CPUSET, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_CREATE_PPD, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_STRNCPY_FROM_USER, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_NEW_PROCESS, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_PREPARE_DMA, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_FREE_DMA, .func = mcctrl_ioctl },
|
||||
{ .request = MCEXEC_UP_OPEN_EXEC, .func = mcctrl_ioctl },
|
||||
|
||||
@@ -3807,7 +3807,6 @@ gettid_out:
|
||||
/* Child process */
|
||||
case 0: {
|
||||
int ret = 1;
|
||||
struct newprocess_desc npdesc;
|
||||
struct rpgtable_desc rpt;
|
||||
|
||||
ischild = 1;
|
||||
@@ -3879,9 +3878,6 @@ fork_child_sync_pipe:
|
||||
fork_sync_top = NULL;
|
||||
pthread_mutex_init(&fork_sync_mutex, NULL);
|
||||
|
||||
npdesc.pid = getpid();
|
||||
ioctl(fd, MCEXEC_UP_NEW_PROCESS, &npdesc);
|
||||
|
||||
/* TODO: does the forked thread run in a pthread context? */
|
||||
while (getppid() != 1 &&
|
||||
fs->success == 0) {
|
||||
|
||||
Reference in New Issue
Block a user