提交 616cdffa 创建 作者: Nickolai Zeldovich's avatar Nickolai Zeldovich

Merge branch 'scale-amd64' of git+ssh://pdos.csail.mit.edu/home/am0/6.828/xv6 into scale-amd64

Conflicts: vm.cc
差异被折叠。
#pragma once
class crange;
class range : public rcu_freed {
public:
u64 key;
u64 size;
void *value;
int curlevel; // the current levels it appears on
int nlevel; // the number of levels this range should appear
crange *cr; // the crange this range is part of
struct range** next; // one next pointer per level
struct spinlock *lock; // on separate cache line?
range(crange *cr, u64 k, u64 sz, void *v, struct range *n, int nlevel);
~range();
virtual void do_gc() {
delete this;
}
void print(int l);
void free_delayed();
void dec_ref(void);
int lockif(range *e);
} __mpalign__;
class crange {
range *crange_head; // a crange skip list starts with a sentinel range (key 0, sz 0)
crange_check(struct range *absent);
crange_replace(u64, u64, void*, range*, range*, range*);
public:
int nlevel; // number of levels in the crange skip list
crange(int nlevel);
~crange(void);
void del(u64 k, u64 sz);
void add(u64 k, u64 sz, void *v);
range* search(u64 k, u64 sz, int mod);
int foreach(int (*cb)(range *r, void *), void *st);
void print(int);
void check(struct range *absent);
int del_index(range *p0, range **e, int l);
void add_index(int l, range *e, range *p1, range *s1);
int lock_range(u64 k, u64 sz, int l, range **er, range **pr, range **fr, range **lr, range **sr);
int find_and_lock(u64 k, u64 sz, range **p0, range **f0, range **l0, range **s0);
};
......@@ -55,38 +55,6 @@ void consoleintr(int(*)(void));
#define assert(c) if (!(c)) { cprintf("%s:%d: ", __FILE__, __LINE__); panic("assertion failure"); }
// crange.c
#if __cplusplus
#include "gc.hh"
struct range : public rcu_freed {
u64 key;
u64 size;
void *value;
int curlevel; // the current levels it appears on
int nlevel; // the number of levels this range should appear
struct crange *cr; // the crange this range is part of
struct range** next; // one next pointer per level
struct spinlock *lock; // on separate cache line?
range() : rcu_freed("range") {}
void do_gc();
} __mpalign__;
struct crange {
int nlevel; // number of levels in the crange skip list
struct range crange_head; // a crange skip list starts with a sentinel range (key 0, sz 0)
};
struct crange* crange_alloc(int nlevel);
void crange_free(struct crange *cr);
void crange_del(struct crange *cr, u64 k, u64 sz);
void crange_add(struct crange *cr, u64 k, u64 sz, void *v);
struct range* crange_search(struct crange *cr, u64 k, u64 sz, int mod);
int crange_foreach(struct crange *crk, int (*f)(struct range *r, void *st), void *st);
void crange_print(struct crange *cr, int);
#endif
// e1000.c
extern int e1000irq;
extern int e1000init;
......
......@@ -14,6 +14,7 @@ extern "C" {
#include "vm.hh"
#include "gc.hh"
#include "crange.hh"
static void vmap_free(void *p);
......@@ -114,7 +115,7 @@ vmap_alloc(void)
return 0;
}
#ifdef TREE
m->cr = crange_alloc(10);
m->cr = new crange(10);
if (m->cr == 0)
return 0;
#endif
......@@ -313,10 +314,10 @@ struct state {
};
static int
vmap_free_vma(struct range *r, void *st)
vmap_free_vma(range *r, void *st)
{
delete (vma *) r->value;
crange_del(r->cr, r->key, r->size);
r->cr->del(r->key, r->size);
return 1;
}
......@@ -324,8 +325,8 @@ static void
vmap_free(void *p)
{
struct vmap *m = (struct vmap *) p;
crange_foreach(m->cr, vmap_free_vma, NULL);
crange_free(m->cr);
m->cr->foreach(vmap_free_vma, NULL);
delete m->cr;
ksfree(slab_kshared, m->kshared);
freevm(m->pml4);
m->pml4 = 0;
......@@ -346,7 +347,7 @@ vmap_lookup(struct vmap *m, uptr start, uptr len)
if(start + len < start)
panic("vmap_lookup bad len");
struct range *r = crange_search(m->cr, start, len, 0);
range *r = m->cr->search(start, len, 0);
if (r != 0) {
struct vma *e = (struct vma *) (r->value);
if (e->va_end <= e->va_start)
......@@ -380,7 +381,7 @@ vmap_insert(struct vmap *m, struct vmnode *n, uptr va_start)
e->va_end = va_start + len;
e->n = n;
n->ref++;
crange_add(m->cr, e->va_start, len, (void *) e);
m->cr->add(e->va_start, len, (void *) e);
release(&m->lock);
return 0;
}
......@@ -411,7 +412,7 @@ vmap_copy_vma(struct range *r, void *_st)
return 0;
}
c->n->ref++;
crange_add(st->cr, c->va_start, c->va_end - c->va_start, (void *) c);
st->cr->add(c->va_start, c->va_end - c->va_start, (void *) c);
return 1;
}
......@@ -427,7 +428,7 @@ vmap_copy(struct vmap *m, int share)
st.share = share;
st.pml4 = m->pml4;
st.cr = c->cr;
if (!crange_foreach(m->cr, vmap_copy_vma, &st)) {
if (!m->cr->foreach(vmap_copy_vma, &st)) {
vmap_free(c);
release(&m->lock);
return 0;
......@@ -445,7 +446,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
{
acquire(&m->lock);
uptr va_end = va_start + len;
struct range *r = crange_search(m->cr, va_start, len, 0);
struct range *r = m->cr->search(va_start, len, 0);
if (r == 0)
panic("no vma?");
struct vma *e = (struct vma *) r->value;
......@@ -454,7 +455,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
release(&m->lock);
return -1;
}
crange_del(m->cr, va_start, len);
m->cr->del(va_start, len);
gc_delayed(e);
release(&m->lock);
return 0;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论