[ Previous |
Next |
Contents |
Home |
Search ]
AIX Version 4.3 Kernel and Subsystems Technical Reference, Volume 1
buf Structure
Introduction to Kernel Buffers
For block devices, kernel buffers are used to buffer data transfers between a program and the peripheral device. These buffers are allocated in blocks of 4096 bytes. At any given time, each memory block is a member of one of two linked lists that the device driver and the kernel maintain:
Available buffer queue (avlist) |
A list of all buffers available for use. These buffers do not contain data waiting to be transferred to or from a device. |
Busy buffer queue (blist) |
A list of all buffers that contain data waiting to be transferred to or from a device. |
Each buffer has an associated buffer header called the buf structure pointing to it. Each buffer header has several parts:
- Information about the block
- Flags to show status information
- Busy list forward and backward pointers
- Available list forward and backward pointers
The device driver maintains the av_forw
and av_back
pointers (for the available blocks), while the kernel maintains the b_forw
and b_back
pointers (for the busy blocks).
buf Structure Variables for Block I/O
The buf structure, which is defined in the /usr/include/sys/buf.h file, includes the following fields:
b_flags |
Flag bits. The value of this field is constructed by logically ORing 0 or more of the following values:
B_WRITE |
This operation is a write operation. |
B_READ |
This operation is a read data operation, rather than write. |
B_DONE |
I/O on the buffer has been done, so the buffer information is more current than other versions. |
B_ERROR |
A transfer error has occurred and the transaction has aborted. |
B_BUSY |
The block is not on the free list. |
B_INFLIGHT |
This I/O request has been sent to the physical device driver for processing. |
B_AGE |
The data is not likely to be reused soon, so prefer this buffer for reuse. This flag suggests that the buffer goes at the head of the free list rather than at the end. |
B_ASYNC |
Asynchronous I/O is being performed on this block. When I/O is done, release the block. |
B_DELWRI |
The contents of this buffer still need to be written out before the buffer can be reused, even though this block may be on the free list. This is used by the write subroutine when the system expects another write to the same block to occur soon. |
B_NOHIDE |
Indicates that the data page should not be hidden during direct memory access (DMA) transfer. |
B_STALE |
The data conflicts with the data on disk because of an I/O error. |
B_MORE_DONE |
When set, indicates to the receiver of this buf structure that more structures are queued in the IODONE level. This permits device drivers to handle all completed requests before processing any new requests. |
B_SPLIT |
When set, indicates that the transfer can begin anywhere within the data buffer. |
|
b_forw |
The forward busy block pointer. |
b_back |
The backward busy block pointer. |
av_forw |
The forward pointer for a driver request queue. |
av_back |
The backward pointer for a driver request queue. |
b_iodone |
Anyone calling the strategy routine must set this field to point to their I/O done routine. This routine is called on the INTIODONE interrupt level when I/O is complete. |
b_dev |
The major and minor device number. |
b_bcount |
The byte count for the data transfer. |
b_un.b_addr |
The memory address of the data buffer. |
b_blkno |
The block number on the device. |
b_resid |
Amount of data not transferred after error. |
b_event |
Anchor for event list. |
b_xmemd |
Cross-memory descriptor. |
Related Information
The ddstrategy device driver entry point.
The write subroutine.
Device Driver Kernel Extension Overview in AIX Kernel Extensions and Device Support Programming Concepts.
Programming in the Kernel Environment Overview in AIX Kernel Extensions and Device Support Programming Concepts.
Cross Memory Kernel Services in AIX Kernel Extensions and Device Support Programming Concepts.
[ Previous |
Next |
Contents |
Home |
Search ]