]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lib/crc32: make crc32c() go directly to lib
authorEric Biggers <ebiggers@google.com>
Mon, 2 Dec 2024 01:08:40 +0000 (17:08 -0800)
committerEric Biggers <ebiggers@google.com>
Mon, 2 Dec 2024 01:23:02 +0000 (17:23 -0800)
Now that the lower level __crc32c_le() library function is optimized for
each architecture, make crc32c() just call that instead of taking an
inefficient and error-prone detour through the shash API.

Note: a future cleanup should make crc32c_le() be the actual library
function instead of __crc32c_le().  That will require updating callers
of __crc32c_le() to use crc32c_le() instead, and updating callers of
crc32c_le() that expect a 'const void *' arg to expect 'const u8 *'
instead.  Similarly, a future cleanup should remove LIBCRC32C by making
everyone who is selecting it just select CRC32 directly instead.

Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20241202010844.144356-16-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
include/linux/crc32c.h
lib/Kconfig
lib/Makefile
lib/libcrc32c.c [deleted file]

index 357ae4611a4539e0cba582941e5c85095238272e..47eb78003c2654f419164dd2378015048ab787bc 100644 (file)
@@ -2,9 +2,12 @@
 #ifndef _LINUX_CRC32C_H
 #define _LINUX_CRC32C_H
 
-#include <linux/types.h>
+#include <linux/crc32.h>
 
-extern u32 crc32c(u32 crc, const void *address, unsigned int length);
+static inline u32 crc32c(u32 crc, const void *address, unsigned int length)
+{
+       return __crc32c_le(crc, address, length);
+}
 
 /* This macro exists for backwards-compatibility. */
 #define crc32c_le crc32c
index 8858030bebaea1e521862f6124bbfb16f09793e8..d0c2dc0dac32a8a83adf2dc0cd6a5f5a4d950be6 100644 (file)
@@ -310,14 +310,10 @@ config CRC7
 
 config LIBCRC32C
        tristate "CRC32c (Castagnoli, et al) Cyclic Redundancy-Check"
-       select CRYPTO
-       select CRYPTO_CRC32C
+       select CRC32
        help
-         This option is provided for the case where no in-kernel-tree
-         modules require CRC32c functions, but a module built outside the
-         kernel tree does. Such modules that use library CRC32c functions
-         require M here.  See Castagnoli93.
-         Module will be libcrc32c.
+         This option just selects CRC32 and is provided for compatibility
+         purposes until the users are updated to select CRC32 directly.
 
 config CRC8
        tristate "CRC8 function"
index a8155c972f02856fcc61ee949ddda436cfe211ff..6573163d24e44c9ea6f3168498936a555383f506 100644 (file)
@@ -167,7 +167,6 @@ obj-$(CONFIG_CRC64)     += crc64.o
 obj-$(CONFIG_CRC32_SELFTEST)   += crc32test.o
 obj-$(CONFIG_CRC4)     += crc4.o
 obj-$(CONFIG_CRC7)     += crc7.o
-obj-$(CONFIG_LIBCRC32C)        += libcrc32c.o
 obj-$(CONFIG_CRC8)     += crc8.o
 obj-$(CONFIG_CRC64_ROCKSOFT) += crc64-rocksoft.o
 obj-$(CONFIG_XXHASH)   += xxhash.o
diff --git a/lib/libcrc32c.c b/lib/libcrc32c.c
deleted file mode 100644 (file)
index 649e687..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/* 
- * CRC32C
- *@Article{castagnoli-crc,
- * author =       { Guy Castagnoli and Stefan Braeuer and Martin Herrman},
- * title =        {{Optimization of Cyclic Redundancy-Check Codes with 24
- *                 and 32 Parity Bits}},
- * journal =      IEEE Transactions on Communication,
- * year =         {1993},
- * volume =       {41},
- * number =       {6},
- * pages =        {},
- * month =        {June},
- *}
- * Used by the iSCSI driver, possibly others, and derived from
- * the iscsi-crc.c module of the linux-iscsi driver at
- * http://linux-iscsi.sourceforge.net.
- *
- * Following the example of lib/crc32, this function is intended to be
- * flexible and useful for all users.  Modules that currently have their
- * own crc32c, but hopefully may be able to use this one are:
- *  net/sctp (please add all your doco to here if you change to
- *            use this one!)
- *  <endoflist>
- *
- * Copyright (c) 2004 Cisco Systems, Inc.
- */
-
-#include <crypto/hash.h>
-#include <linux/err.h>
-#include <linux/init.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/crc32c.h>
-
-static struct crypto_shash *tfm;
-
-u32 crc32c(u32 crc, const void *address, unsigned int length)
-{
-       SHASH_DESC_ON_STACK(shash, tfm);
-       u32 ret, *ctx = (u32 *)shash_desc_ctx(shash);
-       int err;
-
-       shash->tfm = tfm;
-       *ctx = crc;
-
-       err = crypto_shash_update(shash, address, length);
-       BUG_ON(err);
-
-       ret = *ctx;
-       barrier_data(ctx);
-       return ret;
-}
-
-EXPORT_SYMBOL(crc32c);
-
-static int __init libcrc32c_mod_init(void)
-{
-       tfm = crypto_alloc_shash("crc32c", 0, 0);
-       return PTR_ERR_OR_ZERO(tfm);
-}
-
-static void __exit libcrc32c_mod_fini(void)
-{
-       crypto_free_shash(tfm);
-}
-
-module_init(libcrc32c_mod_init);
-module_exit(libcrc32c_mod_fini);
-
-MODULE_AUTHOR("Clay Haapala <chaapala@cisco.com>");
-MODULE_DESCRIPTION("CRC32c (Castagnoli) calculations");
-MODULE_LICENSE("GPL");
-MODULE_SOFTDEP("pre: crc32c");