mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Woodhouse <dwmw2@infradead.org>
To: Alan Cox <alan@redhat.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: Linux 2.4.21-rc4-ac1
Date: Wed, 28 May 2003 09:29:49 +0100	[thread overview]
Message-ID: <1054110589.2082.129.camel@passion.cambridge.redhat.com> (raw)
In-Reply-To: <200305271626.h4RGQ7v10151@devserv.devel.redhat.com>


> o	Add CRC32 libraries backport	(David Woodhouse, Duncan Sands)

This fixes the 'CONFIG_CRC32=y but nothing references it' case, and also
merges the optimisations made by Joakim Tjernlund in 2.5's version.

diff -uNr linux-2.4.21-rc4-ac1/kernel/ksyms.c linux-2.4.21-rc4-ac1-crc/kernel/ksyms.c
--- linux-2.4.21-rc4-ac1/kernel/ksyms.c	Wed May 28 09:19:53 2003
+++ linux-2.4.21-rc4-ac1-crc/kernel/ksyms.c	Wed May 28 09:23:34 2003
@@ -49,6 +49,7 @@
 #include <linux/completion.h>
 #include <linux/seq_file.h>
 #include <linux/dnotify.h>
+#include <linux/crc32.h>
 #include <asm/checksum.h>
 
 #if defined(CONFIG_PROC_FS)
@@ -575,6 +576,12 @@
 EXPORT_SYMBOL(strnicmp);
 EXPORT_SYMBOL(strspn);
 EXPORT_SYMBOL(strsep);
+
+#ifdef CONFIG_CRC32
+EXPORT_SYMBOL(crc32_le);
+EXPORT_SYMBOL(crc32_be);
+EXPORT_SYMBOL(bitreverse);
+#endif
 
 /* software interrupts */
 EXPORT_SYMBOL(tasklet_hi_vec);
diff -uNr linux-2.4.21-rc4-ac1/lib/Makefile linux-2.4.21-rc4-ac1-crc/lib/Makefile
--- linux-2.4.21-rc4-ac1/lib/Makefile	Wed May 28 09:19:53 2003
+++ linux-2.4.21-rc4-ac1-crc/lib/Makefile	Wed May 28 09:23:34 2003
@@ -8,7 +8,8 @@
 
 L_TARGET := lib.a
 
-export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o rbtree.o crc32.o
+export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o \
+	       rbtree.o crc32.o
 
 obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \
 	 bust_spinlocks.o rbtree.o dump_stack.o
diff -uNr linux-2.4.21-rc4-ac1/lib/crc32.c linux-2.4.21-rc4-ac1-crc/lib/crc32.c
--- linux-2.4.21-rc4-ac1/lib/crc32.c	Wed May 28 09:19:53 2003
+++ linux-2.4.21-rc4-ac1-crc/lib/crc32.c	Wed May 28 09:23:34 2003
@@ -90,32 +90,29 @@
 	const u32      *tab = crc32table_le;
 
 # ifdef __LITTLE_ENDIAN
-#  define DO_CRC crc = (crc>>8) ^ tab[ crc & 255 ]
-#  define ENDIAN_SHIFT 0
+#  define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
 # else
-#  define DO_CRC crc = (crc<<8) ^ tab[ crc >> 24 ]
-#  define ENDIAN_SHIFT 24
+#  define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8)
 # endif
 
 	crc = __cpu_to_le32(crc);
 	/* Align it */
-	if( ((u32)b)&3 && len){
+	if(unlikely(((long)b)&3 && len)){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
-		} while ((--len) && ((u32)b)&3 );
+			DO_CRC(*((u8 *)b)++);
+		} while ((--len) && ((long)b)&3 );
 	}
-	if(len >= 4){
+	if(likely(len >= 4)){
 		/* load data 32 bits wide, xor data 32 bits wide. */
 		size_t save_len = len & 3;
 	        len = len >> 2;
 		--b; /* use pre increment below(*++b) for speed */
 		do {
 			crc ^= *++b;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
 		} while (--len);
 		b++; /* point to next byte(s) */
 		len = save_len;
@@ -123,8 +120,7 @@
 	/* And the last few bytes */
 	if(len){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
+			DO_CRC(*((u8 *)b)++);
 		} while (--len);
 	}
 
@@ -195,32 +191,29 @@
 	const u32      *tab = crc32table_be;
 
 # ifdef __LITTLE_ENDIAN
-#  define DO_CRC crc = (crc>>8) ^ tab[ crc & 255 ]
-#  define ENDIAN_SHIFT 24
+#  define DO_CRC(x) crc = tab[ (crc ^ (x)) & 255 ] ^ (crc>>8)
 # else
-#  define DO_CRC crc = (crc<<8) ^ tab[ crc >> 24 ]
-#  define ENDIAN_SHIFT 0
+#  define DO_CRC(x) crc = tab[ ((crc >> 24) ^ (x)) & 255] ^ (crc<<8)
 # endif
 
 	crc = __cpu_to_be32(crc);
 	/* Align it */
-	if( ((u32)b)&3 && len){
+	if(unlikely(((long)b)&3 && len)){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
-		} while ((--len) && ((u32)b)&3 );
+			DO_CRC(*((u8 *)b)++);
+		} while ((--len) && ((long)b)&3 );
 	}
-	if(len >= 4){
+	if(likely(len >= 4)){
 		/* load data 32 bits wide, xor data 32 bits wide. */
 		size_t save_len = len & 3;
 	        len = len >> 2;
 		--b; /* use pre increment below(*++b) for speed */
 		do {
 			crc ^= *++b;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
-			DO_CRC;
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
+			DO_CRC(0);
 		} while (--len);
 		b++; /* point to next byte(s) */
 		len = save_len;
@@ -228,8 +221,7 @@
 	/* And the last few bytes */
 	if(len){
 		do {
-			crc ^= *((u8 *)b)++ << ENDIAN_SHIFT;
-			DO_CRC;
+			DO_CRC(*((u8 *)b)++);
 		} while (--len);
 	}
 	return __be32_to_cpu(crc);
@@ -266,9 +258,12 @@
 	return x;
 }
 
+#ifdef MODULE /* These are exported from kernel/ksyms.c in the non-module
+		 case, to ensure that this file is pulled in from lib/lib.a */
 EXPORT_SYMBOL(crc32_le);
 EXPORT_SYMBOL(crc32_be);
 EXPORT_SYMBOL(bitreverse);
+#endif
 
 /*
  * A brief CRC tutorial.
diff -uNr linux-2.4.21-rc4-ac1/lib/crc32defs.h linux-2.4.21-rc4-ac1-crc/lib/crc32defs.h
--- linux-2.4.21-rc4-ac1/lib/crc32defs.h	Wed May 28 09:19:53 2003
+++ linux-2.4.21-rc4-ac1-crc/lib/crc32defs.h	Wed May 28 09:23:34 2003
@@ -8,8 +8,12 @@
 
 /* How many bits at a time to use.  Requires a table of 4<<CRC_xx_BITS bytes. */
 /* For less performance-sensitive, use 4 */
-#define CRC_LE_BITS 8
-#define CRC_BE_BITS 8
+#ifndef CRC_LE_BITS 
+# define CRC_LE_BITS 8
+#endif
+#ifndef CRC_BE_BITS
+# define CRC_BE_BITS 8
+#endif
 
 /*
  * Little-endian CRC computation.  Used with serial bit streams sent



-- 
dwmw2


  reply	other threads:[~2003-05-28  8:16 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-05-27 16:26 Alan Cox
2003-05-28  8:29 ` David Woodhouse [this message]
2003-05-27 19:28 Geller Sandor
2003-05-27 19:12 ` Alan Cox

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1054110589.2082.129.camel@passion.cambridge.redhat.com \
    --to=dwmw2@infradead.org \
    --cc=alan@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®