lib: crc32: constify crc32 lookup table
authorDaniel Borkmann <dborkman@redhat.com>
Fri, 13 Feb 2015 22:36:21 +0000 (14:36 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 14 Feb 2015 05:21:35 +0000 (21:21 -0800)
Commit 8f243af42ade ("sections: fix const sections for crc32 table")
removed the compile-time generated crc32 tables from the RO sections,
because it conflicts with the definition of __cacheline_aligned which
puts all such aligned data into .data..cacheline_aligned section
optimized for wasting less space, and can cause alignment issues when
used in combination with const with some gcc versions like 4.7.0 due to
a gcc bug [1].

Given that most gcc versions should have the fix by now, we can just use
____cacheline_aligned, which only aligns the data but doesn't move it
into specific sections as opposed to __cacheline_aligned.  In case of
gcc versions having the mentioned bug, the alignment attribute will have
no effect, but the data will still be made RO.

After patch tables are in RO:

  $ nm -v lib/crc32.o | grep -1 -E "crc32c?table"
  0000000000000000 t arch_local_irq_enable
  0000000000000000 r crc32ctable_le
  0000000000000000 t crc32_exit
  --
  0000000000000960 t test_buf
  0000000000002000 r crc32table_be
  0000000000004000 r crc32table_le
  000000001d1056e5 A __crc_crc32_be

  [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52181

Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Cc: Joe Mario <jmario@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
lib/gen_crc32table.c

index 71fcfcd964104f732c0e9c3ac0af45620fd438b7..d83a372fa76f26fa82a99dbf7af3c4ff40fa0db4 100644 (file)
@@ -109,7 +109,7 @@ int main(int argc, char** argv)
 
        if (CRC_LE_BITS > 1) {
                crc32init_le();
-               printf("static u32 __cacheline_aligned "
+               printf("static const u32 ____cacheline_aligned "
                       "crc32table_le[%d][%d] = {",
                       LE_TABLE_ROWS, LE_TABLE_SIZE);
                output_table(crc32table_le, LE_TABLE_ROWS,
@@ -119,7 +119,7 @@ int main(int argc, char** argv)
 
        if (CRC_BE_BITS > 1) {
                crc32init_be();
-               printf("static u32 __cacheline_aligned "
+               printf("static const u32 ____cacheline_aligned "
                       "crc32table_be[%d][%d] = {",
                       BE_TABLE_ROWS, BE_TABLE_SIZE);
                output_table(crc32table_be, LE_TABLE_ROWS,
@@ -128,7 +128,7 @@ int main(int argc, char** argv)
        }
        if (CRC_LE_BITS > 1) {
                crc32cinit_le();
-               printf("static u32 __cacheline_aligned "
+               printf("static const u32 ____cacheline_aligned "
                       "crc32ctable_le[%d][%d] = {",
                       LE_TABLE_ROWS, LE_TABLE_SIZE);
                output_table(crc32ctable_le, LE_TABLE_ROWS,