From 39d5972dbd724bf27a85987dc25e7b398fa6cce4 Mon Sep 17 00:00:00 2001 From: whatever Date: Mon, 25 Nov 2024 18:33:26 +0800 Subject: [PATCH] debugging an unknown panic --- fs.img.bk | Bin 2048000 -> 2048000 bytes gradelib.py | 2 +- kernel/bio.c | 160 +++++++++++++++++++++++++++++++++------------------ kernel/fs.c | 6 +- time.txt | 1 + 5 files changed, 111 insertions(+), 58 deletions(-) create mode 100644 time.txt diff --git a/fs.img.bk b/fs.img.bk index b97eba1216ecb8de4e8e2abfa6c0d6aac99809a3..9dc0c65b9ab255b356febc270e53ccb714af2d61 100644 GIT binary patch delta 21819 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 P1EvQ|4_r(ST<7=?3B$)b delta 3758 zcmeHIZA?>F816auUfN4ryk$fAGl6U~*N=#1BQ0*B@JBvkCM;RPq9&JrEQ<<>5tuSt zryv> zTIqo_{R>T!)pc&W6nl#5P!OgJZ4oh^q9Vm2cGzZr$dhMi>3d@9CE%;T#VAOcD)8?Z z4<9j?r5EEDVZJXPj(lbPI~;lFUNRK9fM1(EH2oG_yosw&E2y`yAEzR)CaqLa6T)3mTAzWH(4X)=}Fbxmltu08mtBlXTqN!})84scq8jofbc~+2Edr%gBw#QmZ9V%iTl?I6Xtz zY*3S>-d1Pn33`~L8jR8hXn+~JUW&=Gj^iOFfqG%Q-bwwHsmS!305v zWr`(I%*dmP_qk!^m&9b{{e0DG0&=w6{#$Xbd&@70?v2AAb#_0FTo>+S;FEegy-DB) z3V1w2U0IA{>+Cw7-p`pI?c~hs?4Jj$Caz3HKQcLs^Ex z`=ljf@8>B$u*}fXttF|5#t3J`P|9nlu`4h)< zmyT`wxa!PyuByAt&n#84`8(H+TsU}Ud+yR|Iptz`9HW4zclNE3t56EcM(D!^(lX-e zx9*i|V(15Fhd$-<&0Q?8Y@2f-pM2u0a0hZSXb?tw=`?GA*ibi%Ngsw}t((4?V2VKz z>)KzrZ|mGTZXMz$SRNDYFKhq33BBM$1{ZofKwR2b6;Q98@& z^q^Rd2%moZ9`bMFs@Myv(sqlhRHnJg3-^^vb1M7}PNfSnujl%!62|Wqu=kl~frefcnt; + if (b->refcnt == 0) { + if(pre==-2){// the head is what we are looking for + bcache.hash_head[hash_pos]=bcache.nxt[cur]; + }else{ + bcache.nxt[pre]=bcache.nxt[cur]; + } + bcache.nxt[cur]=-1; + for(int i=cpu;;i=(i+1)%NCPU){ + push_off(); + if(holding(&bcache.freelistlock[i])){ + pop_off(); + continue; + } + pop_off(); + acquire(&bcache.freelistlock[i]); + const int pos=b-bcache.buf; + // printf("%d\n",pos); + bcache.nxt[pos]=bcache.freelist_head[i]; + bcache.freelist_head[i]=pos; + + // DEBUG(); + // printf("%u\n",bcache.freelist_head); + + release(&bcache.freelistlock[i]); + break; + } + break; } - bcache.nxt[cur]=-1; - break; } pre=cur; } @@ -97,22 +124,26 @@ binit(void) struct buf *b; initlock(&bcache.lock, "bcache"); - initlock(&bcache.freelistlock, "bcache_freelist"); for(int i=0;inext = bcache.head.next; // b->prev = &bcache.head; initsleeplock(&b->lock, "buffer"); const uint cur=b-bcache.buf; - bcache.nxt[cur]=bcache.freelist_head; - bcache.freelist_head=cur; + bcache.nxt[cur]=bcache.freelist_head[which]; + bcache.freelist_head[which]=cur; + which=(which+1)%NCPU; // bcache.head.next->prev = b; // bcache.head.next = b; } @@ -125,8 +156,8 @@ static struct buf* bget(uint dev, uint blockno) { struct buf *b; - - int pos=hash_get(dev, blockno); + // acquire(&bcache.lock); + const int pos=hash_get(dev, blockno); // Is the block already cached? // for(b = bcache.head.next; b != &bcache.head; b = b->next){ // if(b->dev == dev && b->blockno == blockno){ @@ -138,39 +169,60 @@ bget(uint dev, uint blockno) // } if(pos>=0){ b=&bcache.buf[pos]; - ++b->refcnt; + const uint hash_pos=hasher(dev, blockno); + acquire(&bcache.hashlock[hash_pos]); + ++bcache.buf[pos].refcnt; + release(&bcache.hashlock[hash_pos]); acquiresleep(&b->lock); + // release(&bcache.lock); return b; } + push_off(); + const uint cpu=cpuid(); + pop_off(); // Not cached. // Recycle the least recently used (LRU) unused buffer. - acquire(&bcache.freelistlock); - // for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ - // if(b->refcnt == 0) { - // hash_add(dev, blockno, b-bcache.buf); - // b->dev = dev; - // b->blockno = blockno; - // b->valid = 0; - // b->refcnt = 1; - // release(&bcache.lock); - // acquiresleep(&b->lock); - // return b; - // } - // } - // for(uint cur=bcache.freelist_head;cur!=-1;cur=bcache.nxt[cur]) - // DEBUG(); - // printf("%u\n",bcache.freelist_head); - - b=&bcache.buf[bcache.freelist_head]; - hash_add(dev,blockno,bcache.freelist_head); - b->dev=dev; - b->blockno=blockno; - b->valid=0; - b->refcnt=1; - bcache.freelist_head=bcache.nxt[bcache.freelist_head]; - release(&bcache.freelistlock); - acquiresleep(&b->lock); - return b; + for(int i=cpu;;i=(i+1)%NCPU){ + push_off(); + if(holding(&bcache.freelistlock[i])){ + pop_off(); + continue; + } + pop_off(); + acquire(&bcache.freelistlock[i]); + if(bcache.freelist_head[i]==-1){ + release(&bcache.freelistlock[i]); + continue; + } + // DEBUG(); + // for(b = bcache.head.prev; b != &bcache.head; b = b->prev){ + // if(b->refcnt == 0) { + // hash_add(dev, blockno, b-bcache.buf); + // b->dev = dev; + // b->blockno = blockno; + // b->valid = 0; + // b->refcnt = 1; + // release(&bcache.lock); + // acquiresleep(&b->lock); + // return b; + // } + // } + // for(uint cur=bcache.freelist_head;cur!=-1;cur=bcache.nxt[cur]) + // DEBUG(); + // printf("%u\n",bcache.freelist_head); + b=&bcache.buf[bcache.freelist_head[i]]; + const int ori=bcache.freelist_head[i]; + bcache.freelist_head[i]=bcache.nxt[bcache.freelist_head[i]]; + hash_add(dev,blockno,ori); + b->dev=dev; + b->blockno=blockno; + b->valid=0; + b->refcnt=1; + release(&bcache.freelistlock[i]); + acquiresleep(&b->lock); + // release(&bcache.lock); + return b; + } panic("bget: no buffers"); } @@ -202,15 +254,15 @@ bwrite(struct buf *b) void brelse(struct buf *b) { + if(!holdingsleep(&b->lock)) panic("brelse"); releasesleep(&b->lock); // acquire(&bcache.lock); - b->refcnt--; - if (b->refcnt == 0) { - hash_del(b->dev, b->blockno); + + hash_del(b->dev, b->blockno); // no one is waiting for it. // b->next->prev = b->prev; // b->prev->next = b->next; @@ -218,16 +270,8 @@ brelse(struct buf *b) // b->prev = &bcache.head; // bcache.head.next->prev = b; // bcache.head.next = b;gi - acquire(&bcache.freelistlock); - const int pos=b-bcache.buf; - bcache.nxt[pos]=bcache.freelist_head; - bcache.freelist_head=pos; - // DEBUG(); - // printf("%u\n",bcache.freelist_head); - - release(&bcache.freelistlock); - } + // release(&bcache.lock); } @@ -235,14 +279,20 @@ brelse(struct buf *b) void bpin(struct buf *b) { // acquire(&bcache.lock); + const uint hash_pos=hasher(b->dev, b->blockno); + acquire(&bcache.hashlock[hash_pos]); b->refcnt++; + release(&bcache.hashlock[hash_pos]); // release(&bcache.lock); } void bunpin(struct buf *b) { // acquire(&bcache.lock); + const uint hash_pos=hasher(b->dev, b->blockno); + acquire(&bcache.hashlock[hash_pos]); b->refcnt--; + release(&bcache.hashlock[hash_pos]); // release(&bcache.lock); } diff --git a/kernel/fs.c b/kernel/fs.c index 6c4079e..7200462 100644 --- a/kernel/fs.c +++ b/kernel/fs.c @@ -93,12 +93,14 @@ bfree(int dev, uint b) { struct buf *bp; int bi, m; - + DEBUG(); + printf("%d %d\n",dev,b); bp = bread(dev, BBLOCK(b, sb)); bi = b % BPB; m = 1 << (bi % 8); - if((bp->data[bi/8] & m) == 0) + if((bp->data[bi/8] & m) == 0){ panic("freeing free block"); + } bp->data[bi/8] &= ~m; log_write(bp); brelse(bp); diff --git a/time.txt b/time.txt new file mode 100644 index 0000000..62f9457 --- /dev/null +++ b/time.txt @@ -0,0 +1 @@ +6 \ No newline at end of file