On 2019-01-29 12:32 p.m., Jason Gunthorpe wrote:
Jerome, I think it would be nice to have a helper scheme - I think the simple case would be simple remapping of PCI BAR memory, so if we could have, say something like:
static const struct vm_operations_struct my_ops { .p2p_map = p2p_ioremap_map_op, .p2p_unmap = p2p_ioremap_unmap_op, }
struct ioremap_data { [..] }
fops_mmap() { vma->private_data = &driver_priv->ioremap_data; return p2p_ioremap_device_memory(vma, exporting_device, [..]); }
This is roughly what I was expecting, except I don't see exactly what the p2p_map and p2p_unmap callbacks are for. The importing driver should see p2pdma/hmm struct pages and use the appropriate function to map them. It shouldn't be the responsibility of the exporting driver to implement the mapping. And I don't think we should have 'special' vma's for this (though we may need something to ensure we don't get mapping requests mixed with different types of pages...).
I also figured there'd be a fault version of p2p_ioremap_device_memory() for when you are mapping P2P memory and you want to assign the pages lazily. Though, this can come later when someone wants to implement that.
Logan