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