On 11/4/19 12:57 PM, Jason Gunthorpe wrote:
On Mon, Nov 04, 2019 at 12:48:13PM -0800, John Hubbard wrote:
On 11/4/19 12:33 PM, Jason Gunthorpe wrote: ...
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c index 24244a2f68cc..c5a78d3e674b 100644 +++ b/drivers/infiniband/core/umem.c @@ -272,11 +272,10 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr, while (npages) { down_read(&mm->mmap_sem);
ret = get_user_pages(cur_base,
ret = pin_longterm_pages(cur_base, min_t(unsigned long, npages, PAGE_SIZE / sizeof (struct page *)),
gup_flags | FOLL_LONGTERM,
page_list, NULL);
gup_flags, page_list, NULL);
FWIW, this one should be converted to fast as well, I think we finally got rid of all the blockers for that?
I'm not aware of any blockers on the gup.c end, anyway. The only broken thing we have there is "gup remote + FOLL_LONGTERM". But we can do "gup fast + LONGTERM".
I mean the use of the mmap_sem here is finally in a way where we can just delete the mmap_sem and use _fast ie, AFAIK there is no need for the mmap_sem to be held during ib_umem_add_sg_table()
This should probably be a standalone patch however
Yes. Oh, actually I guess the patch flow should be: change to get_user_pages_fast() and remove the mmap_sem calls, as one patch. And then change to pin_longterm_pages_fast() as the next patch. Otherwise, the internal fallback from _fast to slow gup would attempt to take the mmap_sem (again) in the same thread, which is not good. :)
Or just defer the change until after this series. Either way is fine, let me know if you prefer one over the other.
The patch itself is trivial, but runtime testing to gain confidence that it's solid is much harder. Is there a stress test you would recommend for that? (I'm not promising I can quickly run it yet--my local IB setup is still nascent at best.)
thanks,