Fix by replacing memset with manual 0 assignments. The first patch was rightly rejected by upstream as it affects everything so keep it in 9xx. Upstream message for it is: dcbz instruction shouldn't be used on non-cached memory. Using it on non-cached memory can result in alignment exception and implies a heavy handling. Instead of silentely emulating the instruction and resulting in high performance degradation, warn whenever an alignment exception is taken in kernel mode due to dcbz, so that the user is made aware that dcbz instruction has been used unexpectedly by the kernel. Signed-off-by: Rosen Penev <rosenp@gmail.com> Link: https://github.com/openwrt/openwrt/pull/23382 Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
50 lines
1.7 KiB
Diff
50 lines
1.7 KiB
Diff
From f992336a598ce4508b75e25dff755715f38b9b8e Mon Sep 17 00:00:00 2001
|
|
From: Rosen Penev <rosenp@gmail.com>
|
|
Date: Sat, 16 May 2026 16:31:09 -0700
|
|
Subject: [PATCH] net: ibm: emac: Clear MAL descriptors without memset
|
|
|
|
Clear MAL descriptor rings with explicit field stores instead of
|
|
memset(). The descriptor rings are carved from MAL coherent DMA memory,
|
|
which may be mapped uncached on 32-bit powerpc. The optimized memset()
|
|
path can use dcbz there and trigger an alignment warning.
|
|
|
|
The skb tracking arrays remain ordinary CPU memory and still use memset().
|
|
|
|
Assisted-by: Codex:GPT-5.5
|
|
Signed-off-by: Rosen Penev <rosenp@gmail.com>
|
|
---
|
|
drivers/net/ethernet/ibm/emac/core.c | 15 +++++++++++++--
|
|
1 file changed, 13 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/ibm/emac/core.c
|
|
+++ b/drivers/net/ethernet/ibm/emac/core.c
|
|
@@ -1161,6 +1161,17 @@ static void emac_clean_rx_ring(struct em
|
|
}
|
|
}
|
|
|
|
+static void emac_clear_mal_desc(struct mal_descriptor *desc, int count)
|
|
+{
|
|
+ int i;
|
|
+
|
|
+ for (i = 0; i < count; i++) {
|
|
+ desc[i].ctrl = 0;
|
|
+ desc[i].data_len = 0;
|
|
+ desc[i].data_ptr = 0;
|
|
+ }
|
|
+}
|
|
+
|
|
static int
|
|
__emac_prepare_rx_skb(struct sk_buff *skb, struct emac_instance *dev, int slot)
|
|
{
|
|
@@ -3086,8 +3097,8 @@ static int emac_probe(struct platform_de
|
|
DBG(dev, "rx_desc %p" NL, dev->rx_desc);
|
|
|
|
/* Clean rings */
|
|
- memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor));
|
|
- memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor));
|
|
+ emac_clear_mal_desc(dev->tx_desc, NUM_TX_BUFF);
|
|
+ emac_clear_mal_desc(dev->rx_desc, NUM_RX_BUFF);
|
|
memset(dev->tx_skb, 0, NUM_TX_BUFF * sizeof(struct sk_buff *));
|
|
memset(dev->rx_skb, 0, NUM_RX_BUFF * sizeof(struct sk_buff *));
|
|
|