From 6ad84a96a3ed62b212663bffb43545fff138e581 Mon Sep 17 00:00:00 2001 From: Balazs Gerofi Date: Mon, 26 Dec 2016 20:43:17 +0900 Subject: [PATCH] mcexec_syscall(): avoid calling task_pid_nr_ns() in IRQ context --- executer/kernel/mcctrl/control.c | 2 +- executer/kernel/mcctrl/syscall.c | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/executer/kernel/mcctrl/control.c b/executer/kernel/mcctrl/control.c index 11024263..b5f2af52 100644 --- a/executer/kernel/mcctrl/control.c +++ b/executer/kernel/mcctrl/control.c @@ -789,7 +789,7 @@ int mcexec_syscall(struct mcctrl_usrdata *ud, struct ikc_scd_packet *packet) /* Is this a request for a specific thread? See if it's waiting */ if (unlikely(packet->req.ttid)) { list_for_each_entry(wqhln_iter, &ppd->wq_list_exact, list) { - if (packet->req.ttid != task_pid_vnr(wqhln_iter->task)) + if (packet->req.ttid != wqhln_iter->rtid) continue; wqhln = wqhln_iter; diff --git a/executer/kernel/mcctrl/syscall.c b/executer/kernel/mcctrl/syscall.c index eaf87d83..e2b9d582 100644 --- a/executer/kernel/mcctrl/syscall.c +++ b/executer/kernel/mcctrl/syscall.c @@ -326,6 +326,9 @@ retry_alloc: /* Prepare per-thread wait queue head */ wqhln->task = current; + /* Save the TID explicitly, because mcexec_syscall(), where the request + * will be matched, is in IRQ context and can't call task_pid_vnr() */ + wqhln->rtid = task_pid_vnr(current); wqhln->req = 0; init_waitqueue_head(&wqhln->wq_syscall);