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

fix bug (using kmalloc instead of new)

add debug information (string type) for rcu data structures
上级 4e6609e5
......@@ -106,7 +106,7 @@ bget(u32 dev, u64 sector, int *writer)
destroylock(&victim->lock);
gc_delayed(victim);
b = (buf*) kmalloc(sizeof(*b));
b = new buf();
b->dev = dev;
b->sector = sector;
b->flags = B_BUSY;
......@@ -172,7 +172,7 @@ initbio(void)
bufns = new xns<pair<u32, u64>, buf*, bio_hash>(false);
for (u64 i = 0; i < NBUF; i++) {
struct buf *b = (buf*) kmalloc(sizeof(*b));
struct buf *b = new buf();
b->dev = 0xdeadbeef;
b->sector = -i; /* dummy to pre-allocate NBUF spaces for evict */
b->flags = 0;
......
......@@ -11,6 +11,9 @@ struct buf : public rcu_freed {
struct condvar cv;
struct spinlock lock;
u8 data[512];
buf() : rcu_freed("buf") {}
virtual ~buf() {}
};
#define B_BUSY 0x1 // buffer is locked by some process
#define B_VALID 0x2 // buffer has been read from disk
......
......@@ -126,7 +126,7 @@ class range_delayed : public rcu_freed {
struct range *_e;
public:
range_delayed(range *e) : _e(e) {}
range_delayed(range *e) : rcu_freed("range_delayed"), _e(e) {}
virtual ~range_delayed() {
range_free(_e);
}
......
......@@ -221,6 +221,7 @@ iupdate(struct inode *ip)
// Though unlocked, all fields will be present,
// so looking a ip->inum and ip->gen are OK even w/o lock.
inode::inode()
: rcu_freed("inode")
{
dir = 0;
}
......@@ -483,7 +484,7 @@ class diskblock : public rcu_freed {
u64 _block;
public:
diskblock(int dev, u64 block) : _dev(dev), _block(block) {}
diskblock(int dev, u64 block) : rcu_freed("diskblock"), _dev(dev), _block(block) {}
virtual ~diskblock() {
bfree(_dev, _block);
}
......
......@@ -63,9 +63,7 @@ gc_free_tofreelist(rcu_freed **head, u64 epoch)
assert(0);
}
nr = r->_rcu_next;
cprintf("about to delete %p\n", r);
delete r;
cprintf("delete done\n");
nfree++;
}
*head = r;
......
#pragma once
#define RCU_TYPE_DEBUG 1
class rcu_freed {
public:
u64 _rcu_epoch;
rcu_freed *_rcu_next;
#if RCU_TYPE_DEBUG
const char *_rcu_type;
#endif
rcu_freed(const char *debug_type)
#if RCU_TYPE_DEBUG
: _rcu_type(debug_type)
#endif
{}
virtual ~rcu_freed() {}
} __mpalign__;
......@@ -25,7 +25,7 @@ class xelem : public rcu_freed {
xelem<K, V> * volatile next;
K key;
xelem(const K &k, const V &v) : val(v), next_lock(0), next(0), key(k) {}
xelem(const K &k, const V &v) : rcu_freed("xelem"), val(v), next_lock(0), next(0), key(k) {}
virtual ~xelem() {}
};
......@@ -42,7 +42,7 @@ class xns : public rcu_freed {
xbucket<K, V> table[NHASH];
public:
xns(bool dup) {
xns(bool dup) : rcu_freed("xns") {
allowdup = dup;
nextkey = 1;
for (int i = 0; i < NHASH; i++)
......
......@@ -184,7 +184,7 @@ class delayedfree : public rcu_freed {
proc *_p;
public:
delayedfree(proc *p) : _p(p) {}
delayedfree(proc *p) : rcu_freed("delayed proc free"), _p(p) {}
virtual ~delayedfree() {
kmfree(_p);
}
......
......@@ -54,7 +54,7 @@ class vma_delayed : public rcu_freed {
vma *_e;
public:
vma_delayed(vma *e) : _e(e) {}
vma_delayed(vma *e) : rcu_freed("vma_delayed"), _e(e) {}
virtual ~vma_delayed() {
vma_free(_e);
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论