From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C5C7C7EE22 for ; Thu, 18 May 2023 08:28:41 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 766F7900005; Thu, 18 May 2023 04:28:40 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7175E900003; Thu, 18 May 2023 04:28:40 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5DE8C900005; Thu, 18 May 2023 04:28:40 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 4F5A5900003 for ; Thu, 18 May 2023 04:28:40 -0400 (EDT) Received: from smtpin24.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 24EE9160728 for ; Thu, 18 May 2023 08:28:40 +0000 (UTC) X-FDA: 80802699600.24.61BCBEA Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf27.hostedemail.com (Postfix) with ESMTP id AE1574000E for ; Thu, 18 May 2023 08:28:37 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=SHjzWPP3; spf=pass (imf27.hostedemail.com: domain of pabeni@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=pabeni@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684398518; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=8ctpnOKwVIsTQhjwn5POPrwullrriRVANcGOvRdf7F0=; b=cx4ppMn3i0kuTXCtKS2cn+10c8inwDVsCh6UoeBLxf9UeelXr7X6aqBJbthBh7pc0kA2gW Ey1MZG4yaozDwcZ5fEHljeYlgDH4WiQ1Bzpl9KTvRIpmKcsQ33rgjX2yqXamUj4fHYEn+s AOAmVUXnd3NZ/o2AT4w9vjyXmnYop5E= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=SHjzWPP3; spf=pass (imf27.hostedemail.com: domain of pabeni@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=pabeni@redhat.com; dmarc=pass (policy=none) header.from=redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684398518; a=rsa-sha256; cv=none; b=ggsyMeOZKCwBnIxeFnNX9wwkLA+UhtIhCU5sDMzXe0FviMFAT4MuYxl0q9c5ZMl/a8pfYd EBK5mLlXR/+iBbSZTbZRBJ3in6kZ61FmsktrnWfmqGSaq1NR1xXGwCdGGf5ttvIU7iRrKe lRt7DUQwkgYYkNsgcp6jqFC0YRYW8ok= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684398516; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8ctpnOKwVIsTQhjwn5POPrwullrriRVANcGOvRdf7F0=; b=SHjzWPP3j4uOK7vEmNv2X02h/wHmxqgLQinkBeXs4R7kcTlH1PjY5Hyu72CBDmUSWnBxNO qH232haTA7I0rYso4457+gyf+XCpsfwTyLJ5qN6Mcb4QZNl4+t7aPPQ9GRnkC3Fd8IJQAt Uuw68xv3W+fF76FJaHHCTFvmkXfEruA= Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-83-XswWLRv3Pm6y-HJsrJjG5g-1; Thu, 18 May 2023 04:28:35 -0400 X-MC-Unique: XswWLRv3Pm6y-HJsrJjG5g-1 Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-61b6f717b6eso3471126d6.0 for ; Thu, 18 May 2023 01:28:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684398515; x=1686990515; h=mime-version:user-agent:content-transfer-encoding:references :in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=bqtU7SQwnuw72dTPSwE1Q8pNrbFhJ19RSEhkS8/CzT8=; b=KovkrlvPaGF6rr+ZXk4GI1uo4QE6yAGfQukRfFqWaoOGvBpCwu67BvnKFdjh8fEM89 dddh8fcDGBZmnfRf4Aah89bj4KHQZRxDWHwOOQyoh913SN850tnDgv5WdDLC/Onmvyaw Z0t1YG4uB/qQAVZ+t4m3NnLpmNlIXasLl0P7oD3H6j5A71CucrJ0Cjk3nMESIZMjWOmJ 3CBPCDu7u5yIU4jRi7+RDQU1+TGjUV+BITJLtM5mBMDWeI3KX5Yj0FfcPOXZ3leZhBiU ULO2akQUDsbNg2uYnhLEYctseZzTtSo+by7OjMouICe0KAicBFQkkpANh46vTYBHe183 /3EA== X-Gm-Message-State: AC+VfDya1rY9NDiMmdkNgjvSgAA5a2eHeqt3I6Y+n8JxF8C7K6UNZYiT uZthEuNbH6uxfEWMugT6CA5MOKs24HlpeNyHGPYetAoW7yGjXpPR3/iARjBcYBKmLvELCNHpSa5 J7cdCD7o5OrA= X-Received: by 2002:a05:6214:21a7:b0:616:73d9:b9d8 with SMTP id t7-20020a05621421a700b0061673d9b9d8mr9888004qvc.3.1684398515072; Thu, 18 May 2023 01:28:35 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ4uoh/r8B0Y63q2ufOzk7VFo95ja2zRNQIl1td7uCrceMoGYszLi1mmADmoo/pqk3JFZdLWYQ== X-Received: by 2002:a05:6214:21a7:b0:616:73d9:b9d8 with SMTP id t7-20020a05621421a700b0061673d9b9d8mr9887975qvc.3.1684398514775; Thu, 18 May 2023 01:28:34 -0700 (PDT) Received: from gerbillo.redhat.com (146-241-239-175.dyn.eolo.it. [146.241.239.175]) by smtp.gmail.com with ESMTPSA id h5-20020a05620a10a500b0073b878e3f30sm254636qkk.59.2023.05.18.01.28.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 18 May 2023 01:28:34 -0700 (PDT) Message-ID: <93aba6cc363e94a6efe433b3c77ec1b6b54f2919.camel@redhat.com> Subject: Re: [PATCH net-next v7 03/16] net: Add a function to splice pages into an skbuff for MSG_SPLICE_PAGES From: Paolo Abeni To: David Howells , netdev@vger.kernel.org Cc: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Willem de Bruijn , David Ahern , 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 Date: Thu, 18 May 2023 10:28:29 +0200 In-Reply-To: <20230515093345.396978-4-dhowells@redhat.com> References: <20230515093345.396978-1-dhowells@redhat.com> <20230515093345.396978-4-dhowells@redhat.com> User-Agent: Evolution 3.46.4 (3.46.4-1.fc37) MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: AE1574000E X-Stat-Signature: wu8ztihs8zwix5349kydd59kq7j14z8b X-HE-Tag: 1684398517-16457 X-HE-Meta: U2FsdGVkX18NJMfPkHypZHsCzKe1H4l/xXgOuwqw1SsJZqSoGcR3p11Jk4seMis8yR4EApJo0HcVY2ECB0IGdoeG3f4/fwlou6MP7uovjLNQug5iy+bfvZWeW5zU4RLwHZjVdSN+Y7UVHwWlUoAv8qm6Kv/pkZq7QIiQ5MO5LLNcNObJY8YeRF1d7MuJdPbW53pJAPffc0jlVhOhAQX3lQjk+3LgIlvvCfaDkYbrffYf69gQimXd+F5ABCAa3fYpwNuLrwKt+F2dgpFB6GbWK3qRzrmpTfiZNzS32pwPCdP3LeGTiYFrRNqJutKgDSTuRLb7R/4rST3BITvET6miUTQpHTT3v3VMji4P5j9EH6MajqGDnriE/G2A11XtodJEMc0XOyA2EnOrp91g795e2aLLiSs0pxB1Levt6cCJ4Gh7YAynYsdVrTunfAuVs65sSOupa1sjc0gAVtSeHrTSRpS/SdeEVP7B8nw89pJmm+6e9gfrjG/dFj+tVkgB2S4mMLvbZ51EVzlZqk+a89ot5ewnGxh+BHTnglw8ZWiFZqdr4Uuf01QylO3QG8rNhsTHSoQWAalUpw50n4YPI30nXgXv7S1stnTHwi6eGs+wmhSGldo39idwUln7H6faTNxqjyPAnkMJtnTdxfxbIk20h+CAmuFs84ZLdFR8j811LTPrP9hCFiCveLb+r7JInLQdrY9P15oJClEQMSH5Sgm0TV3vhHFlN3NMrkCTPrhBWkj8sGnCCnQNoiMQoNK39zlTFmez5/1WVt29kTKc0rd+/RXCX8kQa2+OPrXwpCNU0KRQz5SAXesnWrefBZ69OWv/qzkpzAB4R8B+JTwFAGig43uT4oaKNUTctT5u6vTd57zniG9iUCDIeVs0vMYfz372KWyObOosfkt8Deo05z3OdVIEV204ST7Y+bHsZuk+it+DoHUH8fyXDuLlV5Uba8B/Iy+PUWBIMAN+Y/e8rDo KirXMNMu nOsZWecTES9xGpTvo02GFRdAA2PeMKIc4O1WNtiSc7bNBYR+o3pZxmjYjJ+JdzKefwS7nE0IxAw/zG0E9fMExwBfjvIGR/g/fwq3YisghhA5BkM52Jh1Hfh3PXqYhYyJsdIwXjLuBZwBbFHbvaVNrtwIeZI2fWt7OS6+NJ2whnaTcRbgxUONBp5kM7C7Ans3T5afDxVsBE2InrYpyrxkQxGryVCVgpagseylKzWQw0C3MYY+tOZPCD6n4XhnJwaMcAWUF5jzhHjaZILPbyL6+QHmOmlH3/yCWLBk6c6oIo3FkYNH64BB8oB011tUSp4/aHNkEs1+RErVdjAKecVDDG1XkraWq/kH1okYCUFFFaJF3KTsS8lLgdMEzn5QyXLtD614WCTHAHOkrwF7Gs5rtDIUwjimf4xE2cCWnwIIvG4qcbMWQKvbuSHDLmBk2O7A2kBA4EGsu42dUwbeklhBRbKSPmar5TyAZ1DOWYq5SSvZVX/SQtjx03EbtixsAP56nUIt7d1qdLbQ1l8I52dbr0J3ez/wrc1U/ICj5TtUmBhSlQoQ4W3UVV+FP3HMDXZau0C2JZ6p5w0+zcYZ723NlT69MvcwZ8s4yEKMapIE63sc7C13wIE0FSetyCPDy3Ei0bP5C/WfRS/+VxI+F7QDRt3erKayp3IRr9UkQVgEnPFymB+HkUe2rSxnaAydRcJAvUplNDbIV9uQB7aUWKXmz0Vb7fveXYaZX2tVigUXdOgTc/qFuSup+OA8mg5IGxdOJl9m+x9bB/0Tj6DY= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Mon, 2023-05-15 at 10:33 +0100, David Howells wrote: > Add a function to handle MSG_SPLICE_PAGES being passed internally to > sendmsg(). Pages are spliced into the given socket buffer if possible an= d > copied in if not (e.g. they're slab pages or have a zero refcount). >=20 > Signed-off-by: David Howells > cc: Eric Dumazet > cc: "David S. Miller" > cc: David Ahern > cc: Jakub Kicinski > cc: Paolo Abeni > cc: Al Viro > cc: Jens Axboe > cc: Matthew Wilcox > cc: netdev@vger.kernel.org > --- >=20 > Notes: > ver #7) > - Export function. > - Never copy data, return -EIO if sendpage_ok() returns false. >=20 > include/linux/skbuff.h | 3 ++ > net/core/skbuff.c | 95 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 98 insertions(+) >=20 > diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h > index 4c0ad48e38ca..1c5f0ac6f8c3 100644 > --- a/include/linux/skbuff.h > +++ b/include/linux/skbuff.h > @@ -5097,5 +5097,8 @@ static inline void skb_mark_for_recycle(struct sk_b= uff *skb) > #endif > } > =20 > +ssize_t skb_splice_from_iter(struct sk_buff *skb, struct iov_iter *iter, > +=09=09=09 ssize_t maxsize, gfp_t gfp); > + > #endif=09/* __KERNEL__ */ > #endif=09/* _LINUX_SKBUFF_H */ > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > index 7f53dcb26ad3..56d629ea2f3d 100644 > --- a/net/core/skbuff.c > +++ b/net/core/skbuff.c > @@ -6892,3 +6892,98 @@ nodefer:=09__kfree_skb(skb); > =09if (unlikely(kick) && !cmpxchg(&sd->defer_ipi_scheduled, 0, 1)) > =09=09smp_call_function_single_async(cpu, &sd->defer_csd); > } > + > +static void skb_splice_csum_page(struct sk_buff *skb, struct page *page, > +=09=09=09=09 size_t offset, size_t len) > +{ > +=09const char *kaddr; > +=09__wsum csum; > + > +=09kaddr =3D kmap_local_page(page); > +=09csum =3D csum_partial(kaddr + offset, len, 0); > +=09kunmap_local(kaddr); > +=09skb->csum =3D csum_block_add(skb->csum, csum, skb->len); > +} > + > +/** > + * skb_splice_from_iter - Splice (or copy) pages to skbuff > + * @skb: The buffer to add pages to > + * @iter: Iterator representing the pages to be added > + * @maxsize: Maximum amount of pages to be added > + * @gfp: Allocation flags > + * > + * This is a common helper function for supporting MSG_SPLICE_PAGES. It > + * extracts pages from an iterator and adds them to the socket buffer if > + * possible, copying them to fragments if not possible (such as if they'= re slab > + * pages). > + * > + * Returns the amount of data spliced/copied or -EMSGSIZE if there's > + * insufficient space in the buffer to transfer anything. > + */ > +ssize_t skb_splice_from_iter(struct sk_buff *skb, struct iov_iter *iter, > +=09=09=09 ssize_t maxsize, gfp_t gfp) > +{ > +=09struct page *pages[8], **ppages =3D pages; > +=09unsigned int i; > +=09ssize_t spliced =3D 0, ret =3D 0; > +=09size_t frag_limit =3D READ_ONCE(sysctl_max_skb_frags); Minor nit: please respect the reverse x-mas tree order (there are a few other occurrences around) > + > +=09while (iter->count > 0) { > +=09=09ssize_t space, nr; > +=09=09size_t off, len; > + > +=09=09ret =3D -EMSGSIZE; > +=09=09space =3D frag_limit - skb_shinfo(skb)->nr_frags; > +=09=09if (space < 0) > +=09=09=09break; > + > +=09=09/* We might be able to coalesce without increasing nr_frags */ > +=09=09nr =3D clamp_t(size_t, space, 1, ARRAY_SIZE(pages)); > + > +=09=09len =3D iov_iter_extract_pages(iter, &ppages, maxsize, nr, 0, &off= ); > +=09=09if (len <=3D 0) { > +=09=09=09ret =3D len ?: -EIO; > +=09=09=09break; > +=09=09} > + > +=09=09if (space =3D=3D 0 && > +=09=09 !skb_can_coalesce(skb, skb_shinfo(skb)->nr_frags, > +=09=09=09=09 pages[0], off)) { > +=09=09=09iov_iter_revert(iter, len); > +=09=09=09break; > +=09=09} It looks like the above condition/checks duplicate what the later skb_append_pagefrags() will perform below. I guess the above chunk could be removed? > + > +=09=09i =3D 0; > +=09=09do { > +=09=09=09struct page *page =3D pages[i++]; > +=09=09=09size_t part =3D min_t(size_t, PAGE_SIZE - off, len); > + > +=09=09=09ret =3D -EIO; > +=09=09=09if (!sendpage_ok(page)) > +=09=09=09=09goto out; My (limited) understanding is that the current sendpage code assumes that the caller provides/uses pages suitable for such use. The existing sendpage_ok() check is in place as way to try to catch possible code bug - via the WARN_ONCE(). I think the same could be done here? Thanks! Paolo > + > +=09=09=09ret =3D skb_append_pagefrags(skb, page, off, part, > +=09=09=09=09=09=09 frag_limit); > +=09=09=09if (ret < 0) { > +=09=09=09=09iov_iter_revert(iter, len); > +=09=09=09=09goto out; > +=09=09=09} > + > +=09=09=09if (skb->ip_summed =3D=3D CHECKSUM_NONE) > +=09=09=09=09skb_splice_csum_page(skb, page, off, part); > + > +=09=09=09off =3D 0; > +=09=09=09spliced +=3D part; > +=09=09=09maxsize -=3D part; > +=09=09=09len -=3D part; > +=09=09} while (len > 0); > + > +=09=09if (maxsize <=3D 0) > +=09=09=09break; > +=09} > + > +out: > +=09skb_len_add(skb, spliced); > +=09return spliced ?: ret; > +} > +EXPORT_SYMBOL(skb_splice_from_iter); >=20