prepare for a condition variable for each process. (Redmine#193)

This commit is contained in:
Tomoki Shirasawa
2014-07-25 09:17:43 +09:00
parent 101a0f6e4a
commit 10190e9ed6
3 changed files with 7 additions and 6 deletions

View File

@ -330,12 +330,13 @@ retry_alloc:
} }
wqhln->pid = pid; wqhln->pid = pid;
wqhln->req = 0;
init_waitqueue_head(&wqhln->wq_syscall); init_waitqueue_head(&wqhln->wq_syscall);
list_add_tail(&wqhln->list, &c->wq_list); list_add_tail(&wqhln->list, &c->wq_list);
} }
ihk_ikc_spinlock_unlock(&c->wq_list_lock, flags); ihk_ikc_spinlock_unlock(&c->wq_list_lock, flags);
c->req = 1; wqhln->req = 1;
wake_up(&wqhln->wq_syscall); wake_up(&wqhln->wq_syscall);
return 0; return 0;
@ -388,6 +389,7 @@ retry_alloc:
} }
wqhln->pid = swd.pid; wqhln->pid = swd.pid;
wqhln->req = 0;
init_waitqueue_head(&wqhln->wq_syscall); init_waitqueue_head(&wqhln->wq_syscall);
irqflags = ihk_ikc_spinlock_lock(&c->wq_list_lock); irqflags = ihk_ikc_spinlock_lock(&c->wq_list_lock);
@ -403,7 +405,7 @@ retry_alloc:
list_add_tail(&wqhln->list, &c->wq_list); list_add_tail(&wqhln->list, &c->wq_list);
ihk_ikc_spinlock_unlock(&c->wq_list_lock, irqflags); ihk_ikc_spinlock_unlock(&c->wq_list_lock, irqflags);
ret = wait_event_interruptible(wqhln->wq_syscall, c->req); ret = wait_event_interruptible(wqhln->wq_syscall, wqhln->req);
/* Remove per-process wait queue head */ /* Remove per-process wait queue head */
irqflags = ihk_ikc_spinlock_lock(&c->wq_list_lock); irqflags = ihk_ikc_spinlock_lock(&c->wq_list_lock);
@ -427,7 +429,6 @@ retry_alloc:
return -EINTR; return -EINTR;
} }
c->req = 0;
#if 1 #if 1
mb(); mb();
if (!c->param.request_va->valid) { if (!c->param.request_va->valid) {

View File

@ -93,6 +93,7 @@ struct wait_queue_head_list_node {
struct list_head list; struct list_head list;
wait_queue_head_t wq_syscall; wait_queue_head_t wq_syscall;
int pid; int pid;
int req;
}; };
struct mcctrl_channel { struct mcctrl_channel {
@ -101,7 +102,6 @@ struct mcctrl_channel {
struct ikc_scd_init_param init; struct ikc_scd_init_param init;
void *dma_buf; void *dma_buf;
int req;
struct list_head wq_list; struct list_head wq_list;
ihk_spinlock_t wq_list_lock; ihk_spinlock_t wq_list_lock;
}; };

View File

@ -255,6 +255,7 @@ retry_alloc:
/* Prepare per-process wait queue head */ /* Prepare per-process wait queue head */
wqhln->pid = current->tgid; wqhln->pid = current->tgid;
wqhln->req = 0;
init_waitqueue_head(&wqhln->wq_syscall); init_waitqueue_head(&wqhln->wq_syscall);
irqflags = ihk_ikc_spinlock_lock(&channel->wq_list_lock); irqflags = ihk_ikc_spinlock_lock(&channel->wq_list_lock);
@ -271,7 +272,7 @@ retry_alloc:
ihk_ikc_spinlock_unlock(&channel->wq_list_lock, irqflags); ihk_ikc_spinlock_unlock(&channel->wq_list_lock, irqflags);
/* wait for response */ /* wait for response */
error = wait_event_interruptible(wqhln->wq_syscall, channel->req); error = wait_event_interruptible(wqhln->wq_syscall, wqhln->req);
/* Remove per-process wait queue head */ /* Remove per-process wait queue head */
irqflags = ihk_ikc_spinlock_lock(&channel->wq_list_lock); irqflags = ihk_ikc_spinlock_lock(&channel->wq_list_lock);
@ -283,7 +284,6 @@ retry_alloc:
printk("remote_page_fault:interrupted. %d\n", error); printk("remote_page_fault:interrupted. %d\n", error);
goto out; goto out;
} }
channel->req = 0;
if (!req->valid) { if (!req->valid) {
printk("remote_page_fault:not valid\n"); printk("remote_page_fault:not valid\n");
} }