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