mirror of
https://github.com/openwrt/openwrt.git
synced 2026-06-17 12:40:16 +04:00
8f638f9366
Changelog: https://cdn.kernel.org/pub/linux/kernel/v6.x/ChangeLog-6.12.91 Remove upstreamed patches: - airoha/patches-6.12/017-v6.13-net-airoha-Implement-BQL-support.patch[1] - airoha/patches-6.12/138-v7.1-net-airoha-Add-missing-RX_CPU_IDX-configuration-in-a.patch[2] - airoha/patches-6.12/149-v7.1-net-airoha-Move-ndesc-initialization-at-end-of-airoh.patch[3] - generic/backport-6.12/940-v7.1-net-dsa-realtek-rtl8365mb-fix-mode-mask-calculation.patch[5] Manually rebased patches: - airoha/patches-6.12/048-01-v6.15-net-airoha-Move-airoha_eth-driver-in-a-dedicated-fol.patch[1] - ath79/patches-6.12/800-leds-add-reset-controller-based-driver.patch[4] - bcm27xx/patches-6.12/950-0122-bcmgenet-Better-coalescing-parameter-defaults.patch[6] We also backported four patches to fix perf tool regression: - generic/backport-6.12/216-01-revert-perf-cgroup-update-metric-leader-in-evlist__e.patch - generic/backport-6.12/216-02-revert-perf-tool_pmu-fix-aggregation-on-duration_tim.patch - generic/backport-6.12/216-03-revert-perf-python-add-parse_events-function.patch - generic/backport-6.12/216-04-revert-perf-tool_pmu-factor-tool-events-into-their-o.patch All other patches are automatically refreshed. [1] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.91&id=ca24fcac1daaa5e8a667981d81986a3eb4b9fb04 [2] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.91&id=f00037a99bc2332ef59dc85298b98b20af165904 [3] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.91&id=d36be272adda7f313e39dd118086955d993bf6a7 [4] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.91&id=07d3611389ba7d78b80ea360a42ce32ab2521fbc [5] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.91&id=3354d6c62fd4baa7b32cbd80cc5a8aa3f2bd0656 [6] https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v6.12.91&id=b84351dcc359667bc952131c1424b692ec83dce2 Signed-off-by: Shiji Yang <yangshiji66@outlook.com> Link: https://github.com/openwrt/openwrt/pull/23444 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
105 lines
3.3 KiB
Diff
105 lines
3.3 KiB
Diff
From 42fcb213e58a7da33d5d2d7517b4e521025c68c3 Mon Sep 17 00:00:00 2001
|
|
From: Qingfang Deng <dqfext@gmail.com>
|
|
Date: Thu, 29 Jan 2026 09:29:02 +0800
|
|
Subject: [PATCH] ppp: enable TX scatter-gather
|
|
|
|
PPP channels using chan->direct_xmit prepend the PPP header to a skb and
|
|
call dev_queue_xmit() directly. In this mode the skb does not need to be
|
|
linear, but the PPP netdevice currently does not advertise
|
|
scatter-gather features, causing unnecessary linearization and
|
|
preventing GSO.
|
|
|
|
Enable NETIF_F_SG and NETIF_F_FRAGLIST on PPP devices. In case a linear
|
|
buffer is required (PPP compression, multilink, and channels without
|
|
direct_xmit), call skb_linearize() explicitly.
|
|
|
|
Signed-off-by: Qingfang Deng <dqfext@gmail.com>
|
|
Link: https://patch.msgid.link/20260129012902.941-1-dqfext@gmail.com
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
---
|
|
drivers/net/ppp/ppp_generic.c | 30 +++++++++++++++++++++++++-----
|
|
1 file changed, 25 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/net/ppp/ppp_generic.c
|
|
+++ b/drivers/net/ppp/ppp_generic.c
|
|
@@ -1635,6 +1635,8 @@ static void ppp_setup(struct net_device
|
|
dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST;
|
|
dev->priv_destructor = ppp_dev_priv_destructor;
|
|
dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
|
+ dev->features = NETIF_F_SG | NETIF_F_FRAGLIST;
|
|
+ dev->hw_features = dev->features;
|
|
netif_keep_dst(dev);
|
|
}
|
|
|
|
@@ -1699,6 +1701,10 @@ pad_compress_skb(struct ppp *ppp, struct
|
|
ppp->xcomp->comp_extra + ppp->dev->hard_header_len;
|
|
int compressor_skb_size = ppp->dev->mtu +
|
|
ppp->xcomp->comp_extra + PPP_HDRLEN;
|
|
+
|
|
+ if (skb_linearize(skb))
|
|
+ return NULL;
|
|
+
|
|
new_skb = alloc_skb(new_skb_size, GFP_ATOMIC);
|
|
if (!new_skb) {
|
|
if (net_ratelimit())
|
|
@@ -1786,6 +1792,10 @@ ppp_send_frame(struct ppp *ppp, struct s
|
|
case PPP_IP:
|
|
if (!ppp->vj || (ppp->flags & SC_COMP_TCP) == 0)
|
|
break;
|
|
+
|
|
+ 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);
|
|
@@ -1883,19 +1893,26 @@ ppp_push(struct ppp *ppp)
|
|
}
|
|
|
|
if ((ppp->flags & SC_MULTILINK) == 0) {
|
|
+ struct ppp_channel *chan;
|
|
/* not doing multilink: send it down the first channel */
|
|
list = list->next;
|
|
pch = list_entry(list, struct channel, clist);
|
|
|
|
spin_lock(&pch->downl);
|
|
- if (pch->chan) {
|
|
- if (pch->chan->ops->start_xmit(pch->chan, skb))
|
|
- ppp->xmit_pending = NULL;
|
|
- } else {
|
|
- /* channel got unregistered */
|
|
+ chan = pch->chan;
|
|
+ if (unlikely(!chan || (!chan->direct_xmit && skb_linearize(skb)))) {
|
|
+ /* channel got unregistered, or it requires a linear
|
|
+ * skb but linearization failed
|
|
+ */
|
|
kfree_skb(skb);
|
|
ppp->xmit_pending = NULL;
|
|
+ goto out;
|
|
}
|
|
+
|
|
+ if (chan->ops->start_xmit(chan, skb))
|
|
+ ppp->xmit_pending = NULL;
|
|
+
|
|
+out:
|
|
spin_unlock(&pch->downl);
|
|
return;
|
|
}
|
|
@@ -1980,6 +1997,8 @@ static int ppp_mp_explode(struct ppp *pp
|
|
return 0; /* can't take now, leave it in xmit_pending */
|
|
|
|
/* Do protocol field compression */
|
|
+ if (skb_linearize(skb))
|
|
+ goto err_linearize;
|
|
p = skb->data;
|
|
len = skb->len;
|
|
if (*p == 0 && mp_protocol_compress) {
|
|
@@ -2138,6 +2157,7 @@ static int ppp_mp_explode(struct ppp *pp
|
|
|
|
noskb:
|
|
spin_unlock(&pch->downl);
|
|
+ err_linearize:
|
|
if (ppp->debug & 1)
|
|
netdev_err(ppp->dev, "PPP: no memory (fragment)\n");
|
|
++ppp->dev->stats.tx_errors;
|