How to directly pass a dma physical address and length from SCSI upper layer to LLD without mapping the dma memory to kernel pages

Scott Long scottl at samsco.org
Wed Jun 11 13:30:59 UTC 2008


Kenneth D. Merry wrote:
> On Mon, Jun 09, 2008 at 18:18:16 +0000, Pan, Weimin wrote:
>> SCSI upper layer can pass a scatterlist to middle layer and LLD. Normally the page_link, length, and offset is set in the scatterlist. LLD will convert to dma_address from pages by itself. That means the dma physical address has to map to kernel memory space before it can be passed to LLD for data transfer. If I have a large dma memroy and it doesn't need to be touched by kernel or user mode Apps, it is a performance penalty to force to do that.
>>
>> Is there a way to directly pass a dma physical address from upper layer to LLD (like use dma_address in a scatterlist)?
>> I looked at a couple of LLD drivers and none of them handle this kind of situation.
> 
> In theory, you can pass a physical address in a CAM CCB if you set the
> CAM_DATA_PHYS flag on the CCB.
> 
> It looks like quite a few drivers in the tree support that flag, or at
> least look at it.
> 
> So take a look at whichever driver you're using, and see if it looks at
> that flag in the CCB.
> 
> Ken

Most drivers will honor CAM_DATA_PHYS by itself, but don't honor it in
conjunction with CAM_SCATTER_VALID.  CAM_SG_LIST_PHYS is only supported
by the AHC and AHD drivers (and it's not clear to me what the difference
is between the two sets of flags).

That said, modifying drivers to support physical S/G lists isn't all
that hard, and it's something that will happen more and more with the
planned changes to moving physio to unmapped physical addresses.

Scott


More information about the freebsd-scsi mailing list