Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1527033 > unrolled thread
| Started by | "Deucher, Alexander" <Alexander.Deucher@amd.com> |
|---|---|
| First post | 2016-11-21 21:40 +0100 |
| Last post | 2016-11-25 09:30 +0100 |
| Articles | 8 on this page of 28 — 8 participants |
Back to article view | Back to linux.kernel
Enabling peer to peer device transactions for PCIe devices "Deucher, Alexander" <Alexander.Deucher@amd.com> - 2016-11-21 21:40 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dan Williams <dan.j.williams@intel.com> - 2016-11-22 19:20 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dan Williams <dan.j.williams@intel.com> - 2016-11-22 21:10 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dan Williams <dan.j.williams@intel.com> - 2016-11-22 21:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices Daniel Vetter <daniel@ffwll.ch> - 2016-11-22 21:40 +0100
Re: Enabling peer to peer device transactions for PCIe devices Daniel Vetter <daniel@ffwll.ch> - 2016-11-22 22:20 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dan Williams <dan.j.williams@intel.com> - 2016-11-22 22:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices "Sagalovitch, Serguei" <Serguei.Sagalovitch@amd.com> - 2016-11-22 23:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices Daniel Vetter <daniel@ffwll.ch> - 2016-11-23 08:50 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dave Hansen <dave.hansen@linux.intel.com> - 2016-11-23 18:10 +0100
Re: Enabling peer to peer device transactions for PCIe devices Logan Gunthorpe <logang@deltatee.com> - 2016-11-23 18:20 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dan Williams <dan.j.williams@intel.com> - 2016-11-23 19:50 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-23 20:20 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-23 20:10 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-23 20:40 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-23 21:40 +0100
Re: Enabling peer to peer device transactions for PCIe devices Logan Gunthorpe <logang@deltatee.com> - 2016-11-23 22:20 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-23 23:40 +0100
Re: Enabling peer to peer device transactions for PCIe devices Dan Williams <dan.j.williams@intel.com> - 2016-11-23 23:50 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-24 00:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-24 17:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices Logan Gunthorpe <logang@deltatee.com> - 2016-11-24 19:00 +0100
Re: Enabling peer to peer device transactions for PCIe devices "Sagalovitch, Serguei" <Serguei.Sagalovitch@amd.com> - 2016-11-24 01:50 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-24 17:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices Logan Gunthorpe <logang@deltatee.com> - 2016-11-24 02:30 +0100
Re: Enabling peer to peer device transactions for PCIe devices Jason Gunthorpe <jgunthorpe@obsidianresearch.com> - 2016-11-24 17:50 +0100
Re: Enabling peer to peer device transactions for PCIe devices Logan Gunthorpe <logang@deltatee.com> - 2016-11-24 19:20 +0100
Re: Enabling peer to peer device transactions for PCIe devices Christoph Hellwig <hch@infradead.org> - 2016-11-25 09:30 +0100
Page 2 of 2 — ← Prev page 1 [2]
| From | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> |
|---|---|
| Date | 2016-11-24 17:30 +0100 |
| Message-ID | <sH54l-5b9-11@gated-at.bofh.it> |
| In reply to | #1528864 |
On Thu, Nov 24, 2016 at 10:45:18AM +0100, Christian König wrote: > Am 24.11.2016 um 00:25 schrieb Jason Gunthorpe: > >There is certainly nothing about the hardware that cares > >about ZONE_DEVICE vs System memory. > Well that is clearly not so simple. When your ZONE_DEVICE pages describe a > PCI BAR and another PCI device initiates a DMA to this address the DMA > subsystem must be able to check if the interconnection really works. I said the hardware doesn't care.. You are right, we still have an outstanding problem in Linux of how to generically DMA map a P2P address - which is a different issue from getting the P2P address from a __user pointer... Jason
[toc] | [prev] | [next] | [standalone]
| From | Logan Gunthorpe <logang@deltatee.com> |
|---|---|
| Date | 2016-11-24 19:00 +0100 |
| Message-ID | <sH6ts-5UY-11@gated-at.bofh.it> |
| In reply to | #1528864 |
Hey, On 24/11/16 02:45 AM, Christian König wrote: > E.g. it can happen that PCI device A exports it's BAR using ZONE_DEVICE. > Not PCI device B (a SATA device) can directly read/write to it because > it is on the same bus segment, but PCI device C (a network card for > example) can't because it is on a different bus segment and the bridge > can't handle P2P transactions. Yeah, that could be an issue but in our experience we have yet to see it. We've tested with two separate PCI buses on different CPUs connected through QPI links and it works fine. (It is rather slow but I understand Intel has improved the bottleneck in newer CPUs than the ones we tested.) It may just be older hardware that has this issue. I expect that as long as a failed transfer can be handled gracefully by the initiator I don't see a need to predetermine whether a device can see another devices memory. Logan
[toc] | [prev] | [next] | [standalone]
| From | "Sagalovitch, Serguei" <Serguei.Sagalovitch@amd.com> |
|---|---|
| Date | 2016-11-24 01:50 +0100 |
| Message-ID | <sGQoF-3CM-9@gated-at.bofh.it> |
| In reply to | #1528812 |
On Wed, Nov 23, 2016 at 02:11:29PM -0700, Logan Gunthorpe wrote: > Perhaps I am not following what Serguei is asking for, but I > understood the desire was for a complex GPU allocator that could > migrate pages between GPU and CPU memory under control of the GPU > driver, among other things. The desire is for DMA to continue to work > even after these migrations happen. The main issue is to how to solve use cases when p2p is requested/initiated via CPU pointers where such pointers could point to non-system memory location e.g. VRAM. It will allow to provide consistent working model for user to deal only with pointers (HSA, CUDA, OpenCL 2.0 SVM) as well as provide performance optimization avoiding double-buffering and extra special code when dealing with PCIe device memory. Examples are: - RDMA Network operations. RDMA MRs where registered memory could be e.g. VRAM. Currently it is solved using so called PeerDirect interface which is currently out-of-tree and provided as part of OFED. - File operations (fread/fwrite) when user wants to transfer file data directly to/from e.g. VRAM Challenges are: - Because graphics sub-system must support overcomit (at least each application/process should independently see all resources) ideally such memory should be movable without changing CPU pointer value as well as "paged-out" supporting "page fault" at least on access from CPU. - We must co-exist with existing DRM infrastructure, as well as support sharing VRAM memory between different processes - We should be able to deal with large allocations: tens, hundreds of MBs or may be GBs. - We may have PCIe devices where p2p may not work - Potentially any GPU memory should be supported including memory carved out from system RAM (e.g. allocated via get_free_pages()). Note: - In the case of RDMA MRs life-span of "pinning" (get_user_pages"/put_page) may be defined/controlled by application not kernel which may be should treated differently as special case. Original proposal was to create "struct pages" for VRAM memory to allow "get_user_pages" to work transparently similar how it is/was done for "DAX Device" case. Unfortunately based on my understanding "DAX Device" implementation deal only with permanently "locked" memory (fixed location) unrelated to "get_user_pages"/"put_page" scope which doesn't satisfy requirements for "eviction" / "moving" of memory keeping CPU address intact. > The desire is for DMA to continue to work > even after these migrations happen At least some kind of mm notifier callback to inform about changing in location (pre- and post-) similar how it is done for system pages. My understanding is that It will not solve RDMA MR issue where "lock" could be during the whole application life but (a) it will not make RDMA MR case worse (b) should be enough for all other cases for "get_user_pages"/"put_page" controlled by kernel.
[toc] | [prev] | [next] | [standalone]
| From | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> |
|---|---|
| Date | 2016-11-24 17:30 +0100 |
| Message-ID | <sH54m-5b9-39@gated-at.bofh.it> |
| In reply to | #1528892 |
On Thu, Nov 24, 2016 at 12:40:37AM +0000, Sagalovitch, Serguei wrote:
> On Wed, Nov 23, 2016 at 02:11:29PM -0700, Logan Gunthorpe wrote:
>
> > Perhaps I am not following what Serguei is asking for, but I
> > understood the desire was for a complex GPU allocator that could
> > migrate pages between GPU and CPU memory under control of the GPU
> > driver, among other things. The desire is for DMA to continue to work
> > even after these migrations happen.
>
> The main issue is to how to solve use cases when p2p is
> requested/initiated via CPU pointers where such pointers could
> point to non-system memory location e.g. VRAM.
Okay, but your list is conflating a whole bunch of problems..
1) How to go from a __user pointer to a p2p DMA address
a) How to validate, setup iommu and maybe worst case bounce buffer
these p2p DMAs
2) How to allow drivers (ie GPU allocator) dynamically
remap pages in a VMA to/from p2p DMA addresses
3) How to expose uncachable p2p DMA address to user space via mmap
> to allow "get_user_pages" to work transparently similar
> how it is/was done for "DAX Device" case. Unfortunately
> based on my understanding "DAX Device" implementation
> deal only with permanently "locked" memory (fixed location)
> unrelated to "get_user_pages"/"put_page" scope
> which doesn't satisfy requirements for "eviction" / "moving" of
> memory keeping CPU address intact.
Hurm, isn't that issue with DAX only to do with being coherent with
the page cache?
A GPU allocator would not use the page cache, it would have to
construct VMAs some other way.
> My understanding is that It will not solve RDMA MR issue where "lock"
> could be during the whole application life but (a) it will not make
> RDMA MR case worse (b) should be enough for all other cases for
> "get_user_pages"/"put_page" controlled by kernel.
Right. There is no solution to the RDMA MR issue on old hardware. Apps
that are using GPU+RDMA+Old hardware will have to use short lived MRs
and pay that performance cost, or give up on migration.
Jason
[toc] | [prev] | [next] | [standalone]
| From | Logan Gunthorpe <logang@deltatee.com> |
|---|---|
| Date | 2016-11-24 02:30 +0100 |
| Message-ID | <sGR1o-44N-13@gated-at.bofh.it> |
| In reply to | #1528812 |
On 23/11/16 02:55 PM, Jason Gunthorpe wrote: >>> Only ODP hardware allows changing the DMA address on the fly, and it >>> works at the page table level. We do not need special handling for >>> RDMA. >> >> I am aware of ODP but, noted by others, it doesn't provide a general >> solution to the points above. > > How do you mean? I was only saying it wasn't general in that it wouldn't work for IB hardware that doesn't support ODP or other hardware that doesn't do similar things (like an NVMe drive). It makes sense for hardware that supports ODP to allow MRs to not pin the underlying memory and provide for migrations that the hardware can follow. But most DMA engines will require the memory to be pinned and any complex allocators (GPU or otherwise) should respect that. And that seems like it should be the default way most of this works -- and I think it wouldn't actually take too much effort to make it all work now as is. (Our iopmem work is actually quite small and simple.) >> It's also worth noting that #4 makes use of ZONE_DEVICE (#2) so they are >> really the same option. iopmem is really just one way to get BAR >> addresses to user-space while inside the kernel it's ZONE_DEVICE. > > Seems fine for RDMA? Yeah, we've had RDMA and O_DIRECT transfers to PCIe backed ZONE_DEVICE memory working for some time. I'd say it's a good fit. The main question we've had is how to expose PCIe bars to userspace to be used as MRs and such. Logan
[toc] | [prev] | [next] | [standalone]
| From | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> |
|---|---|
| Date | 2016-11-24 17:50 +0100 |
| Message-ID | <sH5nH-5hZ-7@gated-at.bofh.it> |
| In reply to | #1528919 |
On Wed, Nov 23, 2016 at 06:25:21PM -0700, Logan Gunthorpe wrote: > > > On 23/11/16 02:55 PM, Jason Gunthorpe wrote: > >>> Only ODP hardware allows changing the DMA address on the fly, and it > >>> works at the page table level. We do not need special handling for > >>> RDMA. > >> > >> I am aware of ODP but, noted by others, it doesn't provide a general > >> solution to the points above. > > > > How do you mean? > > I was only saying it wasn't general in that it wouldn't work for IB > hardware that doesn't support ODP or other hardware that doesn't do > similar things (like an NVMe drive). There are three cases to worry about: - Coherent long lived page table mirroring (RDMA ODP MR) - Non-coherent long lived page table mirroring (RDMA MR) - Short lived DMA mapping (everything else) Like you say below we have to handle short lived in the usual way, and that covers basically every device except IB MRs, including the command queue on a NVMe drive. > any complex allocators (GPU or otherwise) should respect that. And that > seems like it should be the default way most of this works -- and I > think it wouldn't actually take too much effort to make it all work now > as is. (Our iopmem work is actually quite small and simple.) Yes, absolutely, some kind of page pinning like locking is a hard requirement. > Yeah, we've had RDMA and O_DIRECT transfers to PCIe backed ZONE_DEVICE > memory working for some time. I'd say it's a good fit. The main question > we've had is how to expose PCIe bars to userspace to be used as MRs and > such. Is there any progress on that? I still don't quite get what iopmem was about.. I thought the objection to uncachable ZONE_DEVICE & DAX made sense, so running DAX over iopmem and still ending up with uncacheable mmaps still seems like a non-starter to me... Serguei, what is your plan in GPU land for migration? Ie if I have a CPU mapped page and the GPU moves it to VRAM, it becomes non-cachable - do you still allow the CPU to access it? Or do you swap it back to cachable memory if the CPU touches it? One approach might be to mmap the uncachable ZONE_DEVICE memory and mark it inaccessible to the CPU - DMA could still translate. If the CPU needs it then the kernel migrates it to system memory so it becomes cachable. ?? Jason
[toc] | [prev] | [next] | [standalone]
| From | Logan Gunthorpe <logang@deltatee.com> |
|---|---|
| Date | 2016-11-24 19:20 +0100 |
| Message-ID | <sH6MN-6kz-9@gated-at.bofh.it> |
| In reply to | #1529564 |
On 24/11/16 09:42 AM, Jason Gunthorpe wrote: > There are three cases to worry about: > - Coherent long lived page table mirroring (RDMA ODP MR) > - Non-coherent long lived page table mirroring (RDMA MR) > - Short lived DMA mapping (everything else) > > Like you say below we have to handle short lived in the usual way, and > that covers basically every device except IB MRs, including the > command queue on a NVMe drive. Yes, this makes sense to me. Though I thought regular IB MRs with regular memory currently pinned the pages (despite being long lived) that's why we can run up against the "max locked memory" limit. It doesn't seem so terrible if GPU memory had a similar restriction until ODP like solutions get implemented. >> Yeah, we've had RDMA and O_DIRECT transfers to PCIe backed ZONE_DEVICE >> memory working for some time. I'd say it's a good fit. The main question >> we've had is how to expose PCIe bars to userspace to be used as MRs and >> such. > Is there any progress on that? Well, I guess there's some consensus building to do. The existing options are: * Device DAX: which could work but the problem I see with it is that it only allows one application to do these transfers. Or there would have to be some user-space coordination to figure which application gets what memeroy. * Regular DAX in the FS doesn't work at this time because the FS can move the file you think your transfer to out from under you. Though I understand there's been some work with XFS to solve that issue. Though, we've been considering that the backed memory would be non-volatile which adds some of this complexity. If the memory were volatile the kernel would just need to do some relatively straight forward allocation to user-space when asked. For example, with NVMe, the kernel could give chunks of the CMB buffer to userspace via an mmap call to /dev/nvmeX. Though I think there's been some push back against things like that as well. > I still don't quite get what iopmem was about.. I thought the > objection to uncachable ZONE_DEVICE & DAX made sense, so running DAX > over iopmem and still ending up with uncacheable mmaps still seems > like a non-starter to me... The latest incarnation of iopmem simply created a block device backed by ZONE_DEVICE memory on a PCIe BAR. We then put a DAX FS on it and user-space could mmap the files and send them to other devices to do P2P transfers. I don't think there was a hard objection to uncachable ZONE_DEVICE and DAX. We did try our experimental hardware with cached ZONE_DEVICE and it did work but the performance was beyond unusable (which may be a hardware issue). In the end I feel the driver would have to decide the most appropriate caching for the hardware and I don't understand why WC or UC wouldn't work with ZONE_DEVICE. Logan
[toc] | [prev] | [next] | [standalone]
| From | Christoph Hellwig <hch@infradead.org> |
|---|---|
| Date | 2016-11-25 09:30 +0100 |
| Message-ID | <sHk3n-6BP-11@gated-at.bofh.it> |
| In reply to | #1529602 |
On Thu, Nov 24, 2016 at 11:11:34AM -0700, Logan Gunthorpe wrote: > * Regular DAX in the FS doesn't work at this time because the FS can > move the file you think your transfer to out from under you. Though I > understand there's been some work with XFS to solve that issue. The file system will never move anything under locked down pages, locking down pages is used exactly to protect against that. So as long as we page structures available RDMA to/from device memory _from kernel space_ is trivial, although for file systems to work properly you really want a notification to the consumer if the file systems wants to remove the mapping. We have implemented that using FL_LAYOUTS locks for NFSD, but only XFS supports it so far. Without that a long term locked down region of memory (e.g. a kernel MR) would prevent various file operations that would simply hang.
[toc] | [prev] | [standalone]
Page 2 of 2 — ← Prev page 1 [2]
Back to top | Article view | linux.kernel
csiph-web