Merge branch 'master' of postpeta.pccluster.org:mckernel

This commit is contained in:
Tomoki Shirasawa
2014-09-23 23:18:27 +09:00
7 changed files with 28 additions and 35 deletions

View File

@@ -19,12 +19,14 @@ void ihk_mc_spinlock_init(ihk_spinlock_t *lock)
*lock = 0;
}
void ihk_mc_spinlock_lock(ihk_spinlock_t *lock, unsigned long *flags)
unsigned long ihk_mc_spinlock_lock(ihk_spinlock_t *lock)
{
int inc = 0x00010000;
int tmp;
cpu_disable_interrupt_save(flags);
unsigned long flags;
flags = cpu_disable_interrupt_save();
asm volatile("lock ; xaddl %0, %1\n"
"movzwl %w0, %2\n\t"
"shrl $16, %0\n\t"
@@ -36,12 +38,13 @@ void ihk_mc_spinlock_lock(ihk_spinlock_t *lock, unsigned long *flags)
"jmp 1b\n"
"2:"
: "+Q" (inc), "+m" (*lock), "=r" (tmp) : : "memory", "cc");
return flags;
}
void ihk_mc_spinlock_unlock(ihk_spinlock_t *lock, unsigned long *flags)
void ihk_mc_spinlock_unlock(ihk_spinlock_t *lock, unsigned long flags)
{
asm volatile ("lock incw %0" : "+m"(*lock) : : "memory", "cc");
cpu_restore_interrupt(*flags);
cpu_restore_interrupt(flags);
}
#endif

View File

@@ -172,9 +172,9 @@ struct procfs_read {
unsigned long pbuf; /* physical address of the host buffer (request) */
unsigned long offset; /* offset to read (request) */
int count; /* bytes to read (request) */
int error; /* non-zero if below fields are invalid. (answer) */
int eof; /* if eof is detected, 1 otherwise 0. (answer)*/
int ret; /* read bytes (answer) */
int status; /* non-zero if done (answer) */
int newcpu; /* migrated new cpu (answer) */
char fname[PROCFS_NAME_MAX]; /* procfs filename (request) */
};

View File

@@ -26,7 +26,6 @@
#endif
static DECLARE_WAIT_QUEUE_HEAD(procfsq);
static unsigned long procfsq_channel;
int mckernel_procfs_read(char *buffer, char **start, off_t offset,
int count, int *peof, void *dat);
@@ -254,11 +253,7 @@ void procfs_delete(void *__os, int osnum, unsigned long arg)
void procfs_answer(unsigned int arg, int err)
{
volatile struct procfs_read *r = phys_to_virt(arg);
dprintk("procfs: received SCD_MSG_PROCFS_ANSWER message(err = %d).\n", err);
procfsq_channel = arg;
r->error = err;
wake_up_interruptible(&procfsq);
}
@@ -277,7 +272,6 @@ int mckernel_procfs_read(char *buffer, char **start, off_t offset,
struct ikc_scd_packet isp;
int ret, retrycount = 0;
unsigned long pbuf;
int i;
dprintk("mckernel_procfs_read: invoked for %s\n", e->fname);
@@ -299,7 +293,8 @@ retry:
r->pbuf = pbuf;
r->eof = 0;
r->ret = PAGE_SIZE * 2; /* dummy answer */
r->ret = -EIO; /* default */
r->status = 0;
r->offset = offset;
r->count = count;
strncpy((char *)r->fname, e->fname, PROCFS_NAME_MAX);
@@ -308,32 +303,25 @@ retry:
isp.arg = virt_to_phys(r);
ret = mcctrl_ikc_send(e->os, e->cpu, &isp);
if (ret < 0) {
return ret; /* error */
goto out; /* error */
}
/* Wait for a reply. */
ret = -EIO; /* default exit code */
dprintk("now wait for a relpy\n");
wait_event_interruptible(procfsq, procfsq_channel == virt_to_phys(r));
/* Wake up and check the result. */
dprintk("mckernel_procfs_read: woke up.\n");
if (r->error != 0) {
kprintf("ERROR: mckernel_procfs_read: failed to get valid answer.\n");
return -EIO;
}
for (i = 0; r->ret == PAGE_SIZE * 2; i++) {
/* FIXME: busy wait for the real answer to reach*/;
if (i > 1000000) {
kprintf("ERROR: mckernel_procfs_read: answer unavailable.\n");
return -EIO;
}
/* Wait for the status field of the procfs_read structure set ready. */
if (wait_event_interruptible_timeout(procfsq, r->status != 0, HZ) == 0) {
kprintf("ERROR: mckernel_procfs_read: timeout (1 sec).\n");
goto out;
}
dprintk("ret: %d, eof: %d (wait loop count: %d)\n", r->ret, r->eof, i);
/* Wake up and check the result. */
dprintk("mckernel_procfs_read: woke up. ret: %d, eof: %d\n", r->ret, r->eof);
if ((r->ret == 0) && (r->eof != 1)) {
/* A miss-hit caused by migration has occurred.
* We simply retry the query with a new CPU.
*/
if (retrycount++ > 10) {
kprintf("ERROR: mckernel_procfs_read: excessive retry.\n");
return -EIO;
goto out;
}
e->cpu = r->newcpu;
dprintk("retry\n");
@@ -345,6 +333,7 @@ retry:
}
*start = buffer;
ret = r->ret;
out:
kfree((void *)r);
return ret;

View File

@@ -282,7 +282,7 @@ void check_need_resched(void);
void cpu_set(int cpu, cpu_set_t *cpu_set, ihk_spinlock_t *lock);
void cpu_clear(int cpu, cpu_set_t *cpu_set, ihk_spinlock_t *lock);
struct process *findthread_and_lock(int pid, int tid, void *savelock, unsigned long *irqstate);
struct process *findthread_and_lock(int pid, int tid, ihk_spinlock_t **savelock, unsigned long *irqstate);
void process_unlock(void *savelock, unsigned long irqstate);
#endif

View File

@@ -251,9 +251,9 @@ struct procfs_read {
unsigned long pbuf; /* physical address of the host buffer (request) */
unsigned long offset; /* offset to read (request) */
int count; /* bytes to read (request) */
int error; /* non-zero if below fields are invalid. (answer) */
int eof; /* if eof is detected, 1 otherwise 0. (answer)*/
int ret; /* read bytes (answer) */
int status; /* non-zero if done (answer) */
int newcpu; /* migrated new cpu (answer) */
char fname[PROCFS_NAME_MAX]; /* procfs filename (request) */
};

View File

@@ -2066,7 +2066,7 @@ void runq_del_proc(struct process *proc, int cpu_id)
}
struct process *
findthread_and_lock(int pid, int tid, void *savelock, unsigned long *irqstate)
findthread_and_lock(int pid, int tid, ihk_spinlock_t **savelock, unsigned long *irqstate)
{
struct cpu_local_var *v;
struct process *p;
@@ -2075,11 +2075,11 @@ findthread_and_lock(int pid, int tid, void *savelock, unsigned long *irqstate)
for(i = 0; i < num_processors; i++){
v = get_cpu_local_var(i);
*(ihk_spinlock_t **)savelock = &(v->runq_lock);
*savelock = &(v->runq_lock);
*irqstate = ihk_mc_spinlock_lock(&(v->runq_lock));
list_for_each_entry(p, &(v->runq), sched_list){
if(p->pid == pid &&
p->tid == tid){
(tid == -1 || p->tid == tid)){
return p;
}
}

View File

@@ -200,7 +200,7 @@ void process_procfs_request(unsigned long rarg)
int rosnum, ret, pid, tid, ans = -EIO, eof = 0;
char *buf, *p;
struct ihk_ikc_channel_desc *syscall_channel;
void *savelock;
ihk_spinlock_t *savelock;
unsigned long irqstate;
dprintf("process_procfs_request: invoked.\n");
@@ -449,6 +449,7 @@ end:
dprintf("ret: %d, eof: %d\n", ans, eof);
r->ret = ans;
r->eof = eof;
r->status = 1; /* done */
packet.err = 0;
bufunavail:
ihk_mc_unmap_memory(NULL, pbuf, r->count);