diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2015-02-13 17:36:21 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-14 00:21:35 -0500 |
commit | f5e38b9284e13e28c1ef00e508238f279cf0ac3a (patch) | |
tree | 0067a65ff5a293c80593117840550c182c158814 /lib | |
parent | 7f590657937f1c59163ff14a13062439a18e4a37 (diff) |
lib: crc32: constify crc32 lookup table
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>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gen_crc32table.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/lib/gen_crc32table.c b/lib/gen_crc32table.c index 71fcfcd96410..d83a372fa76f 100644 --- a/lib/gen_crc32table.c +++ b/lib/gen_crc32table.c | |||
@@ -109,7 +109,7 @@ int main(int argc, char** argv) | |||
109 | 109 | ||
110 | if (CRC_LE_BITS > 1) { | 110 | if (CRC_LE_BITS > 1) { |
111 | crc32init_le(); | 111 | crc32init_le(); |
112 | printf("static u32 __cacheline_aligned " | 112 | printf("static const u32 ____cacheline_aligned " |
113 | "crc32table_le[%d][%d] = {", | 113 | "crc32table_le[%d][%d] = {", |
114 | LE_TABLE_ROWS, LE_TABLE_SIZE); | 114 | LE_TABLE_ROWS, LE_TABLE_SIZE); |
115 | output_table(crc32table_le, LE_TABLE_ROWS, | 115 | output_table(crc32table_le, LE_TABLE_ROWS, |
@@ -119,7 +119,7 @@ int main(int argc, char** argv) | |||
119 | 119 | ||
120 | if (CRC_BE_BITS > 1) { | 120 | if (CRC_BE_BITS > 1) { |
121 | crc32init_be(); | 121 | crc32init_be(); |
122 | printf("static u32 __cacheline_aligned " | 122 | printf("static const u32 ____cacheline_aligned " |
123 | "crc32table_be[%d][%d] = {", | 123 | "crc32table_be[%d][%d] = {", |
124 | BE_TABLE_ROWS, BE_TABLE_SIZE); | 124 | BE_TABLE_ROWS, BE_TABLE_SIZE); |
125 | output_table(crc32table_be, LE_TABLE_ROWS, | 125 | output_table(crc32table_be, LE_TABLE_ROWS, |
@@ -128,7 +128,7 @@ int main(int argc, char** argv) | |||
128 | } | 128 | } |
129 | if (CRC_LE_BITS > 1) { | 129 | if (CRC_LE_BITS > 1) { |
130 | crc32cinit_le(); | 130 | crc32cinit_le(); |
131 | printf("static u32 __cacheline_aligned " | 131 | printf("static const u32 ____cacheline_aligned " |
132 | "crc32ctable_le[%d][%d] = {", | 132 | "crc32ctable_le[%d][%d] = {", |
133 | LE_TABLE_ROWS, LE_TABLE_SIZE); | 133 | LE_TABLE_ROWS, LE_TABLE_SIZE); |
134 | output_table(crc32ctable_le, LE_TABLE_ROWS, | 134 | output_table(crc32ctable_le, LE_TABLE_ROWS, |