2005-04-16 15:20:36 -07:00
|
|
|
/*
|
|
|
|
* There are multiple 16-bit CRC polynomials in common use, but this is
|
|
|
|
* *the* standard CRC-32 polynomial, first popularized by Ethernet.
|
|
|
|
* x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0
|
|
|
|
*/
|
|
|
|
#define CRCPOLY_LE 0xedb88320
|
|
|
|
#define CRCPOLY_BE 0x04c11db7
|
|
|
|
|
2012-03-23 15:02:25 -07:00
|
|
|
/*
|
|
|
|
* This is the CRC32c polynomial, as outlined by Castagnoli.
|
|
|
|
* x^32+x^28+x^27+x^26+x^25+x^23+x^22+x^20+x^19+x^18+x^14+x^13+x^11+x^10+x^9+
|
|
|
|
* x^8+x^6+x^0
|
|
|
|
*/
|
|
|
|
#define CRC32C_POLY_LE 0x82F63B78
|
|
|
|
|
2012-03-23 15:02:26 -07:00
|
|
|
/* Try to choose an implementation variant via Kconfig */
|
|
|
|
#ifdef CONFIG_CRC32_SLICEBY8
|
|
|
|
# define CRC_LE_BITS 64
|
|
|
|
# define CRC_BE_BITS 64
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_CRC32_SLICEBY4
|
|
|
|
# define CRC_LE_BITS 32
|
|
|
|
# define CRC_BE_BITS 32
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_CRC32_SARWATE
|
|
|
|
# define CRC_LE_BITS 8
|
|
|
|
# define CRC_BE_BITS 8
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_CRC32_BIT
|
|
|
|
# define CRC_LE_BITS 1
|
|
|
|
# define CRC_BE_BITS 1
|
|
|
|
#endif
|
|
|
|
|
2012-03-23 15:02:24 -07:00
|
|
|
/*
|
|
|
|
* How many bits at a time to use. Valid values are 1, 2, 4, 8, 32 and 64.
|
|
|
|
* For less performance-sensitive, use 4 or 8 to save table size.
|
|
|
|
* For larger systems choose same as CPU architecture as default.
|
|
|
|
* This works well on X86_64, SPARC64 systems. This may require some
|
|
|
|
* elaboration after experiments with other architectures.
|
|
|
|
*/
|
crc32: remove two instances of trailing whitespaces
This patchset (re)uses Bob Pearson's crc32 slice-by-8 code to stamp out
a software crc32c implementation. It removes the crc32c implementation
in crypto/ in favor of using the stamped-out one in lib/. There is also
a change to Kconfig so that the kernel builder can pick an
implementation best suited for the hardware.
The motivation for this patchset is that I am working on adding full
metadata checksumming to ext4. As far as performance impact of adding
checksumming goes, I see nearly no change with a standard mail server
ffsb simulation. On a test that involves only file creation and
deletion and extent tree writes, I see a drop of about 50 pcercent with
the current kernel crc32c implementation; this improves to a drop of
about 20 percent with the enclosed crc32c code.
When metadata is usually a small fraction of total IO, this new
implementation doesn't help much because metadata is usually a small
fraction of total IO. However, when we are doing IO that is almost all
metadata (such as rm -rf'ing a tree), then this patch speeds up the
operation substantially.
Incidentally, given that iscsi, sctp, and btrfs also use crc32c, this
patchset should improve their speed as well. I have not yet quantified
that, however. This latest submission combines Bob's patches from late
August 2011 with mine so that they can be one coherent patch set.
Please excuse my inability to combine some of the patches; I've been
advised to leave Bob's patches alone and build atop them instead. :/
Since the last posting, I've also collected some crc32c test results on
a bunch of different x86/powerpc/sparc platforms. The results can be
viewed here: http://goo.gl/sgt3i ; the "crc32-kern-le" and "crc32c"
columns describe the performance of the kernel's current crc32 and
crc32c software implementations. The "crc32c-by8-le" column shows
crc32c performance with this patchset applied. I expect crc32
performance to be roughly the same.
The two _boost columns at the right side of the spreadsheet shows how much
faster the new implementation is over the old one. As you can see, crc32
rises substantially, and crc32c experiences a huge increase.
This patch:
- remove trailing whitespace from lib/crc32.c
- remove trailing whitespace from lib/crc32defs.h
[djwong@us.ibm.com: changelog tweaks]
Signed-off-by: Bob Pearson <rpearson@systemfabricworks.com>
Signed-off-by: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2012-03-23 15:02:21 -07:00
|
|
|
#ifndef CRC_LE_BITS
|
2012-03-23 15:02:24 -07:00
|
|
|
# ifdef CONFIG_64BIT
|
|
|
|
# define CRC_LE_BITS 64
|
|
|
|
# else
|
|
|
|
# define CRC_LE_BITS 32
|
|
|
|
# endif
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif
|
|
|
|
#ifndef CRC_BE_BITS
|
2012-03-23 15:02:24 -07:00
|
|
|
# ifdef CONFIG_64BIT
|
|
|
|
# define CRC_BE_BITS 64
|
|
|
|
# else
|
|
|
|
# define CRC_BE_BITS 32
|
|
|
|
# endif
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Little-endian CRC computation. Used with serial bit streams sent
|
|
|
|
* lsbit-first. Be sure to use cpu_to_le32() to append the computed CRC.
|
|
|
|
*/
|
2012-03-23 15:02:24 -07:00
|
|
|
#if CRC_LE_BITS > 64 || CRC_LE_BITS < 1 || CRC_LE_BITS == 16 || \
|
2012-03-23 15:02:23 -07:00
|
|
|
CRC_LE_BITS & CRC_LE_BITS-1
|
2012-03-23 15:02:24 -07:00
|
|
|
# error "CRC_LE_BITS must be one of {1, 2, 4, 8, 32, 64}"
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Big-endian CRC computation. Used with serial bit streams sent
|
|
|
|
* msbit-first. Be sure to use cpu_to_be32() to append the computed CRC.
|
|
|
|
*/
|
2012-03-23 15:02:24 -07:00
|
|
|
#if CRC_BE_BITS > 64 || CRC_BE_BITS < 1 || CRC_BE_BITS == 16 || \
|
2012-03-23 15:02:23 -07:00
|
|
|
CRC_BE_BITS & CRC_BE_BITS-1
|
2012-03-23 15:02:24 -07:00
|
|
|
# error "CRC_BE_BITS must be one of {1, 2, 4, 8, 32, 64}"
|
2005-04-16 15:20:36 -07:00
|
|
|
#endif
|