On Thu, Apr 27, 2017 at 05:03:45PM -0600, Logan Gunthorpe wrote:
On 27/04/17 04:11 PM, Jason Gunthorpe wrote:
On Thu, Apr 27, 2017 at 03:53:37PM -0600, Logan Gunthorpe wrote: Well, that is in the current form, with more users it would make sense to optimize for the single page case, eg by providing the existing call, providing a faster single-page-only variant of the copy, perhaps even one that is inlined.
Ok, does it make sense then to have an sg_copy_page_to_buffer (or some such... I'm having trouble thinking of a sane name that isn't too long). That just does k(un)map_atomic and memcpy? I could try that if it makes sense to people.
It seems the most robust: test for iomem, and jump to a slow path copy, otherwise inline the kmap and memcpy
Every place doing memcpy from sgl will need that pattern to be correct.
sg_miter will still fail when the sg contains __iomem, however I would expect that the sg_copy will work with iomem, by using the __iomem memcpy variant.
Yes, that's true. Any sg_miters that ever see iomem will need to be converted to support it. This isn't much different than the other kmap(sg_page()) users I was converting that will also fail if they see iomem. Though, I suspect an sg_miter user would be easier to convert to iomem than a random kmap user.
How? sg_miter seems like the next nightmare down this path, what is sg_miter_next supposed to do when something hits an iomem sgl?
miter.addr is supposed to be a kernel pointer that must not be __iomem..
Jason