Skip to content

Commit 5e3c1c4

Browse files
committed
lib/crc32: remove other generic implementations
Now that we've standardized on the byte-by-byte implementation of CRC32 as the only generic implementation (see previous commit for the rationale), remove the code for the other implementations. Tested with crc_kunit. Link: https://lore.kernel.org/r/20250123212904.118683-3-ebiggers@kernel.org Reviewed-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Eric Biggers <ebiggers@google.com>
1 parent b0430f3 commit 5e3c1c4

File tree

4 files changed

+40
-361
lines changed

4 files changed

+40
-361
lines changed

lib/Kconfig

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ config CRC32
189189
tristate "CRC32/CRC32c functions"
190190
default y
191191
select BITREVERSE
192-
select CRC32_SARWATE
193192
help
194193
This option is provided for the case where no in-kernel-tree
195194
modules require CRC32/CRC32c functions, but a module built outside
@@ -203,9 +202,6 @@ config CRC32_ARCH
203202
tristate
204203
default CRC32 if ARCH_HAS_CRC32 && CRC_OPTIMIZATIONS
205204

206-
config CRC32_SARWATE
207-
bool
208-
209205
config CRC64
210206
tristate "CRC64 functions"
211207
help

lib/crc32.c

Lines changed: 10 additions & 215 deletions
Original file line numberDiff line numberDiff line change
@@ -30,178 +30,27 @@
3030
#include <linux/crc32poly.h>
3131
#include <linux/module.h>
3232
#include <linux/types.h>
33-
#include <linux/sched.h>
34-
#include "crc32defs.h"
35-
36-
#if CRC_LE_BITS > 8
37-
# define tole(x) ((__force u32) cpu_to_le32(x))
38-
#else
39-
# define tole(x) (x)
40-
#endif
41-
42-
#if CRC_BE_BITS > 8
43-
# define tobe(x) ((__force u32) cpu_to_be32(x))
44-
#else
45-
# define tobe(x) (x)
46-
#endif
4733

4834
#include "crc32table.h"
4935

5036
MODULE_AUTHOR("Matt Domsch <Matt_Domsch@dell.com>");
5137
MODULE_DESCRIPTION("Various CRC32 calculations");
5238
MODULE_LICENSE("GPL");
5339

54-
#if CRC_LE_BITS > 8 || CRC_BE_BITS > 8
55-
56-
/* implements slicing-by-4 or slicing-by-8 algorithm */
57-
static inline u32 __pure
58-
crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
59-
{
60-
# ifdef __LITTLE_ENDIAN
61-
# define DO_CRC(x) crc = t0[(crc ^ (x)) & 255] ^ (crc >> 8)
62-
# define DO_CRC4 (t3[(q) & 255] ^ t2[(q >> 8) & 255] ^ \
63-
t1[(q >> 16) & 255] ^ t0[(q >> 24) & 255])
64-
# define DO_CRC8 (t7[(q) & 255] ^ t6[(q >> 8) & 255] ^ \
65-
t5[(q >> 16) & 255] ^ t4[(q >> 24) & 255])
66-
# else
67-
# define DO_CRC(x) crc = t0[((crc >> 24) ^ (x)) & 255] ^ (crc << 8)
68-
# define DO_CRC4 (t0[(q) & 255] ^ t1[(q >> 8) & 255] ^ \
69-
t2[(q >> 16) & 255] ^ t3[(q >> 24) & 255])
70-
# define DO_CRC8 (t4[(q) & 255] ^ t5[(q >> 8) & 255] ^ \
71-
t6[(q >> 16) & 255] ^ t7[(q >> 24) & 255])
72-
# endif
73-
const u32 *b;
74-
size_t rem_len;
75-
# ifdef CONFIG_X86
76-
size_t i;
77-
# endif
78-
const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
79-
# if CRC_LE_BITS != 32
80-
const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
81-
# endif
82-
u32 q;
83-
84-
/* Align it */
85-
if (unlikely((long)buf & 3 && len)) {
86-
do {
87-
DO_CRC(*buf++);
88-
} while ((--len) && ((long)buf)&3);
89-
}
90-
91-
# if CRC_LE_BITS == 32
92-
rem_len = len & 3;
93-
len = len >> 2;
94-
# else
95-
rem_len = len & 7;
96-
len = len >> 3;
97-
# endif
98-
99-
b = (const u32 *)buf;
100-
# ifdef CONFIG_X86
101-
--b;
102-
for (i = 0; i < len; i++) {
103-
# else
104-
for (--b; len; --len) {
105-
# endif
106-
q = crc ^ *++b; /* use pre increment for speed */
107-
# if CRC_LE_BITS == 32
108-
crc = DO_CRC4;
109-
# else
110-
crc = DO_CRC8;
111-
q = *++b;
112-
crc ^= DO_CRC4;
113-
# endif
114-
}
115-
len = rem_len;
116-
/* And the last few bytes */
117-
if (len) {
118-
u8 *p = (u8 *)(b + 1) - 1;
119-
# ifdef CONFIG_X86
120-
for (i = 0; i < len; i++)
121-
DO_CRC(*++p); /* use pre increment for speed */
122-
# else
123-
do {
124-
DO_CRC(*++p); /* use pre increment for speed */
125-
} while (--len);
126-
# endif
127-
}
128-
return crc;
129-
#undef DO_CRC
130-
#undef DO_CRC4
131-
#undef DO_CRC8
132-
}
133-
#endif
134-
135-
136-
/**
137-
* crc32_le_generic() - Calculate bitwise little-endian Ethernet AUTODIN II
138-
* CRC32/CRC32C
139-
* @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for other
140-
* uses, or the previous crc32/crc32c value if computing incrementally.
141-
* @p: pointer to buffer over which CRC32/CRC32C is run
142-
* @len: length of buffer @p
143-
* @tab: little-endian Ethernet table
144-
* @polynomial: CRC32/CRC32c LE polynomial
145-
*/
146-
static inline u32 __pure crc32_le_generic(u32 crc, unsigned char const *p,
147-
size_t len, const u32 (*tab)[256],
148-
u32 polynomial)
40+
u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len)
14941
{
150-
#if CRC_LE_BITS == 1
151-
int i;
152-
while (len--) {
153-
crc ^= *p++;
154-
for (i = 0; i < 8; i++)
155-
crc = (crc >> 1) ^ ((crc & 1) ? polynomial : 0);
156-
}
157-
# elif CRC_LE_BITS == 2
158-
while (len--) {
159-
crc ^= *p++;
160-
crc = (crc >> 2) ^ tab[0][crc & 3];
161-
crc = (crc >> 2) ^ tab[0][crc & 3];
162-
crc = (crc >> 2) ^ tab[0][crc & 3];
163-
crc = (crc >> 2) ^ tab[0][crc & 3];
164-
}
165-
# elif CRC_LE_BITS == 4
166-
while (len--) {
167-
crc ^= *p++;
168-
crc = (crc >> 4) ^ tab[0][crc & 15];
169-
crc = (crc >> 4) ^ tab[0][crc & 15];
170-
}
171-
# elif CRC_LE_BITS == 8
172-
/* aka Sarwate algorithm */
173-
while (len--) {
174-
crc ^= *p++;
175-
crc = (crc >> 8) ^ tab[0][crc & 255];
176-
}
177-
# else
178-
crc = (__force u32) __cpu_to_le32(crc);
179-
crc = crc32_body(crc, p, len, tab);
180-
crc = __le32_to_cpu((__force __le32)crc);
181-
#endif
42+
while (len--)
43+
crc = (crc >> 8) ^ crc32table_le[(crc & 255) ^ *p++];
18244
return crc;
18345
}
46+
EXPORT_SYMBOL(crc32_le_base);
18447

185-
#if CRC_LE_BITS == 1
186-
u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len)
187-
{
188-
return crc32_le_generic(crc, p, len, NULL, CRC32_POLY_LE);
189-
}
190-
u32 __pure crc32c_le_base(u32 crc, const u8 *p, size_t len)
191-
{
192-
return crc32_le_generic(crc, p, len, NULL, CRC32C_POLY_LE);
193-
}
194-
#else
195-
u32 __pure crc32_le_base(u32 crc, const u8 *p, size_t len)
196-
{
197-
return crc32_le_generic(crc, p, len, crc32table_le, CRC32_POLY_LE);
198-
}
19948
u32 __pure crc32c_le_base(u32 crc, const u8 *p, size_t len)
20049
{
201-
return crc32_le_generic(crc, p, len, crc32ctable_le, CRC32C_POLY_LE);
50+
while (len--)
51+
crc = (crc >> 8) ^ crc32ctable_le[(crc & 255) ^ *p++];
52+
return crc;
20253
}
203-
#endif
204-
EXPORT_SYMBOL(crc32_le_base);
20554
EXPORT_SYMBOL(crc32c_le_base);
20655

20756
/*
@@ -277,64 +126,10 @@ u32 __attribute_const__ __crc32c_le_shift(u32 crc, size_t len)
277126
EXPORT_SYMBOL(crc32_le_shift);
278127
EXPORT_SYMBOL(__crc32c_le_shift);
279128

280-
/**
281-
* crc32_be_generic() - Calculate bitwise big-endian Ethernet AUTODIN II CRC32
282-
* @crc: seed value for computation. ~0 for Ethernet, sometimes 0 for
283-
* other uses, or the previous crc32 value if computing incrementally.
284-
* @p: pointer to buffer over which CRC32 is run
285-
* @len: length of buffer @p
286-
* @tab: big-endian Ethernet table
287-
* @polynomial: CRC32 BE polynomial
288-
*/
289-
static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,
290-
size_t len, const u32 (*tab)[256],
291-
u32 polynomial)
292-
{
293-
#if CRC_BE_BITS == 1
294-
int i;
295-
while (len--) {
296-
crc ^= *p++ << 24;
297-
for (i = 0; i < 8; i++)
298-
crc =
299-
(crc << 1) ^ ((crc & 0x80000000) ? polynomial :
300-
0);
301-
}
302-
# elif CRC_BE_BITS == 2
303-
while (len--) {
304-
crc ^= *p++ << 24;
305-
crc = (crc << 2) ^ tab[0][crc >> 30];
306-
crc = (crc << 2) ^ tab[0][crc >> 30];
307-
crc = (crc << 2) ^ tab[0][crc >> 30];
308-
crc = (crc << 2) ^ tab[0][crc >> 30];
309-
}
310-
# elif CRC_BE_BITS == 4
311-
while (len--) {
312-
crc ^= *p++ << 24;
313-
crc = (crc << 4) ^ tab[0][crc >> 28];
314-
crc = (crc << 4) ^ tab[0][crc >> 28];
315-
}
316-
# elif CRC_BE_BITS == 8
317-
while (len--) {
318-
crc ^= *p++ << 24;
319-
crc = (crc << 8) ^ tab[0][crc >> 24];
320-
}
321-
# else
322-
crc = (__force u32) __cpu_to_be32(crc);
323-
crc = crc32_body(crc, p, len, tab);
324-
crc = __be32_to_cpu((__force __be32)crc);
325-
# endif
326-
return crc;
327-
}
328-
329-
#if CRC_BE_BITS == 1
330-
u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len)
331-
{
332-
return crc32_be_generic(crc, p, len, NULL, CRC32_POLY_BE);
333-
}
334-
#else
335129
u32 __pure crc32_be_base(u32 crc, const u8 *p, size_t len)
336130
{
337-
return crc32_be_generic(crc, p, len, crc32table_be, CRC32_POLY_BE);
131+
while (len--)
132+
crc = (crc << 8) ^ crc32table_be[(crc >> 24) ^ *p++];
133+
return crc;
338134
}
339-
#endif
340135
EXPORT_SYMBOL(crc32_be_base);

lib/crc32defs.h

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)