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:
Tomoki Shirasawa
2019-02-08 10:20:58 +09:00
parent f5023c9730
commit ff0395581c
10 changed files with 182 additions and 24 deletions

View File

@ -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);