This commit is contained in:
Naoki Hamada
2014-09-22 10:46:33 +09:00
parent 55aeceb1bf
commit 43e54dcf85
4 changed files with 15 additions and 25 deletions

View File

@ -164,9 +164,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

@ -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

@ -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);