On 05/25/2009 10:50 AM, Christoph Hellwig wrote:> On Mon, May 25, 2009 at 09:46:47AM +0200, Jens Axboe wrote:>>> But that patch looks good to me, avoiding one allocation for each>>> command and simplifying the code. I try to remember why these were>>> two slabs to start with but can't find any reason.>>>

It was done for none-cache-coherent systems that need to dma into sense_buffer.

>>> Btw, we might just want to declare the sense buffer directly as a sized>>> array in the scsi command as there really doesn't seem to be a reason>>> not to allocate it.>> That is also a workable solution. I've been trying to cut down on the>> number of allocations required per-IO, and there's definitely still some>> low hanging fruit there. Some of it is already included, like the inline>> io_vecs in the bio.> > Btw, one thing I wanted to do for years is to add ->alloc_cmnd and> ->destroy_cmnd method to the host template which optionally move the> command allocation to the LLDD. That way we can embedd the scsi_cmnd> into the drivers per-commad structure and eliminate another memory> allocation.

It is nice in theory, but when trying to implement I encountered someproblems.

1. If we have a machine with few type of hosts active each with it's owncmnd_slab we end up with many more slabs then today. Even though at theend they all happen to be of the same size. (With the pool reserves itcan get big also).

2. Some considerations are system-wide and system-dependent (like above problem) and should be centralized into one place so if/when things change they can be changed in one place.2.1. Don't trust driver writers to do the right thing.

3. There are common needs that are cross drivers, and no code should be duplicated. For example Bidi-Commands, use of scsi_ptr, ISA_DMA, ... and such not.

scsi_ml has a base-two-sized set of slabs that get allocated on first use(at host registration) and hosts get to share the pools with same size.[Alternatively hosts just keep reserved-commands list and regular use gets kmalloced]

All handling is centralized, with special needs specified at host templatelike dma_mask ISA_flags and such.

> Also this would naturally extend the keep one cmnd pool> to drivers without requiring additional code. As a second step it> would also allow killing the scsi_host_cmd_pool byt just having> a set of library routines that drivers which need SLAB_CACHE_DMA can> use.>

I'm afraid this will need to be done first. Layout the new facilitiesand implement today's lowest-denominator on top of that. Then convertdriver by driver. Finally remove the old croft.

Lets all agree on a rough sketch and we can all get behind it. There area few people I know that will help, Matthew Wilcox, Me , perhaps Jensand Christoph.

This will also finally help Andi Kleen's needs with the masked allocators