[openib-general] [kernel verbs] u64 vs dma_addr_t

James Lentini jlentini at netapp.com
Fri Dec 30 15:07:52 PST 2005



sean> James Lentini wrote:
sean> > Why is the ib_sge's addr a u64 and not a dma_addr_t? 
sean> 
sean> It's the same address that the user can transfer to the remote 
sean> side. 

It can be the same address, but does it have to be?

A user can directly map local addresses to InfiniBand I/O virtual 
addresses, but I don't think it is a requirement. In other words, I 
thought that user could register address x and request an InfiniBand 
I/O virtual address of y, x != y, for the mapping.

I understand why the ib_send_wr's rdma.remote_addr needs to be a u64, 
since it ultimately winds up on the wire.

In the case of the ib_sge's addr, I didn't think these values left the 
local node. My assumption (based on looking at the mthca driver) is 
that they are supposed to contain "local" I/O addresses (bus 
addresses). Therefore, my confusion over why dma_addr_t wasn't used.

sean> Also, if inline sends are being used, the address is not 
sean> necessarily a DMA address.

Which ib_wr_opcode[s] are "inline sends"? IB_WR_SEND, 
IB_WR_SEND_WITH_IMM, ...? 

My expectation was that all of the scatter/gather data for both sends 
(of all flavors: send, rdma read, rdma write,...) and recvs would be 
DMA.

The "not necessarily" part makes me worry. How can I determine in a 
device independent way which buffer need to be DMA'able and which do 
not? Is the only safe option to assume that all do?




More information about the general mailing list