pread syscall scheduling crud

上级 1934d0a3
......@@ -32,6 +32,8 @@ pread_work(struct work *w, void *a0, void *a1, void *a2, void *a3)
ipc->result = r;
barrier();
ipc->done = 1;
iput(ip);
}
static struct work *
......@@ -63,10 +65,14 @@ sys_kernlet(int fd, size_t count, off_t off)
if(f->type != FD_INODE)
return -1;
fetchadd(&f->ip->ref, 1);
w = pread_allocwork(f->ip, myproc()->vmap->kshared, count, off);
if (w == NULL)
if (w == NULL) {
iput(f->ip);
return -1;
}
if (wq_push(w) < 0) {
iput(f->ip);
freework(w);
return -1;
}
......
......@@ -42,11 +42,6 @@ main(int ac, char **av)
t0 = rdtsc();
for (k = 0; k < FSIZE; k+=PSIZE) {
kernlet_pread(fd, PSIZE, k);
while (ipcctl->done == 0)
nop_pause();
die("preadtest: %d\n", (int)ipcctl->result);
for (i = k; i < k+PSIZE; i+=BSIZE)
if (pread(fd, buf, BSIZE, i) != BSIZE)
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论