Received: by 2002:a05:6358:11c7:b0:104:8066:f915 with SMTP id i7csp276811rwl; Thu, 6 Apr 2023 19:06:47 -0700 (PDT) X-Google-Smtp-Source: AKy350a8pIeeQeN4Wiy07sl4KK0LrMP4CT4dcPFQjSTPt8UPP2C/8KM5I9yWaehQFLt+A9Op1TiD X-Received: by 2002:aa7:c0d0:0:b0:4fd:2127:a8bc with SMTP id j16-20020aa7c0d0000000b004fd2127a8bcmr1216631edp.29.1680833207238; Thu, 06 Apr 2023 19:06:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1680833207; cv=none; d=google.com; s=arc-20160816; b=Op8UuCM7vEAgjE7SiSFsAJJp/yJ52+2prUDO2RHnvEFR2TK8Su9CzgJRWfEUAvDMt2 Lk8Agelo5yBc+D/o5MoQ0hHW2Z8l/or2eC7eQnGbg6mXkTjxGuUkpTZ8Gw3K1VRIGKiP keyFBwQAWtJOPyrwRobqQYG4jo2a9NIncjbctPmZ7fIPXKv34ofNoUP7Hji8bG4J658r /9itLuCYqmO7K7u93sY2XT9RtJHhYJtq8cjG8kXuWqxnUEkEKCySQFpJHYxH8JLlsvry r/gd5a+O6WxbTmssvOA6WJH5NVuQxImPFNqPeNBhTXLpLHpw3YMMAZmnE7/t0La5880Z 1lHg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=QNjYz0mwAEnp5iGFtGlkbjUifhzDTS1lkAnmUE+wQDs=; b=h9b+OfDSnPg+l7NT8xpH50YaIgN7+JWJ6xk9AIFW2lhBx98HbvtPkvFhI4LO1E6Odp lgCBbvRZtrIGaTciOSt1vkKau/1v5ihsQdFsYaNmpyPD1wND75JYjz/LbTyQAgzLVqQu V8kSQpsBMOtLNkbaZWJFXID1/lUiKWf+/bGhPSx2tP3O5gWU14/66NlXDHKuz0M73Dc4 7eX006hQUGSTH+Eg/apHsQIehMXc+f3xdPaCDn81kuvsbLHSUtsQbKf8yFcQ0xL+z5nV EooV7cSVVDCkJTjkcLAVZ+Z9HJ7G7H1yA6Fl+YJLh0OCtVu6aRzwMD7UyfNJZETxDXxr mZRw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=k0Rk6Klr; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id f2-20020aa7d842000000b00501da1bc72csi2257760eds.521.2023.04.06.19.06.20; Thu, 06 Apr 2023 19:06:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=k0Rk6Klr; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240378AbjDGCFz (ORCPT + 99 others); Thu, 6 Apr 2023 22:05:55 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50950 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240256AbjDGCFc (ORCPT ); Thu, 6 Apr 2023 22:05:32 -0400 Received: from mail-vs1-xe31.google.com (mail-vs1-xe31.google.com [IPv6:2607:f8b0:4864:20::e31]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 05B4DD324; Thu, 6 Apr 2023 19:03:51 -0700 (PDT) Received: by mail-vs1-xe31.google.com with SMTP id dg15so24295925vsb.13; Thu, 06 Apr 2023 19:03:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1680832939; x=1683424939; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=QNjYz0mwAEnp5iGFtGlkbjUifhzDTS1lkAnmUE+wQDs=; b=k0Rk6Klrd+NMVlkQ0I4To0EBVYkq06tJRKyF9Q+HTZZ0mjPeotBo3paE++cFPYF74I d7YMh7vQCKZi1N9BOffWx91Z9WKlyoiq8QIJe2HB3hbBC/XT6aa52OB/+8fug6vGCi1D Nia+kmPulIYI1u+DRUOoTPbVkxzFpd10SUkVkW00sps43RMJ/0UWdKnXPLRV/OSqjmi8 gZl+aiT8xrAeqf1Vpf+QzMN9k0mRMRhaw+u6oqUurjvtM+n18w2/8gxsC1kd+w7FC2nn ZXYQqe0Qqim7CRV9MMMbxO5dOwfeUjdeIE99mgOFkjWw0tD6DM0lBb2rdCFNnUi4vm/M 3HbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1680832939; x=1683424939; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QNjYz0mwAEnp5iGFtGlkbjUifhzDTS1lkAnmUE+wQDs=; b=H9g2dANrHmsqL3PUQcRVszm1lVPbos3LcAiYt23doHI7qvn/L6BORbCk69oxUl+tib w4x7IhUbtve4/dg4bdzQSorQi/QjGKbsgtEACh6zhV+zhbA+xHiqgX5sZuM4hlu0g4+U uv+Jtb8VZuxSTTf8ccDvC15y1fNHLB0wNMi8iaGnj72hQg+YE05IdS5tLdNjKnLUaNBu sndsXD/tic39/ltFo7RXYP4/VN+xDPSnxwyA1D1V5Q6EI44rByfUe3xAj7f9pE8Vsle9 XIKXEiS6e4BnjwxrvMUA8sEgNjpTYM8GKqvzXrEvQteeu7UTxp+sV7E1u+czGoJz5SkL gdcg== X-Gm-Message-State: AAQBX9dNl0ALa9FBbg5F2tGWFe4+4p7Ec2b3dj1M0xvgo+1wMUwNSGa2 ajTtGLgSIq2vL+ZKjTXDHpVJAcp7vUIAzqLvMsI= X-Received: by 2002:a67:c190:0:b0:425:969d:3709 with SMTP id h16-20020a67c190000000b00425969d3709mr326145vsj.3.1680832939251; Thu, 06 Apr 2023 19:02:19 -0700 (PDT) MIME-Version: 1.0 References: <20230406094245.3633290-1-dhowells@redhat.com> <20230406094245.3633290-7-dhowells@redhat.com> In-Reply-To: <20230406094245.3633290-7-dhowells@redhat.com> From: Willem de Bruijn Date: Thu, 6 Apr 2023 22:01:42 -0400 Message-ID: Subject: Re: [PATCH net-next v5 06/19] tcp: Make sendmsg(MSG_SPLICE_PAGES) copy unspliceable data To: David Howells Cc: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Matthew Wilcox , Al Viro , Christoph Hellwig , Jens Axboe , Jeff Layton , Christian Brauner , Chuck Lever III , Linus Torvalds , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, David Ahern Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Apr 6, 2023 at 5:43=E2=80=AFAM David Howells = wrote: > > If sendmsg() with MSG_SPLICE_PAGES encounters a page that shouldn't be > spliced - a slab page, for instance, or one with a zero count - make > tcp_sendmsg() copy it. > > Signed-off-by: David Howells > cc: Eric Dumazet > cc: "David S. Miller" > cc: David Ahern > cc: Jakub Kicinski > cc: Paolo Abeni > cc: Jens Axboe > cc: Matthew Wilcox > cc: netdev@vger.kernel.org > --- > net/ipv4/tcp.c | 28 +++++++++++++++++++++++++--- > 1 file changed, 25 insertions(+), 3 deletions(-) > > diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c > index 510bacc7ce7b..238a8ad6527c 100644 > --- a/net/ipv4/tcp.c > +++ b/net/ipv4/tcp.c > @@ -1418,10 +1418,10 @@ int tcp_sendmsg_locked(struct sock *sk, struct ms= ghdr *msg, size_t size) > goto do_error; > copy =3D err; > } else if (zc =3D=3D 2) { > - /* Splice in data. */ > + /* Splice in data if we can; copy if we can't. */ > struct page *page =3D NULL, **pages =3D &page; > size_t off =3D 0, part; > - bool can_coalesce; > + bool can_coalesce, put =3D false; > int i =3D skb_shinfo(skb)->nr_frags; > > copy =3D iov_iter_extract_pages(&msg->msg_iter, &= pages, > @@ -1448,12 +1448,34 @@ int tcp_sendmsg_locked(struct sock *sk, struct ms= ghdr *msg, size_t size) > goto wait_for_space; > copy =3D part; > > + if (!sendpage_ok(page)) { > + const void *p =3D kmap_local_page(page); > + void *q; > + > + q =3D page_frag_memdup(NULL, p + off, cop= y, > + sk->sk_allocation, U= LONG_MAX); > + kunmap_local(p); > + if (!q) { > + iov_iter_revert(&msg->msg_iter, c= opy); > + err =3D copy ?: -ENOMEM; > + goto do_error; > + } > + page =3D virt_to_page(q); > + off =3D offset_in_page(q); > + put =3D true; > + can_coalesce =3D false; > + } > + This is almost identical in the later udp and unix implementations. Could this be a wrapper, something like page =3D sendpage_copy_if_needed(&page, &off, copy, gfp, &put)); (it seems page is never needed if it would return NULL)