[Devel] [PATCH RH9 v2] fuse/kio: do not use sendpage on pages which cannot be sendpaged
Alexey Kuznetsov
kuznet at acronis.com
Wed Apr 19 14:42:05 MSK 2023
Ack
On Wed, Apr 19, 2023 at 7:17 PM Kui Liu <Kui.Liu at acronis.com> wrote:
>
> It looks like the new API iov_iter_get_pages is not safe for use
> when trying to get a page from a bvec to be sent by kernel_sendpage().
> So just revert back our own implentation where we check the page
> before making get_page(), if the page can't be sendpage, fall back
> to copy mode.
>
> Affects: #PSBM-146821, #PSBM-146846
> https://jira.vzint.dev/browse/PSBM-146821
> https://jira.vzint.dev/browse/PSBM-146846
> Signed-off-by: Liu Kui <Kui.Liu at acronis.com>
> ---
> fs/fuse/kio/pcs/pcs_sock_io.c | 26 ++++++++++++++++++++------
> 1 file changed, 20 insertions(+), 6 deletions(-)
>
> diff --git a/fs/fuse/kio/pcs/pcs_sock_io.c b/fs/fuse/kio/pcs/pcs_sock_io.c
> index 552b82ab398b..710940eafa34 100644
> --- a/fs/fuse/kio/pcs/pcs_sock_io.c
> +++ b/fs/fuse/kio/pcs/pcs_sock_io.c
> @@ -143,16 +143,30 @@ static int do_send_one_seg(struct socket *sock, struct iov_iter *it, size_t left
> }
>
> if (iov_iter_is_bvec(it)) {
> - /* Zerocopy */
> size_t offset;
> ssize_t len;
> struct page *page;
>
> - len = iov_iter_get_pages(it, &page, size, 1, &offset);
> - BUG_ON(len <= 0);
> -
> - ret = kernel_sendpage(sock, page, offset, len, flags);
> - put_page(page);
> + /* Only support single page bvec here */
> + page = it->bvec->bv_page;
> + offset = it->bvec->bv_offset + it->iov_offset;
> + len = min(size, it->bvec->bv_len - it->iov_offset);
> +
> + if (sendpage_ok(page)) {
> + /* Zero copy */
> + get_page(page);
> + ret = kernel_sendpage(sock, page, offset, len, flags);
> + put_page(page);
> + } else {
> + /* Fall back to copy mode */
> + struct msghdr msg = { .msg_flags = flags };
> + struct kvec kv;
> +
> + kv.iov_base = kmap(page) + offset;
> + kv.iov_len = len;
> + ret = kernel_sendmsg(sock, &msg, &kv, 1, size);
> + kunmap(page);
> + }
> }
>
> out:
> --
> 2.32.0 (Apple Git-132)
>
> _______________________________________________
> Devel mailing list
> Devel at openvz.org
> https://lists.openvz.org/mailman/listinfo/devel
More information about the Devel
mailing list