History

net/mlx4_core: Fix unaligned accesses

Addresses the following kernel logs seen during boot: Kernel unaligned access at TPC[100ee150] mlx4_QUERY_HCA+0x80/0x248 [mlx4_core] Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core] Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core] Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core] Kernel unaligned access at TPC[100f071c] mlx4_QUERY_ADAPTER+0x100/0x12c [mlx4_core]

David Ahern committed 11 years ago

Commit 17d5ceb1 parent f94813f1 file · +14 −4Browse files

Unified · Split

drivers/net/ethernet/mellanox/mlx4/fw.c+14−4
@@ -56,11 +56,13 @@ MODULE_PARM_DESC(enable_qos, "Enable Enhanced QoS support (default: on)"); · 55 unmodified lines
5656 #define MLX4_GET(dest, source, offset) \
5757 do { \
5858 void *__p = (char *) (source) + (offset); \
59+ u64 val; \
5960 switch (sizeof (dest)) { \
6061 case 1: (dest) = *(u8 *) __p; break; \
6162 case 2: (dest) = be16_to_cpup(__p); break; \
6263 case 4: (dest) = be32_to_cpup(__p); break; \
63− case 8: (dest) = be64_to_cpup(__p); break; \
64+ case 8: val = get_unaligned((u64 *)__p); \
65+ (dest) = be64_to_cpu(val); break; \
6466 default: __buggy_use_of_MLX4_GET(); \
6567 } \
6668 } while (0)
@@ -1605,9 +1607,17 @@ static void get_board_id(void *vsd, char *board_id) · 1538 unmodified lines
16051607 * swaps each 4-byte word before passing it back to
16061608 * us. Therefore we need to swab it before printing.
16071609 */
1608− for (i = 0; i < 4; ++i)
1609− ((u32 *) board_id)[i] =
1610− swab32(*(u32 *) (vsd + VSD_OFFSET_MLX_BOARD_ID + i * 4));
1610+ u32 *bid_u32 = (u32 *)board_id;
1611+
1612+ for (i = 0; i < 4; ++i) {
1613+ u32 *addr;
1614+ u32 val;
1615+
1616+ addr = (u32 *) (vsd + VSD_OFFSET_MLX_BOARD_ID + i * 4);
1617+ val = get_unaligned(addr);
1618+ val = swab32(val);
1619+ put_unaligned(val, &bid_u32[i]);
1620+ }
16111621 }
16121622 }
16131623