[ofa-general] Re: [PATCH 1/11] IB/ipoib: high dma support

Michael S. Tsirkin mst at dev.mellanox.co.il
Tue Sep 25 11:32:43 PDT 2007


> Quoting Ralph Campbell <ralph.campbell at qlogic.com>:
> Subject: Re: [PATCH 1/11] IB/ipoib: high dma support
> 
> On Tue, 2007-09-25 at 16:41 +0200, Eli Cohen wrote:
> > On Tue, 2007-09-25 at 13:06 +0200, Or Gerlitz wrote:
> > > Eli Cohen wrote:
> > > > On Tue, 2007-09-25 at 12:22 +0200, Or Gerlitz wrote:
> > > >> Eli Cohen wrote:
> > > 
> > > >>> Add high dma support to ipoib
> > > >>> This patch assumes all IB devices support 64 bit DMA.
> > > 
> > > >> On some architectures DMA addresses are 32 bit, so I am not sure to 
> > > >> follow your comment. This capability states that the network device can 
> > > >> dma to high memory.
> > > 
> > > > I believe it means that *if* the kernel hands buffers whose addresses
> > > > exceed 32 bits then the device can handle them.
> > > 
> > > High-memory is well documents in books and elsewhere. I just want to say 
> > > that the change-log comment is confusing and unrelated.
> > > 
> > > What you want to say is that this patch assumes that for all IB devices, 
> > > ib_dma_map_single and ib_dma_map_page supports high memory, which is not 
> > > the case, see below.
> > > 
> > > Ralph?
> > > 
> > > Or.
> 
> Correct. ib_ipath doesn't support high memory and it would be
> inefficient to do so.
> 
> > > > static u64 ipath_dma_map_page(struct ib_device *dev,
> > > > 			      struct page *page,
> > > > 			      unsigned long offset,
> > > > 			      size_t size,
> > > > 			      enum dma_data_direction direction)
> > > > {
> > > > 	u64 addr;
> > > > 
> > > > 	BUG_ON(!valid_dma_direction(direction));
> > > > 
> > > > 	if (offset + size > PAGE_SIZE) {
> > > > 		addr = BAD_DMA_ADDRESS;
> > > > 		goto done;
> > > > 	}
> > > > 
> > > > 	addr = (u64) page_address(page);
> > > > 	if (addr)
> > > > 		addr += offset;
> > > > 	/* TODO: handle highmem pages */
> > > > 
> > > > done:
> > > > 	return addr;
> > > > }
> > > 
> > 
> > I got the impression that all supported IB devices support dma-ing
> > to/from memory > 4GB. Perhaps other vendors can comment.
> 
> The QLogic HCAs don't support DMA to or from the physical memory
> for the verbs Lkey/Rkey memory regions. The whole reason I added
> the ib_dma_*() functions was so to avoid ib_ipoib, etc. from
> calling dma_*() directly and passing a physical address as the
> offset in the posted work requests.
> What happens instead, is that ib_dma_*() returns a kernel virtual
> address which is passed in the work request and the driver copies
> the data to/from the HW as needed.
> So, in order to support HIGHMEM, I would need to change the
> ipath_dma_*() functions to call kmap()/kunmap() for HIGHMEM pages.
> I'm sure there would be all kinds of performance and coding issues
> around doing this.

So, we need some kind of HIGHDMA capability flag?

-- 
MST



More information about the general mailing list