[openib-general] How to support IOMMUs for ipath driver
Or Gerlitz
ogerlitz at voltaire.com
Sun Sep 17 02:57:30 PDT 2006
Ralph Campbell wrote:
> Here is my thinking so far:
>
> The driver is passed an LKEY/RKEY plus an address.
> For ib_get_dma_mr(), the address is currently from
> dma_map_single(), dma_map_page(), or dma_map_sg().
> With the ib_dma_*() routines, I can intercept these calls
> and return something instead of a bus or IOMMU address.
> I would like to return a kernel virtual address since that
> is the simplest and is what I ultimately need. This is
> trivial for dma_map_single() and trivial for low memory
> pages for dma_map_page().
>
> I think I can safely just return error for architectures
> with high memory pages since the driver really only works
> on 64-bit systems (for a variety of reasons which I won't
> go into) and those systems don't have high memory.
Again (and please go and check me), pages you need to DMA (ie move over
IB) need **not** be mapped into the kernel virtual address space and
this happens **not** only under ia32 high-memory scheme, please see my
other email for two examples (direct I/O etc)
> ib_sg_dma_address would return the page_address() of sg->page
> but wouldn't be able to rely on other fields which might be in
> the struct scatterlist.
your design seems to reply on three fields: page, offset and length, so
ib_sg_map_sg(scat) is kmap-ping whatever pages which are not mapped now
into kvirt
ib_dma_unmap_sg(scat) is kunmap-ping those pages you were mapping before
(you might need an aux data structure to keep which need kunmap)
ib_sg_dma_address(scat) is page_address(scat->page) + scat->offset
ib_sg_dma_len(scat) is scat->length
Or.
More information about the general
mailing list