static int espintcp_sendskmsg_locked(struct sock *sk,
                                     struct espintcp_msg *emsg, int flags)
 {
+       struct msghdr msghdr = { .msg_flags = flags | MSG_SPLICE_PAGES, };
        struct sk_msg *skmsg = &emsg->skmsg;
        struct scatterlist *sg;
        int done = 0;
        int ret;
 
-       flags |= MSG_SENDPAGE_NOTLAST;
+       msghdr.msg_flags |= MSG_SENDPAGE_NOTLAST;
        sg = &skmsg->sg.data[skmsg->sg.start];
        do {
+               struct bio_vec bvec;
                size_t size = sg->length - emsg->offset;
                int offset = sg->offset + emsg->offset;
                struct page *p;
                emsg->offset = 0;
 
                if (sg_is_last(sg))
-                       flags &= ~MSG_SENDPAGE_NOTLAST;
+                       msghdr.msg_flags &= ~MSG_SENDPAGE_NOTLAST;
 
                p = sg_page(sg);
 retry:
-               ret = do_tcp_sendpages(sk, p, offset, size, flags);
+               bvec_set_page(&bvec, p, size, offset);
+               iov_iter_bvec(&msghdr.msg_iter, ITER_SOURCE, &bvec, 1, size);
+               ret = tcp_sendmsg_locked(sk, &msghdr, size);
                if (ret < 0) {
                        emsg->offset = offset - sg->offset;
                        skmsg->sg.start += done;