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 CE583C7EE23 for ; Wed, 24 May 2023 12:24:29 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 658E96B0074; Wed, 24 May 2023 08:24:29 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 608DD6B0075; Wed, 24 May 2023 08:24:29 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4F84B6B0078; Wed, 24 May 2023 08:24:29 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 41F536B0074 for ; Wed, 24 May 2023 08:24:29 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 11657C012F for ; Wed, 24 May 2023 12:24:29 +0000 (UTC) X-FDA: 80825066658.12.9D8F6D5 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by imf04.hostedemail.com (Postfix) with ESMTP id 67B9940002 for ; Wed, 24 May 2023 12:24:24 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf04.hostedemail.com: domain of linyunsheng@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=linyunsheng@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684931067; a=rsa-sha256; cv=none; b=wBohqJTA5lDZ1wu1vECGt0/qDSzvbWOzleWJGPRcN4nJTN49750IyFAkIuiuZYsWq0hdIS i2yrK0Y+wVVnWBp7atLLiDNHSfi1S7BZul4olKE0pWdyciYCVDEhMpN6SLL9XWcdIwadFK iTR+8+uD2fRI6/wE4vrUKgEw0Puqq3M= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf04.hostedemail.com: domain of linyunsheng@huawei.com designates 45.249.212.188 as permitted sender) smtp.mailfrom=linyunsheng@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684931067; 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; bh=41yeYldPKCKKlARMqxndRESdbW4JZRSa7wrjY/9wAzI=; b=a6LOvt5WAHVqMwwU49msfbwumvu+k4oE7vCuXQGa7rxbht1kADIw5oTr6WjJROf/36nX3v c01ys14qT/lGveHbbndBoS2vihTQVjSyOpBtz7TkhOsxaHutHlJRiVeIpH+PBShl/StZgE ugfOCkgHGA8rIC9PLw90aekz/Ynaj/I= Received: from dggpemm500005.china.huawei.com (unknown [172.30.72.57]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4QR9Jx5wfyzLpvk; Wed, 24 May 2023 20:21:21 +0800 (CST) Received: from [10.69.30.204] (10.69.30.204) by dggpemm500005.china.huawei.com (7.185.36.74) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Wed, 24 May 2023 20:24:17 +0800 Subject: Re: [PATCH net-next v10 03/16] net: Add a function to splice pages into an skbuff for MSG_SPLICE_PAGES To: David Howells , CC: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Willem de Bruijn , David Ahern , Matthew Wilcox , Al Viro , Christoph Hellwig , Jens Axboe , Jeff Layton , Christian Brauner , Chuck Lever III , Linus Torvalds , , , References: <20230522121125.2595254-1-dhowells@redhat.com> <20230522121125.2595254-4-dhowells@redhat.com> From: Yunsheng Lin Message-ID: <82041a42-e7b0-bde3-0f70-8ad180565794@huawei.com> Date: Wed, 24 May 2023 20:24:17 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.0 MIME-Version: 1.0 In-Reply-To: <20230522121125.2595254-4-dhowells@redhat.com> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.69.30.204] X-ClientProxiedBy: dggems706-chm.china.huawei.com (10.3.19.183) To dggpemm500005.china.huawei.com (7.185.36.74) X-CFilter-Loop: Reflected X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 67B9940002 X-Stat-Signature: kj5kngsmk3ma6p8k6nz4ui36yk5rjqgy X-Rspam-User: X-HE-Tag: 1684931064-229514 X-HE-Meta: U2FsdGVkX1/g857HWnQ773Eq/QVxAXZLJuM4Ek9Bv2eWH5mTp87QSIoA+VWRiSk5+85zqGPTTCZ7NSxtZja36BFdYaEEIrCitfuB1aNX9NzlQh1CnvfkXG4h7ELq+2JAyBVLgs23QW3KBAs9b6dzTH8U/z6Jq7046zge+BPkbVABVn/A0xlcmq9oZilMhwMFmO0yomiwSOFDDP4LbAo+eIwHDiP5DYAQfbLCwxevkCNXkQu/SHc+pGtd9MfF3l/21wZLgARq90h+v9XPk+akfQWrZLWY6u8wurJiHqM5Qt82e0PGhUe5hthm9WlT46U0MvDuHbt/pxgcGeQTqv5iPx/IFMqESxJ2qTNrkMdi3SoBJr+/gMF3UHzIqVnbiS25NF/vKe/pOtvtb444nEp3hFBkEkqi7qBdhRW0Zvi3Q9GEBmXznrsWiyjkwIRXKXPkJOfFbFFa5C6GvkvyFjCFbqRY4yqqyxrjRs+PbcDNiFFbl+BmSXKb7j3KnaNc3X5YBRZfepYdKS6YQEiupsQmo/rBLPBkZgUwXRaDZklHMe1XKr+8Po5/zlDoya3brFzCs+B1NZqPrYVDBl2OdTyH7oqe9VRzo90qpjuEEuY1GiGHwOYtSqT5VxpnfVliQvhcm/SADhyypxoYL4PQZoAqeFF9SMfLi4Jel6ECAF0XNZ5UcEvl3I1ZzWmmQKMQgLZWzvWfea8WfORUSPaBEmAcqEbMQ3v1p6/Re5ggZXkckPMeQJqXbl0VI7XcPlwDn5cIOzngUKlG5x7YoapDOAnOLS2qVyOj8ib/U/vll8m+0Kdaj0e3tfzibheBOmIgIkdZuC1VHhBNruHJ75cfPB6SH6DlLDKCxtEnIyKYu1DY3dLHR9wNr0XJ9WpAkeL71HTMHNpegryMurGIZpOLa4nwUn+6QyZ1G4XwnczY9Esnpfpbqbpj2TeqSr3rwnfWxkCmaY55iQMt5an3BrhPIZ9 t7d0x2pG zFNJD4f2ad9EfzerWGWpXk6AZOWIP6qRG00RF1Jjr4r7Zn0atdQaNp2z5o54//ccFCv0Ec8udnCjULdfjOGuuf7cPWpfIlEusM7U9a+8X0W1H2AR+avu48783nGz3aKjwPdV3Om4hcifixSMy8G0t3iBXULuYwyezTFdok22khicWJErKgY/y0psuMquKjRBRl5sbzvTtpqX2trXbI42PUH/u2U99Eg3eeQtJ4Ya+Q8/2NFrJ7RNj5UYZjA1OxjeqXK8Z 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 2023/5/22 20:11, David Howells wrote: Hi, David I am not very familiar with the 'struct iov_iter' yet, just two questions below. > diff --git a/net/core/skbuff.c b/net/core/skbuff.c > index 7f53dcb26ad3..f4a5b51aed22 100644 > --- a/net/core/skbuff.c > +++ b/net/core/skbuff.c > @@ -6892,3 +6892,91 @@ nodefer: __kfree_skb(skb); > if (unlikely(kick) && !cmpxchg(&sd->defer_ipi_scheduled, 0, 1)) > smp_call_function_single_async(cpu, &sd->defer_csd); > } > + > +static void skb_splice_csum_page(struct sk_buff *skb, struct page *page, > + size_t offset, size_t len) > +{ > + const char *kaddr; > + __wsum csum; > + > + kaddr = kmap_local_page(page); > + csum = csum_partial(kaddr + offset, len, 0); > + kunmap_local(kaddr); > + skb->csum = 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 I am not seeing any copying done directly in the skb_splice_from_iter(), maybe iov_iter_extract_pages() has done copying for it? > + * insufficient space in the buffer to transfer anything. > + */ > +ssize_t skb_splice_from_iter(struct sk_buff *skb, struct iov_iter *iter, > + ssize_t maxsize, gfp_t gfp) > +{ > + size_t frag_limit = READ_ONCE(sysctl_max_skb_frags); > + struct page *pages[8], **ppages = pages; > + ssize_t spliced = 0, ret = 0; > + unsigned int i; > + > + while (iter->count > 0) { > + ssize_t space, nr; > + size_t off, len; > + > + ret = -EMSGSIZE; > + space = frag_limit - skb_shinfo(skb)->nr_frags; > + if (space < 0) > + break; > + > + /* We might be able to coalesce without increasing nr_frags */ > + nr = clamp_t(size_t, space, 1, ARRAY_SIZE(pages)); > + > + len = iov_iter_extract_pages(iter, &ppages, maxsize, nr, 0, &off); > + if (len <= 0) { > + ret = len ?: -EIO; > + break; > + } > + > + i = 0; > + do { > + struct page *page = pages[i++]; > + size_t part = min_t(size_t, PAGE_SIZE - off, len); > + > + ret = -EIO; > + if (WARN_ON_ONCE(!sendpage_ok(page))) > + goto out; > + > + ret = skb_append_pagefrags(skb, page, off, part, > + frag_limit); > + if (ret < 0) { > + iov_iter_revert(iter, len); I am not sure I understand the error handling here, doesn't 'len' indicate the remaining size of the data to be appended to skb, maybe we should revert the size of data that is already appended to skb here? Does 'spliced' need to be adjusted accordingly? > + goto out; > + } > + > + if (skb->ip_summed == CHECKSUM_NONE) > + skb_splice_csum_page(skb, page, off, part); > + > + off = 0; > + spliced += part; > + maxsize -= part; > + len -= part; > + } while (len > 0); > + > + if (maxsize <= 0) > + break; > + } > + > +out: > + skb_len_add(skb, spliced); > + return spliced ?: ret; > +} > +EXPORT_SYMBOL(skb_splice_from_iter); > > > . >