On Wed, Nov 04, 2020 at 09:42:41AM -0400, Jason Gunthorpe wrote: > On Wed, Nov 04, 2020 at 10:50:49AM +0100, Christoph Hellwig wrote: > > > +int ib_dma_virt_map_sg(struct ib_device *dev, struct scatterlist *sg, int nents) > > +{ > > + struct scatterlist *s; > > + int i; > > + > > + for_each_sg(sg, s, nents, i) { > > + sg_dma_address(s) = (uintptr_t)sg_virt(s); > > + sg_dma_len(s) = s->length; > > Hmm.. There is nothing ensuring the page is mapped here for this > sg_virt(). Before maybe some of the kconfig stuff prevented highmem > systems indirectly, I wonder if we should add something more direct to > exclude highmem for these drivers? I had actually noticed this earlier as well and then completely forgot about it.. rdmavt depends on X86_64, so it can't be used with highmem, but for rxe and siw there weren't any such dependencies so I think we were just lucky. Let me send a fix to add explicit depencies and then respin this series on top of that.. > Sigh. I think the proper fix is to replace addr/length with a > scatterlist pointer in the struct ib_sge, then have SW drivers > directly use the page pointer properly. The proper fix is to move the DMA mapping into the RDMA core, yes. And as you said it will be hard. But I don't think scatterlists are the right interface. IMHO we can keep re-use the existing struct ib_sge: struct ib_ge { u64 addr; u32 length; u32 lkey; }; with the difference that if lkey is not a MR, addr is the physical address of the memory, not a dma_addr_t or virtual address.