]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.4
authorSasha Levin <sashal@kernel.org>
Sat, 1 Mar 2025 14:19:57 +0000 (09:19 -0500)
committerSasha Levin <sashal@kernel.org>
Sat, 1 Mar 2025 14:19:57 +0000 (09:19 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-5.4/asoc-es8328-fix-route-from-dac-to-output.patch [new file with mode: 0644]
queue-5.4/ipvs-always-clear-ipvs_property-flag-in-skb_scrub_pa.patch [new file with mode: 0644]
queue-5.4/net-cadence-macb-synchronize-stats-calculations.patch [new file with mode: 0644]
queue-5.4/net-loopback-avoid-sending-ip-packets-without-an-eth.patch [new file with mode: 0644]
queue-5.4/net-mvpp2-cls-fixed-non-ip-flow-with-vlan-tag-flow-d.patch [new file with mode: 0644]
queue-5.4/series

diff --git a/queue-5.4/asoc-es8328-fix-route-from-dac-to-output.patch b/queue-5.4/asoc-es8328-fix-route-from-dac-to-output.patch
new file mode 100644 (file)
index 0000000..d0f8e81
--- /dev/null
@@ -0,0 +1,110 @@
+From ccaf35e1943c72bd4466e5c46ff5331aefa8f83a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Feb 2025 20:39:57 +0100
+Subject: ASoC: es8328: fix route from DAC to output
+
+From: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
+
+[ Upstream commit 5b0c02f9b8acf2a791e531bbc09acae2d51f4f9b ]
+
+The ES8328 codec driver, which is also used for the ES8388 chip that
+appears to have an identical register map, claims that the output can
+either take the route from DAC->Mixer->Output or through DAC->Output
+directly. To the best of what I could find, this is not true, and
+creates problems.
+
+Without DACCONTROL17 bit index 7 set for the left channel, as well as
+DACCONTROL20 bit index 7 set for the right channel, I cannot get any
+analog audio out on Left Out 2 and Right Out 2 respectively, despite the
+DAPM routes claiming that this should be possible. Furthermore, the same
+is the case for Left Out 1 and Right Out 1, showing that those two don't
+have a direct route from DAC to output bypassing the mixer either.
+
+Those control bits toggle whether the DACs are fed (stale bread?) into
+their respective mixers. If one "unmutes" the mixer controls in
+alsamixer, then sure, the audio output works, but if it doesn't work
+without the mixer being fed the DAC input then evidently it's not a
+direct output from the DAC.
+
+ES8328/ES8388 are seemingly not alone in this. ES8323, which uses a
+separate driver for what appears to be a very similar register map,
+simply flips those two bits on in its probe function, and then pretends
+there is no power management whatsoever for the individual controls.
+Fair enough.
+
+My theory as to why nobody has noticed this up to this point is that
+everyone just assumes it's their fault when they had to unmute an
+additional control in ALSA.
+
+Fix this in the es8328 driver by removing the erroneous direct route,
+then get rid of the playback switch controls and have those bits tied to
+the mixer's widget instead, which until now had no register to play
+with.
+
+Fixes: 567e4f98922c ("ASoC: add es8328 codec driver")
+Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
+Link: https://patch.msgid.link/20250222-es8328-route-bludgeoning-v1-1-99bfb7fb22d9@collabora.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/es8328.c | 15 ++++-----------
+ 1 file changed, 4 insertions(+), 11 deletions(-)
+
+diff --git a/sound/soc/codecs/es8328.c b/sound/soc/codecs/es8328.c
+index 4117ab6e9b6ff..83ffdb7e51200 100644
+--- a/sound/soc/codecs/es8328.c
++++ b/sound/soc/codecs/es8328.c
+@@ -234,7 +234,6 @@ static const struct snd_kcontrol_new es8328_right_line_controls =
+ /* Left Mixer */
+ static const struct snd_kcontrol_new es8328_left_mixer_controls[] = {
+-      SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL17, 7, 1, 0),
+       SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL17, 6, 1, 0),
+       SOC_DAPM_SINGLE("Right Playback Switch", ES8328_DACCONTROL18, 7, 1, 0),
+       SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL18, 6, 1, 0),
+@@ -244,7 +243,6 @@ static const struct snd_kcontrol_new es8328_left_mixer_controls[] = {
+ static const struct snd_kcontrol_new es8328_right_mixer_controls[] = {
+       SOC_DAPM_SINGLE("Left Playback Switch", ES8328_DACCONTROL19, 7, 1, 0),
+       SOC_DAPM_SINGLE("Left Bypass Switch", ES8328_DACCONTROL19, 6, 1, 0),
+-      SOC_DAPM_SINGLE("Playback Switch", ES8328_DACCONTROL20, 7, 1, 0),
+       SOC_DAPM_SINGLE("Right Bypass Switch", ES8328_DACCONTROL20, 6, 1, 0),
+ };
+@@ -337,10 +335,10 @@ static const struct snd_soc_dapm_widget es8328_dapm_widgets[] = {
+       SND_SOC_DAPM_DAC("Left DAC", "Left Playback", ES8328_DACPOWER,
+                       ES8328_DACPOWER_LDAC_OFF, 1),
+-      SND_SOC_DAPM_MIXER("Left Mixer", SND_SOC_NOPM, 0, 0,
++      SND_SOC_DAPM_MIXER("Left Mixer", ES8328_DACCONTROL17, 7, 0,
+               &es8328_left_mixer_controls[0],
+               ARRAY_SIZE(es8328_left_mixer_controls)),
+-      SND_SOC_DAPM_MIXER("Right Mixer", SND_SOC_NOPM, 0, 0,
++      SND_SOC_DAPM_MIXER("Right Mixer", ES8328_DACCONTROL20, 7, 0,
+               &es8328_right_mixer_controls[0],
+               ARRAY_SIZE(es8328_right_mixer_controls)),
+@@ -419,19 +417,14 @@ static const struct snd_soc_dapm_route es8328_dapm_routes[] = {
+       { "Right Line Mux", "PGA", "Right PGA Mux" },
+       { "Right Line Mux", "Differential", "Differential Mux" },
+-      { "Left Out 1", NULL, "Left DAC" },
+-      { "Right Out 1", NULL, "Right DAC" },
+-      { "Left Out 2", NULL, "Left DAC" },
+-      { "Right Out 2", NULL, "Right DAC" },
+-
+-      { "Left Mixer", "Playback Switch", "Left DAC" },
++      { "Left Mixer", NULL, "Left DAC" },
+       { "Left Mixer", "Left Bypass Switch", "Left Line Mux" },
+       { "Left Mixer", "Right Playback Switch", "Right DAC" },
+       { "Left Mixer", "Right Bypass Switch", "Right Line Mux" },
+       { "Right Mixer", "Left Playback Switch", "Left DAC" },
+       { "Right Mixer", "Left Bypass Switch", "Left Line Mux" },
+-      { "Right Mixer", "Playback Switch", "Right DAC" },
++      { "Right Mixer", NULL, "Right DAC" },
+       { "Right Mixer", "Right Bypass Switch", "Right Line Mux" },
+       { "DAC DIG", NULL, "DAC STM" },
+-- 
+2.39.5
+
diff --git a/queue-5.4/ipvs-always-clear-ipvs_property-flag-in-skb_scrub_pa.patch b/queue-5.4/ipvs-always-clear-ipvs_property-flag-in-skb_scrub_pa.patch
new file mode 100644 (file)
index 0000000..11fe110
--- /dev/null
@@ -0,0 +1,51 @@
+From 6ddd5c99abf31c585d35cea8f4546f1b358ca10b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Feb 2025 11:35:18 +0800
+Subject: ipvs: Always clear ipvs_property flag in skb_scrub_packet()
+
+From: Philo Lu <lulie@linux.alibaba.com>
+
+[ Upstream commit de2c211868b9424f9aa9b3432c4430825bafb41b ]
+
+We found an issue when using bpf_redirect with ipvs NAT mode after
+commit ff70202b2d1a ("dev_forward_skb: do not scrub skb mark within
+the same name space"). Particularly, we use bpf_redirect to return
+the skb directly back to the netif it comes from, i.e., xnet is
+false in skb_scrub_packet(), and then ipvs_property is preserved
+and SNAT is skipped in the rx path.
+
+ipvs_property has been already cleared when netns is changed in
+commit 2b5ec1a5f973 ("netfilter/ipvs: clear ipvs_property flag when
+SKB net namespace changed"). This patch just clears it in spite of
+netns.
+
+Fixes: 2b5ec1a5f973 ("netfilter/ipvs: clear ipvs_property flag when SKB net namespace changed")
+Signed-off-by: Philo Lu <lulie@linux.alibaba.com>
+Acked-by: Julian Anastasov <ja@ssi.bg>
+Link: https://patch.msgid.link/20250222033518.126087-1-lulie@linux.alibaba.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/skbuff.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index da2be54f5e62a..c82aaf656cda2 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -5226,11 +5226,11 @@ void skb_scrub_packet(struct sk_buff *skb, bool xnet)
+       skb->offload_fwd_mark = 0;
+       skb->offload_l3_fwd_mark = 0;
+ #endif
++      ipvs_reset(skb);
+       if (!xnet)
+               return;
+-      ipvs_reset(skb);
+       skb->mark = 0;
+       skb->tstamp = 0;
+ }
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-cadence-macb-synchronize-stats-calculations.patch b/queue-5.4/net-cadence-macb-synchronize-stats-calculations.patch
new file mode 100644 (file)
index 0000000..7bb27f8
--- /dev/null
@@ -0,0 +1,115 @@
+From 2898185a9eec9632a33c0c16d64d912e5f6d9a8d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Feb 2025 11:29:50 -0500
+Subject: net: cadence: macb: Synchronize stats calculations
+
+From: Sean Anderson <sean.anderson@linux.dev>
+
+[ Upstream commit fa52f15c745ce55261b92873676f64f7348cfe82 ]
+
+Stats calculations involve a RMW to add the stat update to the existing
+value. This is currently not protected by any synchronization mechanism,
+so data races are possible. Add a spinlock to protect the update. The
+reader side could be protected using u64_stats, but we would still need
+a spinlock for the update side anyway. And we always do an update
+immediately before reading the stats anyway.
+
+Fixes: 89e5785fc8a6 ("[PATCH] Atmel MACB ethernet driver")
+Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
+Link: https://patch.msgid.link/20250220162950.95941-1-sean.anderson@linux.dev
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/cadence/macb.h      |  2 ++
+ drivers/net/ethernet/cadence/macb_main.c | 12 ++++++++++--
+ 2 files changed, 12 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h
+index 03983bd46eef4..bf864b2d0cac4 100644
+--- a/drivers/net/ethernet/cadence/macb.h
++++ b/drivers/net/ethernet/cadence/macb.h
+@@ -1177,6 +1177,8 @@ struct macb {
+       struct clk              *rx_clk;
+       struct clk              *tsu_clk;
+       struct net_device       *dev;
++      /* Protects hw_stats and ethtool_stats */
++      spinlock_t              stats_lock;
+       union {
+               struct macb_stats       macb;
+               struct gem_stats        gem;
+diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c
+index 12dd18cbdba34..a750c752846cf 100644
+--- a/drivers/net/ethernet/cadence/macb_main.c
++++ b/drivers/net/ethernet/cadence/macb_main.c
+@@ -1483,10 +1483,12 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
+               if (status & MACB_BIT(ISR_ROVR)) {
+                       /* We missed at least one packet */
++                      spin_lock(&bp->stats_lock);
+                       if (macb_is_gem(bp))
+                               bp->hw_stats.gem.rx_overruns++;
+                       else
+                               bp->hw_stats.macb.rx_overruns++;
++                      spin_unlock(&bp->stats_lock);
+                       if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
+                               queue_writel(queue, ISR, MACB_BIT(ISR_ROVR));
+@@ -2567,6 +2569,7 @@ static struct net_device_stats *gem_get_stats(struct macb *bp)
+       if (!netif_running(bp->dev))
+               return nstat;
++      spin_lock_irq(&bp->stats_lock);
+       gem_update_stats(bp);
+       nstat->rx_errors = (hwstat->rx_frame_check_sequence_errors +
+@@ -2596,6 +2599,7 @@ static struct net_device_stats *gem_get_stats(struct macb *bp)
+       nstat->tx_aborted_errors = hwstat->tx_excessive_collisions;
+       nstat->tx_carrier_errors = hwstat->tx_carrier_sense_errors;
+       nstat->tx_fifo_errors = hwstat->tx_underrun;
++      spin_unlock_irq(&bp->stats_lock);
+       return nstat;
+ }
+@@ -2603,12 +2607,13 @@ static struct net_device_stats *gem_get_stats(struct macb *bp)
+ static void gem_get_ethtool_stats(struct net_device *dev,
+                                 struct ethtool_stats *stats, u64 *data)
+ {
+-      struct macb *bp;
++      struct macb *bp = netdev_priv(dev);
+-      bp = netdev_priv(dev);
++      spin_lock_irq(&bp->stats_lock);
+       gem_update_stats(bp);
+       memcpy(data, &bp->ethtool_stats, sizeof(u64)
+                       * (GEM_STATS_LEN + QUEUE_STATS_LEN * MACB_MAX_QUEUES));
++      spin_unlock_irq(&bp->stats_lock);
+ }
+ static int gem_get_sset_count(struct net_device *dev, int sset)
+@@ -2658,6 +2663,7 @@ static struct net_device_stats *macb_get_stats(struct net_device *dev)
+               return gem_get_stats(bp);
+       /* read stats from hardware */
++      spin_lock_irq(&bp->stats_lock);
+       macb_update_stats(bp);
+       /* Convert HW stats into netdevice stats */
+@@ -2691,6 +2697,7 @@ static struct net_device_stats *macb_get_stats(struct net_device *dev)
+       nstat->tx_carrier_errors = hwstat->tx_carrier_errors;
+       nstat->tx_fifo_errors = hwstat->tx_underruns;
+       /* Don't know about heartbeat or window errors... */
++      spin_unlock_irq(&bp->stats_lock);
+       return nstat;
+ }
+@@ -4306,6 +4313,7 @@ static int macb_probe(struct platform_device *pdev)
+       device_set_wakeup_capable(&pdev->dev, bp->wol & MACB_WOL_HAS_MAGIC_PACKET);
+       spin_lock_init(&bp->lock);
++      spin_lock_init(&bp->stats_lock);
+       /* setup capabilities */
+       macb_configure_caps(bp, macb_config);
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-loopback-avoid-sending-ip-packets-without-an-eth.patch b/queue-5.4/net-loopback-avoid-sending-ip-packets-without-an-eth.patch
new file mode 100644 (file)
index 0000000..c9c84b4
--- /dev/null
@@ -0,0 +1,94 @@
+From c3d143ae977504c522a0ec93f4aae60f35d005ba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Feb 2025 09:25:59 +0200
+Subject: net: loopback: Avoid sending IP packets without an Ethernet header
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit 0e4427f8f587c4b603475468bb3aee9418574893 ]
+
+After commit 22600596b675 ("ipv4: give an IPv4 dev to blackhole_netdev")
+IPv4 neighbors can be constructed on the blackhole net device, but they
+are constructed with an output function (neigh_direct_output()) that
+simply calls dev_queue_xmit(). The latter will transmit packets via
+'skb->dev' which might not be the blackhole net device if dst_dev_put()
+switched 'dst->dev' to the blackhole net device while another CPU was
+using the dst entry in ip_output(), but after it already initialized
+'skb->dev' from 'dst->dev'.
+
+Specifically, the following can happen:
+
+    CPU1                                      CPU2
+
+udp_sendmsg(sk1)                          udp_sendmsg(sk2)
+udp_send_skb()                            [...]
+ip_output()
+    skb->dev = skb_dst(skb)->dev
+                                          dst_dev_put()
+                                              dst->dev = blackhole_netdev
+ip_finish_output2()
+    resolves neigh on dst->dev
+neigh_output()
+neigh_direct_output()
+dev_queue_xmit()
+
+This will result in IPv4 packets being sent without an Ethernet header
+via a valid net device:
+
+tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
+listening on enp9s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
+22:07:02.329668 20:00:40:11:18:fb > 45:00:00:44:f4:94, ethertype Unknown
+(0x58c6), length 68:
+        0x0000:  8dda 74ca f1ae ca6c ca6c 0098 969c 0400  ..t....l.l......
+        0x0010:  0000 4730 3f18 6800 0000 0000 0000 9971  ..G0?.h........q
+        0x0020:  c4c9 9055 a157 0a70 9ead bf83 38ca ab38  ...U.W.p....8..8
+        0x0030:  8add ab96 e052                           .....R
+
+Fix by making sure that neighbors are constructed on top of the
+blackhole net device with an output function that simply consumes the
+packets, in a similar fashion to dst_discard_out() and
+blackhole_netdev_xmit().
+
+Fixes: 8d7017fd621d ("blackhole_netdev: use blackhole_netdev to invalidate dst entries")
+Fixes: 22600596b675 ("ipv4: give an IPv4 dev to blackhole_netdev")
+Reported-by: Florian Meister <fmei@sfs.com>
+Closes: https://lore.kernel.org/netdev/20250210084931.23a5c2e4@hermes.local/
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Link: https://patch.msgid.link/20250220072559.782296-1-idosch@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/loopback.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/net/loopback.c b/drivers/net/loopback.c
+index 7788f72c262e6..1dd5044cc6438 100644
+--- a/drivers/net/loopback.c
++++ b/drivers/net/loopback.c
+@@ -241,8 +241,22 @@ static netdev_tx_t blackhole_netdev_xmit(struct sk_buff *skb,
+       return NETDEV_TX_OK;
+ }
++static int blackhole_neigh_output(struct neighbour *n, struct sk_buff *skb)
++{
++      kfree_skb(skb);
++      return 0;
++}
++
++static int blackhole_neigh_construct(struct net_device *dev,
++                                   struct neighbour *n)
++{
++      n->output = blackhole_neigh_output;
++      return 0;
++}
++
+ static const struct net_device_ops blackhole_netdev_ops = {
+       .ndo_start_xmit = blackhole_netdev_xmit,
++      .ndo_neigh_construct = blackhole_neigh_construct,
+ };
+ /* This is a dst-dummy device used specifically for invalidated
+-- 
+2.39.5
+
diff --git a/queue-5.4/net-mvpp2-cls-fixed-non-ip-flow-with-vlan-tag-flow-d.patch b/queue-5.4/net-mvpp2-cls-fixed-non-ip-flow-with-vlan-tag-flow-d.patch
new file mode 100644 (file)
index 0000000..031407a
--- /dev/null
@@ -0,0 +1,40 @@
+From 8dacf6338fc9a09c7dcdb674195553df5ea1e3c4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Feb 2025 20:20:58 -0800
+Subject: net: mvpp2: cls: Fixed Non IP flow, with vlan tag flow defination.
+
+From: Harshal Chaudhari <hchaudhari@marvell.com>
+
+[ Upstream commit 2d253726ff7106b39a44483b6864398bba8a2f74 ]
+
+Non IP flow, with vlan tag not working as expected while
+running below command for vlan-priority. fixed that.
+
+ethtool -N eth1 flow-type ether vlan 0x8000 vlan-mask 0x1fff action 0 loc 0
+
+Fixes: 1274daede3ef ("net: mvpp2: cls: Add steering based on vlan Id and priority.")
+Signed-off-by: Harshal Chaudhari <hchaudhari@marvell.com>
+Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
+Link: https://patch.msgid.link/20250225042058.2643838-1-hchaudhari@marvell.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
+index 6122057d60c00..0f55444861cda 100644
+--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c
+@@ -318,7 +318,7 @@ static const struct mvpp2_cls_flow cls_flows[MVPP2_N_PRS_FLOWS] = {
+                      MVPP2_PRS_RI_VLAN_MASK),
+       /* Non IP flow, with vlan tag */
+       MVPP2_DEF_FLOW(MVPP22_FLOW_ETHERNET, MVPP2_FL_NON_IP_TAG,
+-                     MVPP22_CLS_HEK_OPT_VLAN,
++                     MVPP22_CLS_HEK_TAGGED,
+                      0, 0),
+ };
+-- 
+2.39.5
+
index 1664d286980583f69c01dd03640210e04407f548..22368bbe6f35713a37929accbc21dbf32d0e139e 100644 (file)
@@ -248,3 +248,8 @@ acct-block-access-to-kernel-internal-filesystems.patch
 batman-adv-ignore-neighbor-throughput-metrics-in-error-case.patch
 batman-adv-drop-unmanaged-elp-metric-worker.patch
 sunrpc-suppress-warnings-for-unused-procfs-functions.patch
+net-loopback-avoid-sending-ip-packets-without-an-eth.patch
+net-cadence-macb-synchronize-stats-calculations.patch
+asoc-es8328-fix-route-from-dac-to-output.patch
+ipvs-always-clear-ipvs_property-flag-in-skb_scrub_pa.patch
+net-mvpp2-cls-fixed-non-ip-flow-with-vlan-tag-flow-d.patch