From: Qingfang Deng <dqfext@gmail.com>
To: Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
linux-ppp@vger.kernel.org, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org
Cc: Felix Fietkau <nbd@nbd.name>
Subject: [RFC PATCH net-next] ppp: enable TX scatter-gather
Date: Thu, 4 Sep 2025 10:13:28 +0800 [thread overview]
Message-ID: <20250904021328.24329-1-dqfext@gmail.com> (raw)
When chan->direct_xmit is true, and no compressors are in use, PPP
prepends its header to a skb, and calls dev_queue_xmit directly. In this
mode the skb does not need to be linearized.
Enable NETIF_F_SG and NETIF_F_FRAGLIST if chan->direct_xmit is true, so
the networking core can transmit non-linear skbs directly. The
compressors still require a linear buffer so call skb_linearize() before
passing skb->data to them.
This is required to support PPPoE GSO.
Signed-off-by: Qingfang Deng <dqfext@gmail.com>
---
RFC:
This depends on a pending fix:
https://lore.kernel.org/netdev/20250903100726.269839-1-dqfext@gmail.com/
There are also alternative approaches:
- set SG and FRAGLIST unconditionally, and use skb_linearize()
on !chan->direct_xmit paths.
- don't use skb_linearize(), instead fix the compressors to handle
non-linear sk_buffs.
- conditionally set SG and FRAGLIST based on whether compressors are
in use.
drivers/net/ppp/ppp_generic.c | 19 +++++++++++++++++--
1 file changed, 17 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c
index f9f0f16c41d1..3bf37871a1aa 100644
--- a/drivers/net/ppp/ppp_generic.c
+++ b/drivers/net/ppp/ppp_generic.c
@@ -1710,6 +1710,12 @@ pad_compress_skb(struct ppp *ppp, struct sk_buff *skb)
ppp->xcomp->comp_extra + ppp->dev->hard_header_len;
int compressor_skb_size = ppp->dev->mtu +
ppp->xcomp->comp_extra + PPP_HDRLEN;
+ /* Until we fix the compressor need to make sure data portion is
+ * linear.
+ */
+ if (skb_linearize(skb))
+ return NULL;
+
new_skb = alloc_skb(new_skb_size, GFP_ATOMIC);
if (!new_skb) {
if (net_ratelimit())
@@ -1797,6 +1803,12 @@ ppp_send_frame(struct ppp *ppp, struct sk_buff *skb)
case PPP_IP:
if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0)
break;
+ /* Until we fix the compressor need to make sure data portion
+ * is linear.
+ */
+ if (skb_linearize(skb))
+ goto drop;
+
/* try to do VJ TCP header compression */
new_skb = alloc_skb(skb->len + ppp->dev->hard_header_len - 2,
GFP_ATOMIC);
@@ -3516,10 +3528,13 @@ ppp_connect_channel(struct channel *pch, int unit)
ret = -ENOTCONN;
goto outl;
}
- if (pch->chan->direct_xmit)
+ if (pch->chan->direct_xmit) {
ppp->dev->priv_flags |= IFF_NO_QUEUE;
- else
+ ppp->dev->features |= NETIF_F_SG | NETIF_F_FRAGLIST;
+ } else {
ppp->dev->priv_flags &= ~IFF_NO_QUEUE;
+ ppp->dev->features &= ~(NETIF_F_SG | NETIF_F_FRAGLIST);
+ }
spin_unlock_bh(&pch->downl);
if (pch->file.hdrlen > ppp->file.hdrlen)
ppp->file.hdrlen = pch->file.hdrlen;
--
2.43.0
next reply other threads:[~2025-09-04 2:13 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-04 2:13 Qingfang Deng [this message]
2025-09-04 12:51 ` [RFC PATCH net-next] ppp: enable TX scatter-gather Andrew Lunn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250904021328.24329-1-dqfext@gmail.com \
--to=dqfext@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-ppp@vger.kernel.org \
--cc=nbd@nbd.name \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.