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

remove unneeded this->

fix shadowing declarations
上级 39fa2be7
...@@ -79,23 +79,23 @@ bget(u32 dev, u64 sector, int *writer) ...@@ -79,23 +79,23 @@ bget(u32 dev, u64 sector, int *writer)
// Allocate fresh block. // Allocate fresh block.
struct buf *victim = 0; struct buf *victim = 0;
bufns->enumerate([&victim](const pair<u32, u64>&, buf *b)->bool { bufns->enumerate([&victim](const pair<u32, u64>&, buf *eb)->bool {
acquire(&b->lock); acquire(&eb->lock);
if ((b->flags & (B_BUSY | B_DIRTY | B_VALID)) == 0) { if ((eb->flags & (B_BUSY | B_DIRTY | B_VALID)) == 0) {
victim = b; victim = eb;
return true; return true;
} }
release(&b->lock); release(&eb->lock);
return false; return false;
}); });
if (victim == 0) if (victim == 0)
bufns->enumerate([&victim](const pair<u32, u64>&, buf *b)->bool { bufns->enumerate([&victim](const pair<u32, u64>&, buf *eb)->bool {
acquire(&b->lock); acquire(&eb->lock);
if ((b->flags & (B_BUSY | B_DIRTY)) == 0) { if ((eb->flags & (B_BUSY | B_DIRTY)) == 0) {
victim = b; victim = eb;
return true; return true;
} }
release(&b->lock); release(&eb->lock);
return false; return false;
}); });
if (victim == 0) if (victim == 0)
......
...@@ -89,51 +89,51 @@ void range::print(int l) ...@@ -89,51 +89,51 @@ void range::print(int l)
range::~range() range::~range()
{ {
dprintf("%d: range_free: 0x%lx 0x%lx-0x%lx(%ld)\n", myproc()->cpuid, (u64) this, this->key, this->key+this->size, this->size); dprintf("%d: range_free: 0x%lx 0x%lx-0x%lx(%ld)\n", myproc()->cpuid, (u64) this, key, key+size, size);
this->cr->check(this); cr->check(this);
// assert(this->curlevel == -1); // assert(curlevel == -1);
for (int l = 0; l < this->nlevel; l++) { for (int l = 0; l < nlevel; l++) {
next[l] = (struct range *) 0xDEADBEEF; next[l] = (struct range *) 0xDEADBEEF;
} }
kmalignfree(this->lock); kmalignfree(lock);
kmfree(this->next); kmfree(next);
} }
void range::free_delayed(void) void range::free_delayed(void)
{ {
dprintf("%d: free_delayed: 0x%lx 0x%lx-0x%lx(%lu) %lu\n", myproc()->pid, (long) this, this->key, this->key + this->size, this->size, myproc()->epoch); dprintf("%d: free_delayed: 0x%lx 0x%lx-0x%lx(%lu) %lu\n", myproc()->pid, (long) this, key, key + size, size, myproc()->epoch);
this->cr->check(this); cr->check(this);
assert(this->curlevel == -1); assert(curlevel == -1);
gc_delayed(this); gc_delayed(this);
} }
void range::dec_ref(void) void range::dec_ref(void)
{ {
int n = this->curlevel--; int n = curlevel--;
if (n == 0) { // now removed from all levels. if (n == 0) { // now removed from all levels.
this->free_delayed(); free_delayed();
} }
} }
range::range(crange *cr, u64 k, u64 sz, void *v, markptr<range> n, int nlevel) range::range(crange *crarg, u64 k, u64 sz, void *v, markptr<range> n, int nl)
: rcu_freed("range_delayed") : rcu_freed("range_delayed")
{ {
dprintf("range:range:: %lu %lu %d\n", k, sz, nlevel); dprintf("range:range:: %lu %lu %d\n", k, sz, nl);
this->key = k; key = k;
this->size = sz; size = sz;
this->value = v; value = v;
this->cr = cr; cr = crarg;
assert(cr->nlevel > 0); assert(cr->nlevel > 0);
this->curlevel = 0; curlevel = 0;
if (nlevel == 0) this->nlevel = range_draw_nlevel(cr->nlevel); if (nl == 0) nlevel = range_draw_nlevel(cr->nlevel);
else this->nlevel = nlevel; else nlevel = nl;
this->next = new markptr<range>[this->nlevel]; // cache align? next = new markptr<range>[nlevel]; // cache align?
assert(this->next); assert(next);
this->next[0] = n; next[0] = n;
for (int l = 1; l < this->nlevel; l++) this->next[l] = 0; for (int l = 1; l < nlevel; l++) next[l] = 0;
assert(kmalign((void **) &this->lock, CACHELINE, assert(kmalign((void **) &lock, CACHELINE,
sizeof(struct spinlock)) == 0); sizeof(struct spinlock)) == 0);
initlock(this->lock, "crange", LOCKSTAT_CRANGE); initlock(lock, "crange", LOCKSTAT_CRANGE);
} }
// //
...@@ -160,16 +160,16 @@ static range *insert(struct range *head, struct range *r) ...@@ -160,16 +160,16 @@ static range *insert(struct range *head, struct range *r)
return head; return head;
} }
// lock p if this->next == e and p isn't marked for deletion. if not, return failure. // lock p if next == e and p isn't marked for deletion. if not, return failure.
int range::lockif(markptr<range> e) int range::lockif(markptr<range> e)
{ {
assert(!e.mark()); assert(!e.mark());
acquire(this->lock); acquire(lock);
if (this->next[0] == e) { if (next[0] == e) {
return 1; return 1;
} }
release(this->lock); release(lock);
// cprintf("%d: range_lock_pred: retry %u\n", mycpu()->id, this->key); // cprintf("%d: range_lock_pred: retry %u\n", mycpu()->id, key);
return 0; return 0;
} }
...@@ -270,7 +270,7 @@ static range *replace(u64 k, u64 sz, void *v, range *f, range *l, range *s) ...@@ -270,7 +270,7 @@ static range *replace(u64 k, u64 sz, void *v, range *f, range *l, range *s)
void void
crange::print(int full) crange::print(int full)
{ {
for (int l = 0; l < this->nlevel; l++) { for (int l = 0; l < nlevel; l++) {
int c = 0; int c = 0;
cprintf("crange %d: ", l); cprintf("crange %d: ", l);
for (range *e = crange_head->next[l].ptr(); e != 0; e = e->next[l].ptr()) { for (range *e = crange_head->next[l].ptr(); e != 0; e = e->next[l].ptr()) {
...@@ -281,11 +281,11 @@ crange::print(int full) ...@@ -281,11 +281,11 @@ crange::print(int full)
} }
} }
crange::crange(int nlevel) crange::crange(int nl)
{ {
assert(nlevel >= 0); assert(nl >= 0);
this->nlevel = nlevel; nlevel = nl;
this->crange_head = new range(this, 0, 0, nullptr, nullptr, nlevel); crange_head = new range(this, 0, 0, nullptr, nullptr, nlevel);
dprintf("crange::crange return 0x%lx\n", (u64) this); dprintf("crange::crange return 0x%lx\n", (u64) this);
} }
...@@ -293,11 +293,11 @@ crange::~crange() ...@@ -293,11 +293,11 @@ crange::~crange()
{ {
dprintf("crange_free: 0x%lx\n", (u64) this); dprintf("crange_free: 0x%lx\n", (u64) this);
range *e, *n; range *e, *n;
for (e = this->crange_head->next[0].ptr(); e; e = n) { for (e = crange_head->next[0].ptr(); e; e = n) {
n = e->next[0].ptr(); n = e->next[0].ptr();
delete e; delete e;
} }
delete this->crange_head; delete crange_head;
} }
// Check some invariants, ignoring marked nodes. // Check some invariants, ignoring marked nodes.
...@@ -307,9 +307,9 @@ void crange::check(struct range *absent) ...@@ -307,9 +307,9 @@ void crange::check(struct range *absent)
return; return;
int t = mycpu()->id; int t = mycpu()->id;
struct range *e, *s; struct range *e, *s;
for (int l = 0; l < this->nlevel; l++) { for (int l = 0; l < nlevel; l++) {
for (e = this->crange_head->next[l].ptr(); e; e = s) { for (e = crange_head->next[l].ptr(); e; e = s) {
assert(e->curlevel < this->nlevel); assert(e->curlevel < nlevel);
if (absent == e) { if (absent == e) {
cprintf("%d: check level failed; 0x%lx is present\n", l, (u64) absent); cprintf("%d: check level failed; 0x%lx is present\n", l, (u64) absent);
assert(0); assert(0);
...@@ -324,7 +324,7 @@ void crange::check(struct range *absent) ...@@ -324,7 +324,7 @@ void crange::check(struct range *absent)
// from memory (and not from a register) // from memory (and not from a register)
if (!e->next[l].mark() && n != e) { if (!e->next[l].mark() && n != e) {
cprintf("%d: check level %d failed 0x%lx-0x%lx(%lu) m %d c %d t %d; in high level but not low\n", t, l, e->key, e->key+e->size, e->size, (bool)e->next[l].mark(), e->curlevel.load(), e->nlevel); cprintf("%d: check level %d failed 0x%lx-0x%lx(%lu) m %d c %d t %d; in high level but not low\n", t, l, e->key, e->key+e->size, e->size, (bool)e->next[l].mark(), e->curlevel.load(), e->nlevel);
this->print(1); print(1);
assert(0); assert(0);
} }
} }
...@@ -333,7 +333,7 @@ void crange::check(struct range *absent) ...@@ -333,7 +333,7 @@ void crange::check(struct range *absent)
assert(s != e); assert(s != e);
if (!e->next[l].mark() && s && (e->key + e->size > s->key)) { if (!e->next[l].mark() && s && (e->key + e->size > s->key)) {
dprintf("%d: e(%lu,%lu) overlaps with s(%lu,%lu)\n", t, e->key, e->size, s->key, e->size); dprintf("%d: e(%lu,%lu) overlaps with s(%lu,%lu)\n", t, e->key, e->size, s->key, e->size);
this->print(1); print(1);
assert(0); assert(0);
} }
} }
...@@ -374,7 +374,7 @@ int crange::del_index(range *p0, range **e, int l) ...@@ -374,7 +374,7 @@ int crange::del_index(range *p0, range **e, int l)
} }
} }
done: done:
this->check(nullptr); check(nullptr);
return r; return r;
} }
...@@ -407,8 +407,9 @@ void crange::add_index(int l, range *e, range *p1, markptr<range> s1) ...@@ -407,8 +407,9 @@ void crange::add_index(int l, range *e, range *p1, markptr<range> s1)
//INCRETRY; //INCRETRY;
} }
} }
done: done:
this->check(nullptr); check(nullptr);
} }
// Given the range that starts the sequence, find all other ranges part of sequence and lock them, // Given the range that starts the sequence, find all other ranges part of sequence and lock them,
...@@ -450,24 +451,24 @@ int crange::find_and_lock(u64 k, u64 sz, range **p0, range **f0, range **l0, ran ...@@ -450,24 +451,24 @@ int crange::find_and_lock(u64 k, u64 sz, range **p0, range **f0, range **l0, ran
retry: retry:
*p0 = nullptr; *p0 = nullptr;
*s0 = nullptr; *s0 = nullptr;
for (int l = this->nlevel-1; l >= 0; l--) { for (int l = nlevel-1; l >= 0; l--) {
*f0 = nullptr; *f0 = nullptr;
*l0 = nullptr; *l0 = nullptr;
p1 = *p0; // remember last previous (p0) as the previous one level up (p1) p1 = *p0; // remember last previous (p0) as the previous one level up (p1)
*p0 = (l == this->nlevel-1) ? this->crange_head : p1; // set current previous *p0 = (l == nlevel-1) ? crange_head : p1; // set current previous
s1 = *s0; s1 = *s0;
for (e = (*p0)->next[l].ptr(); e; *p0 = e, e = e->next[l].ptr()) { for (e = (*p0)->next[l].ptr(); e; *p0 = e, e = e->next[l].ptr()) {
assert(l < e->nlevel); assert(l < e->nlevel);
int r = this->del_index(*p0, &e, l); int r = del_index(*p0, &e, l);
if (r == -1) goto retry; // deletion failed because some other core did it; try again if (r == -1) goto retry; // deletion failed because some other core did it; try again
if (r == 0) continue; // range was marked but we are level 0, skip it; lock holder will remove if (r == 0) continue; // range was marked but we are level 0, skip it; lock holder will remove
if (e == 0) break; // all ranges on this level were removed if (e == 0) break; // all ranges on this level were removed
if (k >= e->key+e->size) { // is e before k? if (k >= e->key+e->size) { // is e before k?
this->add_index(l, e, p1, s1); // maybe add to index add_index(l, e, p1, s1); // maybe add to index
continue; continue;
} }
if (range_intersect(k, sz, e->key, e->size)) { // first range of sequence? if (range_intersect(k, sz, e->key, e->size)) { // first range of sequence?
if (!this->lock_range(k, sz, l, &e, p0, f0, l0, s0)) { if (!lock_range(k, sz, l, &e, p0, f0, l0, s0)) {
// INCRETRY; // INCRETRY;
goto retry; goto retry;
} }
...@@ -498,13 +499,13 @@ int crange::find_and_lock(u64 k, u64 sz, range **p0, range **f0, range **l0, ran ...@@ -498,13 +499,13 @@ int crange::find_and_lock(u64 k, u64 sz, range **p0, range **f0, range **l0, ran
range* crange::search(u64 k, u64 sz, int mod) range* crange::search(u64 k, u64 sz, int mod)
{ {
struct range *p, *e, *r; struct range *p, *e, *r;
int n = (mod) ? range_draw_nlevel(this->nlevel) : 0; int n = (mod) ? range_draw_nlevel(nlevel) : 0;
gc_begin_epoch(); gc_begin_epoch();
//read_counters(myproc()->cpuid, 0); //read_counters(myproc()->cpuid, 0);
dprintf("crange_search: 0x%lx 0x%lx\n", (u64) this, k); dprintf("crange_search: 0x%lx 0x%lx\n", (u64) this, k);
r = nullptr; r = nullptr;
p = this->crange_head; p = crange_head;
for (int l = this->nlevel-1; l >= 0; l--) { for (int l = nlevel-1; l >= 0; l--) {
for (e = p->next[l].ptr(); e; p = e, e = e->next[l].ptr()) { for (e = p->next[l].ptr(); e; p = e, e = e->next[l].ptr()) {
dprintf("level %d: 0x%lx 0x%lx-%lx(%lu) 0x%lx-0x%lx(%lu)\n", l, (u64) p, p->key, p->key+p->size, p->size, e->key, e->key+e->size, e->size); dprintf("level %d: 0x%lx 0x%lx-%lx(%lu) 0x%lx-0x%lx(%lu)\n", l, (u64) p, p->key, p->key+p->size, p->size, e->key, e->key+e->size, e->size);
// skip all marked ranges, but don't update p because // skip all marked ranges, but don't update p because
...@@ -545,7 +546,7 @@ void crange::del(u64 k, u64 sz) ...@@ -545,7 +546,7 @@ void crange::del(u64 k, u64 sz)
assert(this); assert(this);
gc_begin_epoch(); gc_begin_epoch();
dprintf("crange_del: 0x%lx 0x%lx-0x%lx(%ld)\n", (u64) this, k, k+sz, sz); dprintf("crange_del: 0x%lx 0x%lx-0x%lx(%ld)\n", (u64) this, k, k+sz, sz);
if (!this->find_and_lock(k, sz, &prev, &first, &last, &succ)) { // done? if (!find_and_lock(k, sz, &prev, &first, &last, &succ)) { // done?
dprintf("crange_del: [0x%lx,0x%lx) not present\n", k, sz); dprintf("crange_del: [0x%lx,0x%lx) not present\n", k, sz);
release(prev->lock); release(prev->lock);
goto done; goto done;
...@@ -564,8 +565,9 @@ void crange::del(u64 k, u64 sz) ...@@ -564,8 +565,9 @@ void crange::del(u64 k, u64 sz)
cprintf("crange_del(%lu, %lu): prev was updated; try again\n", k, sz); cprintf("crange_del(%lu, %lu): prev was updated; try again\n", k, sz);
assert(0); assert(0);
} }
done: done:
this->check(nullptr); check(nullptr);
// cprintf("%d: crange_del(0x%lx, 0x%lx):\n", mycpu()->id, k, sz); crange_print(cr, 1); // cprintf("%d: crange_del(0x%lx, 0x%lx):\n", mycpu()->id, k, sz); crange_print(cr, 1);
gc_end_epoch(); gc_end_epoch();
} }
...@@ -585,7 +587,7 @@ void crange::add(u64 k, u64 sz, void *v) ...@@ -585,7 +587,7 @@ void crange::add(u64 k, u64 sz, void *v)
dprintf("crange_add: 0x%lx 0x%lx-0x%lx(%lu)\n", (u64) this, k, k+sz, sz); dprintf("crange_add: 0x%lx 0x%lx-0x%lx(%lu)\n", (u64) this, k, k+sz, sz);
assert(this); assert(this);
gc_begin_epoch(); gc_begin_epoch();
if (this->find_and_lock(k, sz, &prev, &first, &last, &succ)) { if (find_and_lock(k, sz, &prev, &first, &last, &succ)) {
dprintf("crange_add(0x%lx,0x%lx) overlaps with [0x%lx,0x%lx)\n", k, sz, first->key, first->size); dprintf("crange_add(0x%lx,0x%lx) overlaps with [0x%lx,0x%lx)\n", k, sz, first->key, first->size);
repl = replace(k, sz, v, first, last, succ); repl = replace(k, sz, v, first, last, succ);
} else { } else {
...@@ -604,6 +606,6 @@ void crange::add(u64 k, u64 sz, void *v) ...@@ -604,6 +606,6 @@ void crange::add(u64 k, u64 sz, void *v)
assert(0); assert(0);
} }
// cprintf("crange_add(0x%lx,0x%lx):\n", k, sz); crange_print(cr, 1); // cprintf("crange_add(0x%lx,0x%lx):\n", k, sz); crange_print(cr, 1);
this->check(nullptr); check(nullptr);
gc_end_epoch(); gc_end_epoch();
} }
...@@ -49,11 +49,11 @@ class markptr { ...@@ -49,11 +49,11 @@ class markptr {
template<class T> template<class T>
class markptr_ptr : private markptr<T> { class markptr_ptr : private markptr<T> {
public: public:
void operator=(T *ptr) { void operator=(T *p) {
uptr p0, p1; uptr p0, p1;
do { do {
p0 = markptr<T>::_p.load(); p0 = markptr<T>::_p.load();
p1 = (p0 & 1) | (uptr) ptr; p1 = (p0 & 1) | (uptr) p;
} while (!markptr<T>::_p.compare_exchange_weak(p0, p1)); } while (!markptr<T>::_p.compare_exchange_weak(p0, p1));
} }
...@@ -67,11 +67,11 @@ class markptr_ptr : private markptr<T> { ...@@ -67,11 +67,11 @@ class markptr_ptr : private markptr<T> {
template<class T> template<class T>
class markptr_mark : public markptr<T> { class markptr_mark : public markptr<T> {
public: public:
void operator=(bool mark) { void operator=(bool m) {
uptr p0, p1; uptr p0, p1;
do { do {
p0 = markptr<T>::_p.load(); p0 = markptr<T>::_p.load();
p1 = (p0 & ~1) | !!mark; p1 = (p0 & ~1) | !!m;
} while (!markptr<T>::_p.compare_exchange_weak(p0, p1)); } while (!markptr<T>::_p.compare_exchange_weak(p0, p1));
} }
...@@ -118,13 +118,14 @@ class range_iterator { ...@@ -118,13 +118,14 @@ class range_iterator {
struct crange { struct crange {
private: private:
range *crange_head; // a crange skip list starts with a sentinel range (key 0, sz 0) range *crange_head; // a crange skip list starts with a sentinel range (key 0, sz 0)
public: public:
int nlevel; // number of levels in the crange skip list int nlevel; // number of levels in the crange skip list
crange(int nlevel); crange(int nlevel);
~crange(void); ~crange(void);
void del(u64 k, u64 sz); void del(u64 k, u64 sz);
void add(u64 k, u64 sz, void *v); void add(u64 k, u64 sz, void *v);
range* search(u64 k, u64 sz, int mod); range* search(u64 k, u64 sz, int mod = 0);
void print(int); void print(int);
void check(struct range *absent); void check(struct range *absent);
int del_index(range *p0, range **e, int l); int del_index(range *p0, range **e, int l);
......
...@@ -273,18 +273,18 @@ iget(u32 dev, u32 inum) ...@@ -273,18 +273,18 @@ iget(u32 dev, u32 inum)
u32 cur_free = icache_free[mycpu()->id].x; u32 cur_free = icache_free[mycpu()->id].x;
if (cur_free == 0) { if (cur_free == 0) {
struct inode *victim = 0; struct inode *victim = 0;
ins->enumerate([&victim](const pair<u32, u32>&, inode* ip)->bool{ ins->enumerate([&victim](const pair<u32, u32>&, inode* eip)->bool{
if (ip->ref || ip->type == T_DIR) if (eip->ref || eip->type == T_DIR)
return false; return false;
acquire(&ip->lock); acquire(&eip->lock);
if (ip->ref == 0 && ip->type != T_DIR && if (eip->ref == 0 && eip->type != T_DIR &&
!(ip->flags & (I_FREE | I_BUSYR | I_BUSYW))) { !(eip->flags & (I_FREE | I_BUSYR | I_BUSYW))) {
victim = ip; victim = eip;
return true; return true;
} }
release(&ip->lock); release(&eip->lock);
return false; return false;
}); });
if (!victim) if (!victim)
......
...@@ -39,10 +39,10 @@ void ...@@ -39,10 +39,10 @@ void
inithz(void) inithz(void)
{ {
// Setup PIT for terminal count starting from 2^16 - 1 // Setup PIT for terminal count starting from 2^16 - 1
u64 ticks = 0x000000000000FFFFull; u64 xticks = 0x000000000000FFFFull;
outb(TIMER_MODE, TIMER_SEL0 | TIMER_TCOUNT | TIMER_16BIT); outb(TIMER_MODE, TIMER_SEL0 | TIMER_TCOUNT | TIMER_16BIT);
outb(IO_TIMER1, ticks % 256); outb(IO_TIMER1, xticks % 256);
outb(IO_TIMER1, ticks / 256); outb(IO_TIMER1, xticks / 256);
// Wait until OUT bit of status byte is set // Wait until OUT bit of status byte is set
u64 s = rdtsc(); u64 s = rdtsc();
...@@ -51,5 +51,5 @@ inithz(void) ...@@ -51,5 +51,5 @@ inithz(void)
} while (!(inb(TIMER_CNTR) & 0x80)); } while (!(inb(TIMER_CNTR) & 0x80));
u64 e = rdtsc(); u64 e = rdtsc();
cpuhz = ((e-s)*10000000) / ((ticks*10000000)/TIMER_FREQ); cpuhz = ((e-s)*10000000) / ((xticks*10000000)/TIMER_FREQ);
} }
...@@ -120,7 +120,7 @@ start_timer(struct timer_thread *t, void (*func)(void), ...@@ -120,7 +120,7 @@ start_timer(struct timer_thread *t, void (*func)(void),
} }
static void static void
lwip_init(struct netif *nif, void *if_state, lwip_init(struct netif *xnif, void *if_state,
u32 init_addr, u32 init_mask, u32 init_gw) u32 init_addr, u32 init_mask, u32 init_gw)
{ {
struct ip_addr ipaddr, netmask, gateway; struct ip_addr ipaddr, netmask, gateway;
...@@ -128,14 +128,14 @@ lwip_init(struct netif *nif, void *if_state, ...@@ -128,14 +128,14 @@ lwip_init(struct netif *nif, void *if_state,
netmask.addr = init_mask; netmask.addr = init_mask;
gateway.addr = init_gw; gateway.addr = init_gw;
if (0 == netif_add(nif, &ipaddr, &netmask, &gateway, if (0 == netif_add(xnif, &ipaddr, &netmask, &gateway,
if_state, if_state,
if_init, if_init,
ip_input)) ip_input))
panic("lwip_init: error in netif_add\n"); panic("lwip_init: error in netif_add\n");
netif_set_default(nif); netif_set_default(xnif);
netif_set_up(nif); netif_set_up(xnif);
} }
static void static void
......
...@@ -338,7 +338,7 @@ vmap_lookup(struct vmap *m, uptr start, uptr len) ...@@ -338,7 +338,7 @@ vmap_lookup(struct vmap *m, uptr start, uptr len)
if(start + len < start) if(start + len < start)
panic("vmap_lookup bad len"); panic("vmap_lookup bad len");
range *r = m->cr->search(start, len, 0); range *r = m->cr->search(start, len);
if (r != 0) { if (r != 0) {
struct vma *e = (struct vma *) (r->value); struct vma *e = (struct vma *) (r->value);
if (e->va_end <= e->va_start) if (e->va_end <= e->va_start)
...@@ -429,7 +429,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len) ...@@ -429,7 +429,7 @@ vmap_remove(struct vmap *m, uptr va_start, u64 len)
{ {
acquire(&m->lock); acquire(&m->lock);
uptr va_end = va_start + len; uptr va_end = va_start + len;
struct range *r = m->cr->search(va_start, len, 0); struct range *r = m->cr->search(va_start, len);
if (r == 0) if (r == 0)
panic("no vma?"); panic("no vma?");
struct vma *e = (struct vma *) r->value; struct vma *e = (struct vma *) r->value;
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论