do_syscall: Delegate system calls to the mcexec with the same pid
This includes the following fix: send_syscall, do_syscall: remove argument pid Fujitsu: POSTK_TEMP_FIX_26 Refs: #1165 Change-Id: I702362c07a28f507a5e43dd751949aefa24bc8c0
This commit is contained in:
committed by
Masamichi Takagi
parent
c23bc8d401
commit
7e342751a2
@ -263,6 +263,12 @@ struct terminate_thread_desc {
|
||||
unsigned long tsk; /* struct task_struct * */
|
||||
};
|
||||
|
||||
struct rpgtable_desc {
|
||||
uintptr_t rpgtable;
|
||||
uintptr_t start;
|
||||
uintptr_t len;
|
||||
};
|
||||
|
||||
enum perf_ctrl_type {
|
||||
PERF_CTRL_SET,
|
||||
PERF_CTRL_GET,
|
||||
|
||||
@ -1755,7 +1755,7 @@ mcexec_getcredv(int __user *virt)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mcexec_create_per_process_data(ihk_os_t os)
|
||||
int mcexec_create_per_process_data(ihk_os_t os, struct rpgtable_desc *rpt)
|
||||
{
|
||||
struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os);
|
||||
struct mcctrl_per_proc_data *ppd = NULL;
|
||||
@ -1812,6 +1812,11 @@ int mcexec_create_per_process_data(ihk_os_t os)
|
||||
dprintk("%s: PID: %d, counter: %d\n",
|
||||
__FUNCTION__, ppd->pid, atomic_read(&ppd->refcount));
|
||||
|
||||
if (rpt) {
|
||||
ppd->rpgtable = rpt->rpgtable;
|
||||
return mcctrl_clear_pte_range(rpt->start, rpt->len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2638,7 +2643,8 @@ static long mcexec_release_user_space(struct release_user_space_desc *__user arg
|
||||
}
|
||||
|
||||
#if 1
|
||||
return clear_pte_range(desc.user_start, desc.user_end - desc.user_start);
|
||||
return mcctrl_clear_pte_range(desc.user_start,
|
||||
desc.user_end - desc.user_start);
|
||||
#else
|
||||
return release_user_space(desc.user_start, desc.user_end - desc.user_start);
|
||||
#endif
|
||||
@ -3157,7 +3163,8 @@ long __mcctrl_control(ihk_os_t os, unsigned int req, unsigned long arg,
|
||||
return mcexec_get_cpu(os);
|
||||
|
||||
case MCEXEC_UP_CREATE_PPD:
|
||||
return mcexec_create_per_process_data(os);
|
||||
return mcexec_create_per_process_data(os,
|
||||
(struct rpgtable_desc *)arg);
|
||||
|
||||
case MCEXEC_UP_GET_NODES:
|
||||
return mcexec_get_nodes(os);
|
||||
|
||||
@ -486,6 +486,7 @@ inline struct mcctrl_per_thread_data *mcctrl_get_per_thread_data(struct mcctrl_p
|
||||
#else /* POSTK_DEBUG_ARCH_DEP_56 */
|
||||
inline struct mcctrl_per_thread_data *mcctrl_get_per_thread_data(struct mcctrl_per_proc_data *ppd, struct task_struct *task);
|
||||
#endif /* POSTK_DEBUG_ARCH_DEP_56 */
|
||||
int mcctrl_clear_pte_range(uintptr_t start, uintptr_t len);
|
||||
|
||||
void __return_syscall(ihk_os_t os, struct ikc_scd_packet *packet,
|
||||
long ret, int stid);
|
||||
|
||||
@ -2109,7 +2109,7 @@ out:
|
||||
return (IS_ERR_VALUE(map))? (int)map: 0;
|
||||
}
|
||||
|
||||
int clear_pte_range(uintptr_t start, uintptr_t len)
|
||||
int mcctrl_clear_pte_range(uintptr_t start, uintptr_t len)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
struct vm_area_struct *vma;
|
||||
@ -2356,25 +2356,7 @@ int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet)
|
||||
break;
|
||||
|
||||
case __NR_munmap:
|
||||
/* Set new remote page table if not zero */
|
||||
if (sc->args[2]) {
|
||||
struct mcctrl_per_proc_data *ppd = NULL;
|
||||
|
||||
ppd = mcctrl_get_per_proc_data(usrdata, sc->args[3]);
|
||||
if (unlikely(!ppd)) {
|
||||
kprintf("%s: ERROR: no per-process structure for PID %d??\n",
|
||||
__FUNCTION__, task_tgid_vnr(current));
|
||||
return -1;
|
||||
}
|
||||
|
||||
ppd->rpgtable = sc->args[2];
|
||||
|
||||
dprintk("%s: pid: %d, rpgtable: 0x%lx updated\n",
|
||||
__FUNCTION__, ppd->pid, ppd->rpgtable);
|
||||
mcctrl_put_per_proc_data(ppd);
|
||||
}
|
||||
|
||||
ret = clear_pte_range(sc->args[0], sc->args[1]);
|
||||
ret = mcctrl_clear_pte_range(sc->args[0], sc->args[1]);
|
||||
break;
|
||||
|
||||
case __NR_mprotect:
|
||||
|
||||
@ -2510,7 +2510,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
/* Register per-process structure in mcctrl */
|
||||
if (ioctl(fd, MCEXEC_UP_CREATE_PPD) != 0) {
|
||||
if (ioctl(fd, MCEXEC_UP_CREATE_PPD, NULL)) {
|
||||
perror("creating mcctrl per-process structure");
|
||||
close(fd);
|
||||
exit(1);
|
||||
@ -2872,7 +2872,8 @@ out:
|
||||
|
||||
static struct uti_desc *uti_desc;
|
||||
|
||||
static void kill_thread(unsigned long tid, int sig)
|
||||
static void kill_thread(unsigned long tid, int sig,
|
||||
struct thread_data_s *my_thread)
|
||||
{
|
||||
struct thread_data_s *tp;
|
||||
|
||||
@ -2880,6 +2881,8 @@ static void kill_thread(unsigned long tid, int sig)
|
||||
sig = LOCALSIG;
|
||||
|
||||
for (tp = thread_data; tp; tp = tp->next) {
|
||||
if (tp == my_thread)
|
||||
continue;
|
||||
if (tp->remote_tid == tid) {
|
||||
if (pthread_kill(tp->thread_id, sig) == ESRCH) {
|
||||
printf("%s: ERROR: Thread not found (tid=%ld,sig=%d)\n", __FUNCTION__, tid, sig);
|
||||
@ -3272,7 +3275,7 @@ int main_loop(struct thread_data_s *my_thread)
|
||||
break;
|
||||
|
||||
case __NR_kill: // interrupt syscall
|
||||
kill_thread(w.sr.args[1], w.sr.args[2]);
|
||||
kill_thread(w.sr.args[1], w.sr.args[2], my_thread);
|
||||
do_syscall_return(fd, cpu, 0, 0, 0, 0, 0);
|
||||
break;
|
||||
case __NR_exit:
|
||||
@ -3452,6 +3455,7 @@ gettid_out:
|
||||
case 0: {
|
||||
int ret = 1;
|
||||
struct newprocess_desc npdesc;
|
||||
struct rpgtable_desc rpt;
|
||||
|
||||
ischild = 1;
|
||||
/* Reopen device fd */
|
||||
@ -3464,7 +3468,10 @@ gettid_out:
|
||||
goto fork_child_sync_pipe;
|
||||
}
|
||||
|
||||
if (ioctl(fd, MCEXEC_UP_CREATE_PPD) != 0) {
|
||||
rpt.start = w.sr.args[1];
|
||||
rpt.len = w.sr.args[2];
|
||||
rpt.rpgtable = w.sr.args[3];
|
||||
if (ioctl(fd, MCEXEC_UP_CREATE_PPD, &rpt)) {
|
||||
fs->status = -errno;
|
||||
fprintf(stderr, "ERROR: creating PPD %s\n", dev);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user