From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=95.215.58.81 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1793704647; b=Dn/n0M3P2bUWsQpdtBjU3XbkaebfT0cunZr8MMyJ+jGL1BpFIspkinKRmW0nlyY84Bl/ yMim2pbER+2qhOwslNIVqTvoO151ozIR4YoJ0sTsRIEXQvwiz0ISoH6E8k+osVlDl3Gq4 p4Ltf5XaKd506yIyaeY/njQaz5OvISzLuSSPbpEuVVZQ/2GSRriLcr5DlYzFClQkXtBVx YJU0RtZVJmbCTx9jiHRDYb5aGG+xK2roPIiuZ7NeaejG3PeqWxeRHt0F9PgkbesyNnEbq j0tF93QQQF+dawzb+t4mGKVXxpEEBC24ySMSeSEAac4fS0Hyt5CtSY81LvEjT2ldCpg== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1793704647; h=DMARC-Filter:X-Envelope-To:DKIM-Signature:X-Envelope-To:Received: X-Mizu-Trace-ID:X-Migadu-Flow:From:To:Subject:Date:Message-Id: X-Mailer:MIME-Version:Content-Transfer-Encoding; bh=qJTrP+kjOqQC+fLtoQKFgh4j2LTr9sgJUcT6kjbQdzI=; b=U5ZpDBgTJEEkFo0WW9ImciScMSZ/Z6Jq17iI0iV8AeKl6oy6gFlDSHBAtKxfYtsZmaQL WFA/TPxPbtGBtkJtCVAAa+GO8KrcbK8t3jB+8OMwIW84yNfVnwhYLtOFcvrGvqgXUEbFq OqFrpQJzu3kOCZyPRQ3rJlOMtZT634Jn553ypdy5CsRH7L182krZQXbM2yQsYDJcdN+qU 11g5ltw/2ADpjtgh1xXYJ/AC+ACsLE0sh5bWvoiHry6fPbgtlLAizGu+XPhdDw6olx5wZ SQdkA2ywaH5E0lQwkQ3FaLUEJur07PVLHOW8F7Z+PQED2S2yJEnQkM+nFyEt2oRoLWQ== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass header.d=linux.dev header.i=@linux.dev header.a=rsa-sha256 header.s=key1 header.b=d3kIDosD; arc=none smtp.remote-ip=95.215.58.81 Received: from mta1.migadu.com (out-81.mta1.migadu.com [95.215.58.81]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD835606C584 for ; Tue, 3 Nov 2026 11:17:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.2 smtp.subspace.kernel.org DD835606C584 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=linux.dev header.i=@linux.dev header.a=rsa-sha256 header.s=key1 header.b=d3kIDosD X-Envelope-To: linux-kernel@vger.kernel.org DKIM-Signature: a=rsa-sha256; bh=sujENotXY12t9gdwLn9SgJTO4k95J48ndEmhzKrZbdE=; c=simple/simple; d=linux.dev; h=from:to:subject:date:message-id:mime-version:content-type; s=key1; t=1793704642; v=1; x=1794309442; b=d3kIDosDjMK0YP6UIZGbSsXibt1/Wam3Ebt5E/+pXHZbnw9ay/notpySx4SXGOgBSc+yCpdh d+YDCZkslma/tE33PBuOwqFTEYvKlJxLGJQA4D/YIH7tfeoDe6V2wV1vi4Nrq5vjS8cayTAWxHN 2agyXBRqUqrKbnaoDl9XeAQg= X-Envelope-To: linux-kernel@vger.kernel.org Received: by smtp.migadu.com with ESMTPS id 0b9e4ef34d459c9a; Tue, 03 Nov 2026 11:17:22 +0000 X-Mizu-Trace-ID: 0b9e4ef34d459c9a X-Migadu-Flow: FLOW_OUT From: Qingfang Deng To: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Asim Viladi Oglu Manizada , Eric Woudstra , Felix Fietkau , netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v4 1/2] pppoe: pass bound packets directly to generic PPP Date: Tue, 3 Nov 2026 19:17:09 +0800 Message-Id: <20261103111711.28202-1-qingfang.deng@linux.dev> X-Mailer: git-send-email 2.34.1 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 Bound PPPoE sockets pass received frames to the generic PPP layer. They currently do so through __sk_receive_skb(), which takes the socket BH lock and serializes calls to ppp_input(). The lock originally prevented ppp_input() from racing with ppp_unregister_channel(). Commit ec4215683e47 ("ppp: defer channel free to an RCU grace period to fix pppol2tp RX UAF") now keeps the generic PPP channel alive until in-flight RCU readers have completed, so bound packets can be passed directly to ppp_input() from pppoe_rcv(). The direct bound receive path also skips the socket filter check in __sk_receive_skb(). This does not affect normal pppd PPPoE operation: pppd uses the kernel PPP channel and does not attach a receive filter to a socket. Instead, it uses the generic PPP pass and active filters, installed through PPPIOCSPASS and PPPIOCSACTIVE, unaffected by this change. Set skb->dev to NULL to match __sk_receive_skb()'s other behavior. Signed-off-by: Qingfang Deng --- A local receive-path benchmark sends 1492-byte IPv4 packets through multiqueue TAP -> PPPoE -> PPP in a 16-vCPU x86-64 QEMU KVM guest. The guest runs on 16 E-cores. Senders are pinned to distinct guest CPUs. CONFIG_PARAVIRT_SPINLOCKS and CONFIG_X86_NATIVE_CPU are enabled. This synchronous TAP receive path does not use GRO. The generic PPP receive lock (ppp->rlock) is retained in both variants. Median throughput over 12 samples per cell across four boots, expressed as IP-layer Gbps: Senders Before After Change 1 19.08 19.63 +2.89% 2 31.52 33.77 +7.15% 4 53.67 63.48 +18.28% 8 39.79 51.50 +29.42% 16 49.40 61.33 +24.15% Repeating the test with a separate benchmark-only change that removes the generic PPP receive lock: Senders Before After Change 1 19.45 19.89 +2.23% 2 33.29 34.92 +4.90% 4 61.72 67.01 +8.57% 8 44.46 123.76 +178.35% 16 54.62 220.48 +303.69% Eight and sixteen senders perform worse than four whenever at least one receive lock remains. With both locks removed, throughput rises from 67.01 Gbps with four senders to 123.76 Gbps with eight and 220.48 Gbps with sixteen. A separate matched GRO-off/on test uses threaded TAP NAPI and UDP packets with a valid checksum. Senders and NAPI threads share the same 1/2/4/8/16 guest-CPU sets. UDP GRO forwarding is enabled in both modes; only rx-gro changes. Medians use the same sample and boot counts. With the generic PPP receive lock retained, in IP-layer Gbps: GRO off GRO on Senders Before After Before After 1 13.44 13.42 14.35 14.15 2 21.11 20.81 25.80 25.26 4 42.18 40.89 45.31 44.76 8 48.09 59.12 74.96 75.73 16 46.84 54.99 142.00 142.27 With the benchmark-only generic PPP receive lock removal: GRO off GRO on Senders Before After Before After 1 13.47 13.41 14.20 14.32 2 20.63 19.86 25.58 25.21 4 41.15 40.21 41.91 44.02 8 50.61 70.97 76.39 74.38 16 48.69 122.52 141.55 142.89 GRO coalesces 3.33-5.07 input packets per PPP receive skb across measured samples. Packet and byte counters account for every datagram, with zero TAP drops or PPP receive errors. The threaded-NAPI results are a separate comparison from the synchronous TAP results above. GPT Codex assisted in the benchmarks. --- v4: repost after net-next is open, and set skb->dev = NULL before input. attach a benchmark with TAP's NAPI path. v3: https://lore.kernel.org/netdev/20261030045943.2093-1-qingfang.deng@linux.dev/ --- drivers/net/ppp/pppoe.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index 67c28ac763ef..5d5187e4976b 100644 --- a/drivers/net/ppp/pppoe.c +++ b/drivers/net/ppp/pppoe.c @@ -415,6 +415,12 @@ static int pppoe_rcv(struct sk_buff *skb, struct net_device *dev, if (!po) goto drop; + skb->dev = NULL; + + if (likely(po->sk.sk_state & PPPOX_BOUND)) { + ppp_input(&po->chan, skb); + return NET_RX_SUCCESS; + } return __sk_receive_skb(&po->sk, skb, 0, 1, false); drop: -- 2.34.1