Moved header definitions to buf.h, and added missing splx() - found

by Johannes Helander.
This commit is contained in:
David Greenman 1994-05-26 08:45:29 +00:00
parent 29e950a20d
commit 594110fe18
3 changed files with 79 additions and 51 deletions

View File

@ -31,37 +31,13 @@
#include <miscfs/specfs/specdev.h>
struct buf *buf; /* the buffer pool itself */
int nbuf; /* number of buffer headers */
int bufpages; /* number of memory pages in the buffer pool */
struct buf *swbuf; /* swap I/O headers */
int nswbuf;
#define BUFHSZ 512
int bufhash = BUFHSZ - 1;
struct buf *buf; /* buffer header pool */
int nbuf; /* number of buffer headers calculated elsewhere */
struct buf *getnewbuf(int,int);
extern vm_map_t buffer_map, io_map;
void vm_hold_free_pages(vm_offset_t from, vm_offset_t to);
void vm_hold_load_pages(vm_offset_t from, vm_offset_t to);
/*
* Definitions for the buffer hash lists.
*/
#define BUFHASH(dvp, lbn) \
(&bufhashtbl[((int)(dvp) / sizeof(*(dvp)) + (int)(lbn)) & bufhash])
/*
* Definitions for the buffer free lists.
*/
#define BQUEUES 5 /* number of free buffer queues */
LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash;
TAILQ_HEAD(bqueues, buf) bufqueues[BQUEUES];
#define BQ_NONE 0 /* on no queue */
#define BQ_LOCKED 1 /* locked buffers */
#define BQ_LRU 2 /* useful buffers */
#define BQ_AGE 3 /* less useful buffers */
#define BQ_EMPTY 4 /* empty buffer headers*/
int needsbuffer;
@ -87,7 +63,7 @@ void bufinit()
LIST_INIT(&bufhashtbl[i]);
/* next, make a null set of free lists */
for(i=0;i<BQUEUES;i++)
for(i=0;i<BUFFER_QUEUES;i++)
TAILQ_INIT(&bufqueues[i]);
/* finally, initialize each buffer header and stick on empty q */
@ -99,10 +75,10 @@ void bufinit()
bp->b_vp = NULL;
bp->b_rcred = NOCRED;
bp->b_wcred = NOCRED;
bp->b_qindex = BQ_EMPTY;
bp->b_qindex = QUEUE_EMPTY;
bp->b_vnbufs.le_next = NOLIST;
bp->b_data = (caddr_t)kmem_alloc_pageable(buffer_map, MAXBSIZE);
TAILQ_INSERT_TAIL(&bufqueues[BQ_EMPTY], bp, b_freelist);
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_EMPTY], bp, b_freelist);
LIST_INSERT_HEAD(&invalhash, bp, b_hash);
}
}
@ -114,9 +90,9 @@ void
bremfree(struct buf *bp)
{
int s = splbio();
if( bp->b_qindex != BQ_NONE) {
if( bp->b_qindex != QUEUE_NONE) {
TAILQ_REMOVE(&bufqueues[bp->b_qindex], bp, b_freelist);
bp->b_qindex = BQ_NONE;
bp->b_qindex = QUEUE_NONE;
} else {
panic("bremfree: removing a buffer when not on a queue");
}
@ -339,35 +315,35 @@ brelse(struct buf *bp)
brelvp(bp);
}
if( bp->b_qindex != BQ_NONE)
if( bp->b_qindex != QUEUE_NONE)
panic("brelse: free buffer onto another queue???");
/* enqueue */
/* buffers with junk contents */
if(bp->b_bufsize == 0) {
bp->b_qindex = BQ_EMPTY;
TAILQ_INSERT_HEAD(&bufqueues[BQ_EMPTY], bp, b_freelist);
bp->b_qindex = QUEUE_EMPTY;
TAILQ_INSERT_HEAD(&bufqueues[QUEUE_EMPTY], bp, b_freelist);
LIST_REMOVE(bp, b_hash);
LIST_INSERT_HEAD(&invalhash, bp, b_hash);
bp->b_dev = NODEV;
} else if(bp->b_flags & (B_ERROR|B_INVAL|B_NOCACHE)) {
bp->b_qindex = BQ_AGE;
TAILQ_INSERT_HEAD(&bufqueues[BQ_AGE], bp, b_freelist);
bp->b_qindex = QUEUE_AGE;
TAILQ_INSERT_HEAD(&bufqueues[QUEUE_AGE], bp, b_freelist);
LIST_REMOVE(bp, b_hash);
LIST_INSERT_HEAD(&invalhash, bp, b_hash);
bp->b_dev = NODEV;
/* buffers that are locked */
} else if(bp->b_flags & B_LOCKED) {
bp->b_qindex = BQ_LOCKED;
TAILQ_INSERT_TAIL(&bufqueues[BQ_LOCKED], bp, b_freelist);
bp->b_qindex = QUEUE_LOCKED;
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_LOCKED], bp, b_freelist);
/* buffers with stale but valid contents */
} else if(bp->b_flags & B_AGE) {
bp->b_qindex = BQ_AGE;
TAILQ_INSERT_TAIL(&bufqueues[BQ_AGE], bp, b_freelist);
bp->b_qindex = QUEUE_AGE;
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_AGE], bp, b_freelist);
/* buffers with valid and quite potentially reuseable contents */
} else {
bp->b_qindex = BQ_LRU;
TAILQ_INSERT_TAIL(&bufqueues[BQ_LRU], bp, b_freelist);
bp->b_qindex = QUEUE_LRU;
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_LRU], bp, b_freelist);
}
/* unlock */
@ -389,20 +365,20 @@ getnewbuf(int slpflag, int slptimeo)
x = splbio();
start:
/* can we constitute a new buffer? */
if (bp = bufqueues[BQ_EMPTY].tqh_first) {
if( bp->b_qindex != BQ_EMPTY)
if (bp = bufqueues[QUEUE_EMPTY].tqh_first) {
if( bp->b_qindex != QUEUE_EMPTY)
panic("getnewbuf: inconsistent EMPTY queue");
bremfree(bp);
goto fillbuf;
}
tryfree:
if (bp = bufqueues[BQ_AGE].tqh_first) {
if( bp->b_qindex != BQ_AGE)
if (bp = bufqueues[QUEUE_AGE].tqh_first) {
if( bp->b_qindex != QUEUE_AGE)
panic("getnewbuf: inconsistent AGE queue");
bremfree(bp);
} else if (bp = bufqueues[BQ_LRU].tqh_first) {
if( bp->b_qindex != BQ_LRU)
} else if (bp = bufqueues[QUEUE_LRU].tqh_first) {
if( bp->b_qindex != QUEUE_LRU)
panic("getnewbuf: inconsistent LRU queue");
bremfree(bp);
} else {
@ -470,8 +446,10 @@ incore(struct vnode *vp, daddr_t blkno)
}
/* hit */
if (bp->b_lblkno == blkno && bp->b_vp == vp
&& (bp->b_flags & B_INVAL) == 0)
&& (bp->b_flags & B_INVAL) == 0) {
splx(s);
return (bp);
}
bp = bp->b_hash.le_next;
}
splx(s);
@ -654,7 +632,7 @@ count_lock_queue()
struct buf *bp;
count = 0;
for(bp = bufqueues[BQ_LOCKED].tqh_first;
for(bp = bufqueues[QUEUE_LOCKED].tqh_first;
bp != NULL;
bp = bp->b_freelist.tqe_next)
count++;

View File

@ -139,6 +139,31 @@ struct cluster_save {
struct buf **bs_children; /* List of associated buffers. */
};
/*
* number of buffer hash entries
*/
#define BUFHSZ 512
/*
* buffer hash table calculation, originally by David Greenman
*/
#define BUFHASH(vnp, bn) \
(&bufhashtbl[(((int)(vnp) / sizeof(struct vnode))+(int)(bn)) % BUFHSZ])
/*
* Definitions for the buffer free lists.
*/
#define BUFFER_QUEUES 5 /* number of free buffer queues */
LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash;
TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES];
#define QUEUE_NONE 0 /* on no queue */
#define QUEUE_LOCKED 1 /* locked buffers */
#define QUEUE_LRU 2 /* useful buffers */
#define QUEUE_AGE 3 /* less useful buffers */
#define QUEUE_EMPTY 4 /* empty buffer headers*/
/*
* Zero out the buffer's data area.
*/

View File

@ -139,6 +139,31 @@ struct cluster_save {
struct buf **bs_children; /* List of associated buffers. */
};
/*
* number of buffer hash entries
*/
#define BUFHSZ 512
/*
* buffer hash table calculation, originally by David Greenman
*/
#define BUFHASH(vnp, bn) \
(&bufhashtbl[(((int)(vnp) / sizeof(struct vnode))+(int)(bn)) % BUFHSZ])
/*
* Definitions for the buffer free lists.
*/
#define BUFFER_QUEUES 5 /* number of free buffer queues */
LIST_HEAD(bufhashhdr, buf) bufhashtbl[BUFHSZ], invalhash;
TAILQ_HEAD(bqueues, buf) bufqueues[BUFFER_QUEUES];
#define QUEUE_NONE 0 /* on no queue */
#define QUEUE_LOCKED 1 /* locked buffers */
#define QUEUE_LRU 2 /* useful buffers */
#define QUEUE_AGE 3 /* less useful buffers */
#define QUEUE_EMPTY 4 /* empty buffer headers*/
/*
* Zero out the buffer's data area.
*/