提交 7e8cd598 创建 作者: Robert Morris's avatar Robert Morris

primitive file name cache

上级 d1f78e45
...@@ -202,7 +202,7 @@ void clearpages(pde_t *pgdir, void *begin, void *end); ...@@ -202,7 +202,7 @@ void clearpages(pde_t *pgdir, void *begin, void *end);
void nc_init(); void nc_init();
struct inode * nc_lookup(struct inode *, char *); struct inode * nc_lookup(struct inode *, char *);
void nc_insert(struct inode *, char *, struct inode *); void nc_insert(struct inode *, char *, struct inode *);
void nc_invalidate(struct inode *dir, char *name);
// number of elements in fixed-size array // number of elements in fixed-size array
#define NELEM(x) (sizeof(x)/sizeof((x)[0])) #define NELEM(x) (sizeof(x)/sizeof((x)[0]))
......
...@@ -588,7 +588,9 @@ namex(char *path, int nameiparent, char *name) ...@@ -588,7 +588,9 @@ namex(char *path, int nameiparent, char *name)
// XXX do we need to ilock(ip)? // XXX do we need to ilock(ip)?
// hopefully not, would be nice to have // hopefully not, would be nice to have
// lock-free namecache hits. // lock-free namecache hits.
next = nc_lookup(ip, name); next = 0;
if(nameiparent == 0)
next = nc_lookup(ip, name);
if(next == 0){ if(next == 0){
ilock(ip); ilock(ip);
if(ip->type != T_DIR){ if(ip->type != T_DIR){
......
...@@ -205,6 +205,7 @@ sys_unlink(void) ...@@ -205,6 +205,7 @@ sys_unlink(void)
dp->nlink--; dp->nlink--;
iupdate(dp); iupdate(dp);
} }
nc_invalidate(dp, name);
iunlockput(dp); iunlockput(dp);
ip->nlink--; ip->nlink--;
......
...@@ -259,13 +259,13 @@ struct { ...@@ -259,13 +259,13 @@ struct {
struct vmnode * struct vmnode *
vmn_alloc(uint npg, uint type) vmn_alloc(uint npg, uint type)
{ {
for(uint i = 0; i < sizeof(vmnodes.n) / sizeof(vmnodes.n[0]); i++) { for(uint i = 0; i < NELEM(vmnodes.n); i++) {
struct vmnode *n = &vmnodes.n[i]; struct vmnode *n = &vmnodes.n[i];
if(n->alloc == 0 && __sync_bool_compare_and_swap(&n->alloc, 0, 1)) { if(n->alloc == 0 && __sync_bool_compare_and_swap(&n->alloc, 0, 1)) {
if(npg > sizeof(n->page) / sizeof(n->page[0])) { if(npg > NELEM(n->page)) {
panic("vmnode too big\n"); panic("vmnode too big\n");
} }
for (uint i = 0; i < sizeof(n->page) / sizeof(n->page[0]); i++) for (uint i = 0; i < NELEM(n->page); i++)
n->page[i] = 0; n->page[i] = 0;
n->npages = npg; n->npages = npg;
n->ref = 0; n->ref = 0;
...@@ -347,10 +347,10 @@ vmn_copy(struct vmnode *n) ...@@ -347,10 +347,10 @@ vmn_copy(struct vmnode *n)
struct vmap * struct vmap *
vmap_alloc(void) vmap_alloc(void)
{ {
for(uint i = 0; i < sizeof(vmaps.m) / sizeof(vmaps.m[0]); i++) { for(uint i = 0; i < NELEM(vmaps.m); i++) {
struct vmap *m = &vmaps.m[i]; struct vmap *m = &vmaps.m[i];
if(m->alloc == 0 && __sync_bool_compare_and_swap(&m->alloc, 0, 1)) { if(m->alloc == 0 && __sync_bool_compare_and_swap(&m->alloc, 0, 1)) {
for(uint j = 0; j < sizeof(m->e) / sizeof(m->e[0]); j++){ for(uint j = 0; j < NELEM(m->e); j++){
m->e[j].n = 0; m->e[j].n = 0;
m->e[j].va_type = PRIVATE; m->e[j].va_type = PRIVATE;
m->e[j].lock.name = "vma"; m->e[j].lock.name = "vma";
...@@ -369,7 +369,7 @@ vmap_alloc(void) ...@@ -369,7 +369,7 @@ vmap_alloc(void)
static void static void
vmap_free(struct vmap *m) vmap_free(struct vmap *m)
{ {
for(uint i = 0; i < sizeof(m->e) / sizeof(m->e[0]); i++) { for(uint i = 0; i < NELEM(m->e); i++) {
if(m->e[i].n) if(m->e[i].n)
vmn_decref(m->e[i].n); vmn_decref(m->e[i].n);
} }
...@@ -398,7 +398,7 @@ vmap_overlap(struct vmap *m, uint start, uint len) ...@@ -398,7 +398,7 @@ vmap_overlap(struct vmap *m, uint start, uint len)
if(start + len < start) if(start + len < start)
panic("vmap_overlap bad len"); panic("vmap_overlap bad len");
for(uint i = 0; i < sizeof(m->e) / sizeof(m->e[0]); i++){ for(uint i = 0; i < NELEM(m->e); i++){
if(m->e[i].n){ if(m->e[i].n){
if(m->e[i].va_end <= m->e[i].va_start) if(m->e[i].va_end <= m->e[i].va_start)
panic("vmap_overlap bad vma"); panic("vmap_overlap bad vma");
...@@ -421,7 +421,7 @@ vmap_insert(struct vmap *m, struct vmnode *n, uint va_start) ...@@ -421,7 +421,7 @@ vmap_insert(struct vmap *m, struct vmnode *n, uint va_start)
return -1; return -1;
} }
for(uint i = 0; i < sizeof(m->e) / sizeof(m->e[0]); i++) { for(uint i = 0; i < NELEM(m->e); i++) {
if(m->e[i].n) if(m->e[i].n)
continue; continue;
__sync_fetch_and_add(&n->ref, 1); __sync_fetch_and_add(&n->ref, 1);
...@@ -442,7 +442,7 @@ vmap_remove(struct vmap *m, uint va_start, uint len) ...@@ -442,7 +442,7 @@ vmap_remove(struct vmap *m, uint va_start, uint len)
{ {
acquire(&m->lock); acquire(&m->lock);
uint va_end = va_start + len; uint va_end = va_start + len;
for(uint i = 0; i < sizeof(m->e) / sizeof(m->e[0]); i++) { for(uint i = 0; i < NELEM(m->e); i++) {
if(m->e[i].n && (m->e[i].va_start < va_end && m->e[i].va_end > va_start)) { if(m->e[i].n && (m->e[i].va_start < va_end && m->e[i].va_end > va_start)) {
if(m->e[i].va_start != va_start || m->e[i].va_end != va_end) { if(m->e[i].va_start != va_start || m->e[i].va_end != va_end) {
release(&m->lock); release(&m->lock);
...@@ -481,7 +481,7 @@ vmap_copy(struct vmap *m, int share) ...@@ -481,7 +481,7 @@ vmap_copy(struct vmap *m, int share)
return 0; return 0;
acquire(&m->lock); acquire(&m->lock);
for(uint i = 0; i < sizeof(m->e) / sizeof(m->e[0]); i++) { for(uint i = 0; i < NELEM(m->e); i++) {
if(m->e[i].n == 0) if(m->e[i].n == 0)
continue; continue;
c->e[i].va_start = m->e[i].va_start; c->e[i].va_start = m->e[i].va_start;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论