Messages in this thread | | | Date | Sun, 28 Aug 2022 21:59:49 -0700 | Subject | Re: [PATCH 5/6] NFS: direct-io: convert to FOLL_PIN pages | From | John Hubbard <> |
| |
On 8/27/22 17:39, Al Viro wrote: > On Sun, Aug 28, 2022 at 01:38:57AM +0100, Al Viro wrote: >> On Sat, Aug 27, 2022 at 04:55:18PM -0700, John Hubbard wrote: >>> On 8/27/22 15:48, Al Viro wrote: >>>> On Sat, Aug 27, 2022 at 01:36:06AM -0700, John Hubbard wrote: >>>>> Convert the NFS Direct IO layer to use pin_user_pages_fast() and >>>>> unpin_user_page(), instead of get_user_pages_fast() and put_page(). >>>> >>>> Again, this stuff can be hit with ITER_BVEC iterators >>>> >>>>> - result = iov_iter_get_pages_alloc2(iter, &pagevec, >>>>> + result = dio_w_iov_iter_pin_pages_alloc(iter, &pagevec, >>>>> rsize, &pgbase); >>>> >>>> and this will break on those. >>> >>> If anyone has an example handy, of a user space program that leads >>> to this situation (O_DIRECT with ITER_BVEC), it would really help >>> me reach enlightenment a lot quicker in this area. :) >> >> Er... splice(2) to O_DIRECT-opened file on e.g. ext4? Or >> sendfile(2) to the same, for that matter... > > s/ext4/nfs/ to hit this particular codepath, obviously.
OK, I have a solution to this that's pretty easy:
1) Get rid of the user_backed_iter(i) check in dio_w_iov_iter_pin_pages() and dio_w_iov_iter_pin_pages_alloc(), and
2) At the call sites, match up the unpin calls appropriately.
...and apply a similar fix for the fuse conversion patch.
However, the core block/bio conversion in patch 4 still does depend upon a key assumption, which I got from a 2019 email discussion with Christoph Hellwig and others here [1], which says:
"All pages released by bio_release_pages should come from get_get_user_pages...".
I really hope that still holds true. Otherwise this whole thing is in trouble.
[1] https://lore.kernel.org/kvm/20190724053053.GA18330@infradead.org/
thanks,
-- John Hubbard NVIDIA
| |