]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
MIPS: bcm63xx: nvram: avoid inefficient use of crc32_le_combine()
authorEric Biggers <ebiggers@google.com>
Sun, 11 May 2025 18:28:36 +0000 (11:28 -0700)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Tue, 20 May 2025 06:44:33 +0000 (08:44 +0200)
bcm963xx_nvram_checksum() was using crc32_le_combine() to update a CRC
with four zero bytes.  However, this is about 5x slower than just
CRC'ing four zero bytes in the normal way.  Just do that instead.

(We could instead make crc32_le_combine() faster on short lengths.  But
all its callers do just fine without it, so I'd like to just remove it.)

Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
include/linux/bcm963xx_nvram.h

index c8c7f01159fed5b73b15fdd4e46de0f16ff908e7..48830bf180427c6b558ed445c7e319adb081f7d2 100644 (file)
@@ -81,25 +81,21 @@ static int __maybe_unused bcm963xx_nvram_checksum(
        const struct bcm963xx_nvram *nvram,
        u32 *expected_out, u32 *actual_out)
 {
+       const u32 zero = 0;
        u32 expected, actual;
        size_t len;
 
        if (nvram->version <= 4) {
                expected = nvram->checksum_v4;
-               len = BCM963XX_NVRAM_V4_SIZE - sizeof(u32);
+               len = BCM963XX_NVRAM_V4_SIZE;
        } else {
                expected = nvram->checksum_v5;
-               len = BCM963XX_NVRAM_V5_SIZE - sizeof(u32);
+               len = BCM963XX_NVRAM_V5_SIZE;
        }
 
-       /*
-        * Calculate the CRC32 value for the nvram with a checksum value
-        * of 0 without modifying or copying the nvram by combining:
-        * - The CRC32 of the nvram without the checksum value
-        * - The CRC32 of a zero checksum value (which is also 0)
-        */
-       actual = crc32_le_combine(
-               crc32_le(~0, (u8 *)nvram, len), 0, sizeof(u32));
+       /* Calculate the CRC32 of the nvram with the checksum field set to 0. */
+       actual = crc32_le(~0, nvram, len - sizeof(u32));
+       actual = crc32_le(actual, &zero, sizeof(u32));
 
        if (expected_out)
                *expected_out = expected;