提交 32a3900d 创建 作者: Silas Boyd-Wickizer's avatar Silas Boyd-Wickizer

Merge branch 'old-types' into scale-amd64

......@@ -69,7 +69,7 @@ main(int ac, char** av)
mkdir("/dbx");
mtenable("xv6-schedbench");
mtenable("xv6-dirbench");
u64 t0 = rdtsc();
for(u32 i = 0; i < nthread; i++) {
int pid = fork(0);
......@@ -82,7 +82,7 @@ main(int ac, char** av)
for (u32 i = 0; i < nthread; i++)
wait();
u64 t1 = rdtsc();
mtdisable("xv6-schedbench");
mtdisable("xv6-dirbench");
printf("dirbench: %lu\n", t1-t0);
return 0;
......
......@@ -7,12 +7,15 @@
#define xfork() fork()
#define xexit() exit(EXIT_SUCCESS)
#define xcreat(name) open((name), O_CREATE|O_WRONLY, S_IRUSR|S_IWUSR)
#define mtenable(x) do { } while(0)
#define mtdisable(x) do { } while(0)
typedef uint64_t u64;
#else
#include "types.h"
#include "user.h"
#include "fcntl.h"
#include "amd64.h"
#include "mtrace.h"
#define xfork() fork(0)
#define xexit() exit()
#define xcreat(name) open((name), O_CREATE|O_WRONLY)
......@@ -78,6 +81,7 @@ main(int ac, char **av)
}
close(fd);
mtenable("xv6-filebench");
u64 t0 = rdtsc();
for (int i = 0; i < nthread; i++) {
int pid = xfork();
......@@ -90,6 +94,7 @@ main(int ac, char **av)
for (int i = 0; i < nthread; i++)
wait();
u64 t1 = rdtsc();
mtdisable("xv6-filebench");
printf("filebench: %lu\n", t1-t0);
return 0;
......
......@@ -68,7 +68,7 @@ struct inode : public referenced, public rcu_freed
short major;
short minor;
u32 size;
u32 addrs[NDIRECT+1];
std::atomic<u32> addrs[NDIRECT+1];
private:
inode();
......
......@@ -91,11 +91,9 @@ file::pread(char *addr, size_t n, off_t off)
{
if(type == file::FD_INODE){
int r;
ilock(ip, 0);
if(ip->type == 0)
panic("file::pread");
r = readi(ip, addr, off, n);
iunlock(ip);
return r;
}
return -1;
......
......@@ -516,16 +516,28 @@ bmap(struct inode *ip, u32 bn)
struct buf *bp;
if(bn < NDIRECT){
if((addr = ip->addrs[bn]) == 0)
ip->addrs[bn] = addr = balloc(ip->dev);
retry0:
if((addr = ip->addrs[bn]) == 0) {
addr = balloc(ip->dev);
if (!cmpxch(&ip->addrs[bn], (u32)0, addr)) {
bfree(ip->dev, addr);
goto retry0;
}
}
return addr;
}
bn -= NDIRECT;
if(bn < NINDIRECT){
// Load indirect block, allocating if necessary.
if((addr = ip->addrs[NDIRECT]) == 0)
ip->addrs[NDIRECT] = addr = balloc(ip->dev);
retry1:
if((addr = ip->addrs[NDIRECT]) == 0) {
addr = balloc(ip->dev);
if (!cmpxch(&ip->addrs[NDIRECT], (u32)0, addr)) {
bfree(ip->dev, addr);
goto retry1;
}
}
int writerflag = 0;
bp = bread(ip->dev, addr, writerflag);
......
......@@ -62,16 +62,27 @@ ssize_t
sys_pread(int fd, void *ubuf, size_t count, off_t offset)
{
sref<file> f;
uptr i = (uptr)ubuf;
if (!getfile(fd, &f))
return -1;
for(uptr va = PGROUNDDOWN(i); va < i+count; va = va + PGSIZE)
if(pagefault(myproc()->vmap, va, 0) < 0)
return -1;
return f->pread((char*)ubuf, count, offset);
if (count < PGSIZE) {
ssize_t r;
char* b;
b = kalloc("preadbuf");
r = f->pread(b, count, offset);
if (r > 0)
putmem(ubuf, b, r);
kfree(b);
return r;
} else {
// XXX(sbw) pagefaulting doesn't guarantee ubuf is mapped
// while pread executes
uptr i = (uptr)ubuf;
for(uptr va = PGROUNDDOWN(i); va < i+count; va = va + PGSIZE)
if(pagefault(myproc()->vmap, va, 0) < 0)
return -1;
return f->pread((char*)ubuf, count, offset);
}
}
//SYSCALL
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论