mcctrl: separate waiting threads and pending requests
This commit is contained in:
@@ -159,6 +159,7 @@ static long mcexec_prepare_image(ihk_os_t os,
|
|||||||
ppd->pid = pdesc->pid;
|
ppd->pid = pdesc->pid;
|
||||||
ppd->rpgtable = pdesc->rpgtable;
|
ppd->rpgtable = pdesc->rpgtable;
|
||||||
INIT_LIST_HEAD(&ppd->wq_list);
|
INIT_LIST_HEAD(&ppd->wq_list);
|
||||||
|
INIT_LIST_HEAD(&ppd->wq_req_list);
|
||||||
INIT_LIST_HEAD(&ppd->wq_list_exact);
|
INIT_LIST_HEAD(&ppd->wq_list_exact);
|
||||||
spin_lock_init(&ppd->wq_list_lock);
|
spin_lock_init(&ppd->wq_list_lock);
|
||||||
|
|
||||||
@@ -427,7 +428,7 @@ static long mcexec_get_cpu(ihk_os_t os)
|
|||||||
return info->n_cpus;
|
return info->n_cpus;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
inline struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
||||||
struct mcctrl_usrdata *ud,
|
struct mcctrl_usrdata *ud,
|
||||||
int pid)
|
int pid)
|
||||||
{
|
{
|
||||||
@@ -462,7 +463,7 @@ int mcexec_syscall(struct mcctrl_usrdata *ud, struct ikc_scd_packet *packet)
|
|||||||
/* Look up per-process structure */
|
/* Look up per-process structure */
|
||||||
ppd = mcctrl_get_per_proc_data(ud, pid);
|
ppd = mcctrl_get_per_proc_data(ud, pid);
|
||||||
|
|
||||||
if (!ppd) {
|
if (unlikely(!ppd)) {
|
||||||
kprintf("%s: ERROR: no per-process structure for PID %d??\n",
|
kprintf("%s: ERROR: no per-process structure for PID %d??\n",
|
||||||
__FUNCTION__, task_tgid_vnr(current));
|
__FUNCTION__, task_tgid_vnr(current));
|
||||||
return 0;
|
return 0;
|
||||||
@@ -482,7 +483,7 @@ int mcexec_syscall(struct mcctrl_usrdata *ud, struct ikc_scd_packet *packet)
|
|||||||
flags = ihk_ikc_spinlock_lock(&ppd->wq_list_lock);
|
flags = ihk_ikc_spinlock_lock(&ppd->wq_list_lock);
|
||||||
|
|
||||||
/* Is this a request for a specific thread? See if it's waiting */
|
/* Is this a request for a specific thread? See if it's waiting */
|
||||||
if (packet->req.ttid) {
|
if (unlikely(packet->req.ttid)) {
|
||||||
list_for_each_entry(wqhln_iter, &ppd->wq_list_exact, list) {
|
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 != task_pid_vnr(wqhln_iter->task))
|
||||||
continue;
|
continue;
|
||||||
@@ -505,8 +506,8 @@ int mcexec_syscall(struct mcctrl_usrdata *ud, struct ikc_scd_packet *packet)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If no match found, add request */
|
/* If no match found, add request to pending request list */
|
||||||
if (!wqhln) {
|
if (unlikely(!wqhln)) {
|
||||||
retry_alloc:
|
retry_alloc:
|
||||||
wqhln_alloc = kmalloc(sizeof(*wqhln), GFP_ATOMIC);
|
wqhln_alloc = kmalloc(sizeof(*wqhln), GFP_ATOMIC);
|
||||||
if (!wqhln_alloc) {
|
if (!wqhln_alloc) {
|
||||||
@@ -518,7 +519,7 @@ retry_alloc:
|
|||||||
wqhln->req = 0;
|
wqhln->req = 0;
|
||||||
wqhln->task = NULL;
|
wqhln->task = NULL;
|
||||||
init_waitqueue_head(&wqhln->wq_syscall);
|
init_waitqueue_head(&wqhln->wq_syscall);
|
||||||
list_add_tail(&wqhln->list, &ppd->wq_list);
|
list_add_tail(&wqhln->list, &ppd->wq_req_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
wqhln->packet = packet;
|
wqhln->packet = packet;
|
||||||
@@ -545,7 +546,7 @@ int mcexec_wait_syscall(ihk_os_t os, struct syscall_wait_desc *__user req)
|
|||||||
/* Look up per-process structure */
|
/* Look up per-process structure */
|
||||||
ppd = mcctrl_get_per_proc_data(usrdata, task_tgid_vnr(current));
|
ppd = mcctrl_get_per_proc_data(usrdata, task_tgid_vnr(current));
|
||||||
|
|
||||||
if (!ppd) {
|
if (unlikely(!ppd)) {
|
||||||
kprintf("%s: ERROR: no per-process structure for PID %d??\n",
|
kprintf("%s: ERROR: no per-process structure for PID %d??\n",
|
||||||
__FUNCTION__, task_tgid_vnr(current));
|
__FUNCTION__, task_tgid_vnr(current));
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -562,7 +563,7 @@ retry:
|
|||||||
/* Prepare per-thread wait queue head or find a valid request */
|
/* Prepare per-thread wait queue head or find a valid request */
|
||||||
irqflags = ihk_ikc_spinlock_lock(&ppd->wq_list_lock);
|
irqflags = ihk_ikc_spinlock_lock(&ppd->wq_list_lock);
|
||||||
/* First see if there is a valid request already that is not yet taken */
|
/* First see if there is a valid request already that is not yet taken */
|
||||||
list_for_each_entry(wqhln_iter, &ppd->wq_list, list) {
|
list_for_each_entry(wqhln_iter, &ppd->wq_req_list, list) {
|
||||||
if (wqhln_iter->task == NULL && wqhln_iter->req) {
|
if (wqhln_iter->task == NULL && wqhln_iter->req) {
|
||||||
wqhln = wqhln_iter;
|
wqhln = wqhln_iter;
|
||||||
wqhln->task = current;
|
wqhln->task = current;
|
||||||
@@ -582,11 +583,9 @@ retry_alloc:
|
|||||||
wqhln->task = current;
|
wqhln->task = current;
|
||||||
wqhln->req = 0;
|
wqhln->req = 0;
|
||||||
init_waitqueue_head(&wqhln->wq_syscall);
|
init_waitqueue_head(&wqhln->wq_syscall);
|
||||||
}
|
|
||||||
|
|
||||||
/* No valid request? Wait for one.. */
|
/* Wait for a request.. */
|
||||||
if (wqhln->req == 0) {
|
list_add(&wqhln->list, &ppd->wq_list);
|
||||||
list_add_tail(&wqhln->list, &ppd->wq_list);
|
|
||||||
ihk_ikc_spinlock_unlock(&ppd->wq_list_lock, irqflags);
|
ihk_ikc_spinlock_unlock(&ppd->wq_list_lock, irqflags);
|
||||||
|
|
||||||
ret = wait_event_interruptible(wqhln->wq_syscall, wqhln->req);
|
ret = wait_event_interruptible(wqhln->wq_syscall, wqhln->req);
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ struct mcctrl_per_proc_data {
|
|||||||
unsigned long rpgtable; /* per process, not per OS */
|
unsigned long rpgtable; /* per process, not per OS */
|
||||||
|
|
||||||
struct list_head wq_list;
|
struct list_head wq_list;
|
||||||
|
struct list_head wq_req_list;
|
||||||
struct list_head wq_list_exact;
|
struct list_head wq_list_exact;
|
||||||
ihk_spinlock_t wq_list_lock;
|
ihk_spinlock_t wq_list_lock;
|
||||||
|
|
||||||
@@ -294,7 +295,7 @@ ihk_os_t osnum_to_os(int n);
|
|||||||
|
|
||||||
/* syscall.c */
|
/* syscall.c */
|
||||||
int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet);
|
int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet);
|
||||||
struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
inline struct mcctrl_per_proc_data *mcctrl_get_per_proc_data(
|
||||||
struct mcctrl_usrdata *ud,
|
struct mcctrl_usrdata *ud,
|
||||||
int pid);
|
int pid);
|
||||||
int mcctrl_add_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
int mcctrl_add_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ int mcctrl_add_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
ptd_alloc = kmalloc(sizeof(*ptd), GFP_KERNEL);
|
ptd_alloc = kmalloc(sizeof(*ptd), GFP_ATOMIC);
|
||||||
if (!ptd_alloc) {
|
if (!ptd_alloc) {
|
||||||
kprintf("%s: error allocate per thread data\n", __FUNCTION__);
|
kprintf("%s: error allocate per thread data\n", __FUNCTION__);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@@ -110,7 +110,7 @@ int mcctrl_add_per_thread_data(struct mcctrl_per_proc_data* ppd,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptd) {
|
if (unlikely(ptd)) {
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
kfree(ptd_alloc);
|
kfree(ptd_alloc);
|
||||||
goto out;
|
goto out;
|
||||||
@@ -1524,6 +1524,7 @@ int __do_in_kernel_syscall(ihk_os_t os, struct ikc_scd_packet *packet)
|
|||||||
ppd->pid = task_tgid_vnr(current);
|
ppd->pid = task_tgid_vnr(current);
|
||||||
ppd->rpgtable = sc->args[2];
|
ppd->rpgtable = sc->args[2];
|
||||||
INIT_LIST_HEAD(&ppd->wq_list);
|
INIT_LIST_HEAD(&ppd->wq_list);
|
||||||
|
INIT_LIST_HEAD(&ppd->wq_req_list);
|
||||||
INIT_LIST_HEAD(&ppd->wq_list_exact);
|
INIT_LIST_HEAD(&ppd->wq_list_exact);
|
||||||
spin_lock_init(&ppd->wq_list_lock);
|
spin_lock_init(&ppd->wq_list_lock);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user