.msg_name       = &rqstp->rq_addr,
                .msg_namelen    = rqstp->rq_addrlen,
                .msg_control    = cmh,
+               .msg_flags      = MSG_SPLICE_PAGES,
                .msg_controllen = sizeof(buffer),
        };
-       unsigned int sent;
+       unsigned int count;
        int err;
 
        svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
        if (svc_xprt_is_dead(xprt))
                goto out_notconn;
 
-       err = xdr_alloc_bvec(xdr, GFP_KERNEL);
-       if (err < 0)
-               goto out_unlock;
+       count = xdr_buf_to_bvec(rqstp->rq_bvec,
+                               ARRAY_SIZE(rqstp->rq_bvec), xdr);
 
-       err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
+       iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
+                     count, 0);
+       err = sock_sendmsg(svsk->sk_sock, &msg);
        if (err == -ECONNREFUSED) {
                /* ICMP error on earlier request. */
-               err = xprt_sock_sendmsg(svsk->sk_sock, &msg, xdr, 0, 0, &sent);
+               iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, rqstp->rq_bvec,
+                             count, 0);
+               err = sock_sendmsg(svsk->sk_sock, &msg);
        }
-       xdr_free_bvec(xdr);
+
        trace_svcsock_udp_send(xprt, err);
-out_unlock:
+
        mutex_unlock(&xprt->xpt_mutex);
-       if (err < 0)
-               return err;
-       return sent;
+       return err;
 
 out_notconn:
        mutex_unlock(&xprt->xpt_mutex);