prepare for a condition variable for each process. (Redmine#193)
This commit is contained in:
@ -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) {
|
||||||
|
|||||||
@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user