Subject: Re: RFC struct buf{} redesign
To: None <tech-kern@NetBSD.org>
From: Manuel Bouyer <bouyer@antioche.eu.org>
List: tech-kern
Date: 02/23/2007 19:41:19
On Fri, Feb 23, 2007 at 02:40:56PM +0100, Reinoud Zandijk wrote:
> Dear folks,
> 
> i've been fighting struct buf{} again and really the whole buf system needs 
> a spanking... its uses are so diverse and its getting such a clutter IMHO. 
> This time i was bitten by the fact that biodone() unlike physio() doesn't 
> use a workqueue and gets called from interrupt context(!)
> 
> Would it be good to inventarise the uses of struct buf and come up with a 
> more clean solution? I've seen it use for :
> 	- buffer cache, i.e. caching data
> 	- passing of data to device driver
> 	- using the B_CALL as initiator of new actions when one finishes 
> 	  (cgd f.e.)
> 	- splitting up a request using nestiobuf() (and B_CALL)
> 	- providing a vehicle to have multiple callbacks/contexts using 
> 	  nestiobuf's B_CALL
> 	- counting of pending actions
> 	- ....
> 
> I think its better to split the functions up:
> 	- buffering of metadata (also proven to work fine with UBC (see 
> 	  UDF))
> 	- passing of data to drivers (getiobuf() was initial start of this)
> 	- nested buffer for splitting up a request.

I'd also like to have requests aggregations (e.g. raidframe can issue
multiple contigous buffers, the drive would be happier with a single large
I/O than multiple smalls)

> 	- all finished bufs ought to called back on a kthread (workqueue 
> 	  like in physio())
> 	- call back queueing, a TAILQ() of functions with private data 
> 	  pointer? with an abort function to prevent further calling?
> 	- adding of pending/finished callbacks counters? (clustering of 
> 	  reads/writes)
> 	- .....

I think this would be good. The new design should also take in account
I/O to unmapped memory (it's not needed to have the buffer mapped in kernel
VM space to do a DMA transfers on behalf of a userland program). This would
probably remove the requirement that a buffer points to a contigous VM
region (when mapped), which is annoying when building buffer requests.

-- 
Manuel Bouyer <bouyer@antioche.eu.org>
     NetBSD: 26 ans d'experience feront toujours la difference
--