]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: ibm: emac: Clear MAL descriptors without memset
authorRosen Penev <rosenp@gmail.com>
Wed, 3 Jun 2026 23:07:53 +0000 (16:07 -0700)
committerJakub Kicinski <kuba@kernel.org>
Tue, 9 Jun 2026 00:26:40 +0000 (17:26 -0700)
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.

Use WRITE_ONCE() for each field to prevent the compiler from merging
the stores back into a memset() call.

The skb tracking arrays remain ordinary CPU memory and still use memset().

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://patch.msgid.link/20260603230754.5535-1-rosenp@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/ibm/emac/core.c

index d2194b406c9e11c88e0462b384af74e964bd6750..b7568d96aa47cc68f76c8eb7e8e5ec0326f9a736 100644 (file)
@@ -1162,6 +1162,17 @@ static void emac_clean_rx_ring(struct emac_instance *dev)
        }
 }
 
+static void emac_clear_mal_desc(struct mal_descriptor *desc, int count)
+{
+       int i;
+
+       for (i = 0; i < count; i++) {
+               WRITE_ONCE(desc[i].ctrl, 0);
+               WRITE_ONCE(desc[i].data_len, 0);
+               WRITE_ONCE(desc[i].data_ptr, 0);
+       }
+}
+
 static int
 __emac_prepare_rx_skb(struct sk_buff *skb, struct emac_instance *dev, int slot)
 {
@@ -3089,8 +3100,8 @@ static int emac_probe(struct platform_device *ofdev)
        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 *));