From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794309817; b=HrnpkmX8M2M8DnatSEMJhho8PGqq66VISFYoXc80x6FsM/9t2vEYSwEUAQKRTCyDobpt 1k8R1dnihOdl2kb2UHhmn5TN2CXGl5FWjLjlDU25LZeW7cPKvflPM+Zk+FTdHAjYWwQ1m JZSs2lj8xu4t+TDonteR7R72YTYDdHWTvvxRx25jnR1ilkT3esLA/qZ5xyk1mw1Y1GRGt xeS3a6nVKgXQ+QkcPESGgN3RzRxb2EzSo9hsEucETYVtE+id3kcAi/XVsK5AyLocvhn61 cBxj4OGbXNUO+Zl9lvu9OA28ftl6pm0duC+y/CtS4B/+34dub4adqvBZnN+qNevnwbA== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794309817; h=DMARC-Filter:DKIM-Signature:Received:X-MC-Unique: X-Mimecast-MFC-AGG-ID:Received:DKIM-Signature:X-Google-DKIM-Signature: X-Forwarded-Encrypted:X-Gm-Message-State:X-Gm-Gg:X-Received: X-Received:Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer: In-Reply-To:References:MIME-Version:Content-Transfer-Encoding; bh=FRqMllTEOoXf38Ur+jEqpl2zFBttJn4Z0H2rz9zpLxE=; b=IlbKWJS6C0pNmbuo1WEEHvbb8SO9NCqQvEeZ855jHPxkPeK+dZ8DvgSFl2E6wFintdec 2ckjWqjTENtryq4TQsw52xe7LxsALK511TLjBRPzevmcF4jIQe7dfYKwophdt58kWiAc/ 1amgtalKqahFfzDJxxocorUOyDfzLuCchDVxUvs4cn1JYAxkT84JSoGKpeYlP+ZtaWaui /ZsiArQ2NATR76cpJ6WPaPyjVUXx1fzT9nnXDTY+ept8niT5idT8aSJ1PHeEYK9RGn2/X l8gCLR5xoV56vYarsy5ObYP3tRVKg0nXp48UgT0NcXT42KcvIx6Wk7iZoTMlA/bUJXw== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=redhat.com; spf=pass smtp.mailfrom=redhat.com; dkim=pass header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=LhDCIGFM; dkim=pass header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=google header.b=IOtlQFFT; arc=none smtp.remote-ip=170.10.133.124 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9FC9660A262D for ; Tue, 10 Nov 2026 11:23:36 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org 9FC9660A262D Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=redhat.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=LhDCIGFM; dkim=pass (2048-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=google header.b=IOtlQFFT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1794309815; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=FRqMllTEOoXf38Ur+jEqpl2zFBttJn4Z0H2rz9zpLxE=; b=LhDCIGFMiGIv/SFxU/zB0H9OlW++9EoXoa8Rfn5kXOA8O7VwkK7yPJgo5AU5ikwLcThcSA GZv6M0WVUjRuGf1IyXkCkaX6oXPxxY78KyAHdinyUIO+UaPFKb8WVdLGXhGQnzB4fVCDnG wPrJTymyWCCYpThNQRbTZd/DDj7MWwo= Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-468-T5q-7BVzOvyhd4QHlLqX-Q-1; Tue, 10 Nov 2026 06:23:33 -0500 X-MC-Unique: T5q-7BVzOvyhd4QHlLqX-Q-1 X-Mimecast-MFC-AGG-ID: T5q-7BVzOvyhd4QHlLqX-Q_1794309813 Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-536347602faso39836441cf.3 for ; Tue, 10 Nov 2026 03:23:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1794309813; x=1794914613; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=FRqMllTEOoXf38Ur+jEqpl2zFBttJn4Z0H2rz9zpLxE=; b=IOtlQFFTPRypoQpqqtWsExkTtYKYL2sQY5dTaOdOnIBNjcYlnsvdoJmhgTQO1b2QU3 NQbupWDdoIB1TdS/NiE83Szx48XQwt1qLFTvUyko+oGDQGOBMGwWC+LORGbFFdBKQrXg 8i4WFp5ytwjVO9lay0H46S3QLuHGb2wpGbs+BBoOZBYgj5J8quZoN+NNI0R04xlXuXRb nw2LK4SkTcw+JTHiwFGqJR/nl3QUBgPSCK4XnYpfBX/9spRQ0SIveS65Ra2LFrRHFKyi 7fNM/LK6KMOJqEO1eHzRg8fBJyJT+kgO7hAHix6+OH92+1BX5bgP6GF+JeOJ6djaVyOE LPWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794309813; x=1794914613; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=FRqMllTEOoXf38Ur+jEqpl2zFBttJn4Z0H2rz9zpLxE=; b=cV+vjp+HRO5fD3AolWMpzu10jeDQpJx0kal3BSNSReDjpnXzp+6jzlje//Ss8an4me xTSYCaGlwVmjsojsMZKwUE27FNcsXUecPYc36TCTh4SFBk7aOfrqYGLeE+TtTH9LlRhL xeLb3P2mQIMEpqp5pj8DRUr+kMlcPg984Y0boaLmIjQ9i3A4GnCEic8Yv4qT0SNIMldG xOgT0GRM2vo+sHHIwB5OjEnPPWQ012vG0taPNh/eNVMq/9ssmVKNMX2iucWd8gJuzf7b evBGewzk3ByfykbjAiodlWn13KY7n+P4+qqbti+6+wTuzz3cPKaa8CzVE6TdnzGgwKIE 2eEQ== X-Forwarded-Encrypted: i=1; AL+hErHOMgGytqUldkgBB4R7qCG42s+MupYRtGAfMCtjz7NGGKdkYED97+r7ST+ONmtgF19Y6EnAVS5LUVInNPo=@vger.kernel.org X-Gm-Message-State: APuU4Z8oLbjuoxtzGsdhYZIBQFifheGMX1LzwtspbZl+OVLB0OjDf2wF IqgJEjaWgnQcGibrHZGaPX5llBK81q1N0FegxL3RYIQsWzECCQ8nwLuJ/P2+MwXIl2t5DwJBwcK qDIZkvzQOe+O/sddw0tRRmIHI7rpp+uvU/8Y8iEuznJJTVADREQLtm7rr/yOM6RbuzA== X-Gm-Gg: AYBFou3LGAWmgEdjJAkPfExZIfA9E2PgI2RP/IFqJ6MFZ2R+U6ncmJ1RcDa68EwnoNQ bVmPOVJ/z4t2HSkPS4MZL62ENVeycWrkeE74VI20rXwwfu2DFFKJ+SMu4rTXFpVyUZ8bSIX8LC+ uZAJ2Ift4+PB0Oy2EvbeYsixqvwF6UrIi09q/ImdctifXxizJqnz+pvQGk4ALxeNvvZT0UQoiH1 /0p+eNAFRCkxEn/tzxmkT5k7H8eo08Ks2UQFVqnZYIdbLIqsSua93o76CeguTRStWk0WGWKNnxg lkcU3ZL8Btj3954fzQhqfEMN+HZzg5uFuJ10jJ2Fp97mIPEDNApmEqeTLElZVhKYR/fssQbGw8A DEXjZVmHcvIZb5oRcM9NJftDG8mMjLxM96km8e9EI2cygUrHQT3HOZpJFr0E+HmWCThJrHJDTVa Gx4HQ9l4ALc+DJ8WVtrv7FkgyEfJRiMkYPsUq38mNB/pmmFNnnOgnCiH8YM/TH6WQm2Is80noe/ pj1bE2Y4KKaRzaMLNAllocKM/Cv5M83uhioeaH9P6S9tyg3nwsS X-Received: by 2002:ac8:5e06:0:b0:535:a5fb:6459 with SMTP id d75a77b69052e-5552a06e5a8mr30912931cf.68.1794309813133; Tue, 10 Nov 2026 03:23:33 -0800 (PST) X-Received: by 2002:ac8:5e06:0:b0:535:a5fb:6459 with SMTP id d75a77b69052e-5552a06e5a8mr30912491cf.68.1794309812421; Tue, 10 Nov 2026 03:23:32 -0800 (PST) Received: from cluster.. (4f.55.790d.ip4.static.sl-reverse.com. [13.121.85.79]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-91ef04e7315sm18569186d6.22.2026.11.10.03.23.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Nov 2026 03:23:32 -0800 (PST) From: Alex Markuze To: "David S . Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: Simon Horman , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC PATCH net-next 3/4] net: skb_splice_from_iter(): walk ITER_BVEC segments directly Date: Tue, 10 Nov 2026 11:23:24 +0000 Message-Id: <20261110112325.3263078-4-amarkuze@redhat.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20261110112325.3263078-1-amarkuze@redhat.com> References: <20261110112325.3263078-1-amarkuze@redhat.com> X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Transfer-Encoding: 8bit ITER_BVEC already describes source pages and byte ranges. Walk its segments directly instead of extracting a temporary page array and reconstructing those ranges. Split at folio and representation boundaries, retaining page-bounded fragments on HIGHMEM. Reuse the fragment append and checksum helpers. Advance only by appended bytes, leaving a short request's remainder available for another skb. Compare a positive limit with the unsigned iterator count before assigning the bounded result to ssize_t. Other iterator types keep the page-extraction path. Signed-off-by: Alex Markuze --- net/core/skbuff.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 3a66a50513a3..189fe25293ac 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -7550,6 +7550,75 @@ static void skb_splice_csum_range(struct sk_buff *skb, struct page *page, } } +/* + * Splice from an ITER_BVEC by walking its segments: there is no page array + * to fill. Direct-mapped folio runs are split only at representation + * boundaries; CONFIG_HIGHMEM builds retain page-bounded fragments. + */ +static ssize_t skb_splice_from_bvec(struct sk_buff *skb, struct iov_iter *iter, + ssize_t maxsize, size_t frag_limit) +{ + const struct bio_vec *bv = iter->bvec; + size_t skip = iter->iov_offset; + ssize_t spliced = 0, ret = 0; + unsigned long seg; + + if (maxsize <= 0) + return 0; + maxsize = min_t(size_t, maxsize, iter->count); + for (seg = 0; seg < iter->nr_segs && maxsize > 0; seg++, skip = 0) { + size_t boff = bv[seg].bv_offset + skip; + size_t blen = min_t(size_t, bv[seg].bv_len - skip, maxsize); + + while (blen) { + struct page *page, *fpage; + struct folio *folio; + size_t foff, part; + + page = bv[seg].bv_page + (boff >> PAGE_SHIFT); + folio = page_folio(page); + if (IS_ENABLED(CONFIG_HIGHMEM)) { + fpage = page; + foff = offset_in_page(boff); + part = min_t(size_t, blen, PAGE_SIZE - foff); + } else { + struct skb_splice_frag range; + u64 pos = ((u64)folio_page_idx(folio, page) << PAGE_SHIFT) + + offset_in_page(boff); + + part = min_t(u64, blen, folio_size(folio) - pos); + range = skb_splice_frag_normalize(pos, part); + fpage = folio_page(folio, range.anchor >> PAGE_SHIFT); + foff = range.offset; + part = range.len; + } + + ret = -EIO; + if (WARN_ON_ONCE(!sendpage_ok(fpage))) + goto out; + + ret = skb_append_pagefrags(skb, fpage, foff, part, frag_limit); + if (ret < 0) + goto out; + + if (skb->ip_summed == CHECKSUM_NONE) + skb_splice_csum_range(skb, page, + offset_in_page(boff), + part, skb->len + spliced); + + boff += part; + blen -= part; + spliced += part; + maxsize -= part; + } + } + +out: + iov_iter_advance(iter, spliced); + skb_len_add(skb, spliced); + return spliced ?: ret; +} + /** * skb_splice_from_iter - Splice (or copy) pages to skbuff * @skb: The buffer to add pages to @@ -7564,6 +7633,7 @@ static void skb_splice_csum_range(struct sk_buff *skb, struct page *page, * or a tail page of that folio and holds one reference on the folio either * way. On CONFIG_HIGHMEM builds a fragment stays within one actual page * of the folio, because kmap_local_page() maps only one page. + * A bvec iterator is walked directly, without extracting a page array. * * Returns the amount of data spliced/copied or -EMSGSIZE if there's * insufficient space in the buffer to transfer anything. @@ -7579,6 +7649,9 @@ ssize_t skb_splice_from_iter(struct sk_buff *skb, struct iov_iter *iter, if (!maxsize) return 0; + if (iov_iter_is_bvec(iter)) + return skb_splice_from_bvec(skb, iter, maxsize, frag_limit); + while (iter->count > 0) { ssize_t space, nr, len; size_t off; -- 2.34.1