path: root/arch
diff options
authorArnd Bergmann <>2016-05-05 16:22:39 -0700
committerLinus Torvalds <>2016-05-05 17:38:53 -0700
commit7322dd755e7dd34bc5359aa27abeed1687e0f628 (patch)
tree4a3e4dd40cdb10dbe75d59112ffc0fbf2c38dfab /arch
parent7c31190bcfdbff225950902a9f226e4eb79ca94f (diff)
byteswap: try to avoid __builtin_constant_p gcc bug
This is another attempt to avoid a regression in wwn_to_u64() after that started using get_unaligned_be64(), which in turn ran into a bug on gcc-4.9 through 6.1. The regression got introduced due to the combination of two separate workarounds (commits e3bde9568d99: "include/linux/unaligned: force inlining of byteswap operations" and ef3fb2422ffe: "scsi: fc: use get/put_unaligned64 for wwn access") that each try to sidestep distinct problems with gcc behavior (code growth and increased stack usage). Unfortunately after both have been applied, a more serious gcc bug has been uncovered, leading to incorrect object code that discards part of a function and causes undefined behavior. As part of this problem is how __builtin_constant_p gets evaluated on an argument passed by reference into an inline function, this avoids the use of __builtin_constant_p() for all architectures that set CONFIG_ARCH_USE_BUILTIN_BSWAP. Most architectures do not set ARCH_SUPPORTS_OPTIMIZED_INLINING, which means they probably do not suffer from the problem in the qla2xxx driver, but they might still run into it elsewhere. Both of the original workarounds were only merged in the 4.6 kernel, and the bug that is fixed by this patch should only appear if both are there, so we probably don't need to backport the fix. On the other hand, it works by simplifying the code path and should not have any negative effects. [ fix older gcc warnings] ( Link: Link: Link: Link: Fixes: e3bde9568d99 ("include/linux/unaligned: force inlining of byteswap operations") Fixes: ef3fb2422ffe ("scsi: fc: use get/put_unaligned64 for wwn access") Link: Signed-off-by: Arnd Bergmann <> Reviewed-by: Josh Poimboeuf <> Tested-by: Josh Poimboeuf <> # on gcc-5.3 Tested-by: Quinn Tran <> Cc: Martin Jambor <> Cc: "Martin K. Petersen" <> Cc: James Bottomley <> Cc: Denys Vlasenko <> Cc: Thomas Graf <> Cc: Peter Zijlstra <> Cc: David Rientjes <> Cc: Ingo Molnar <> Cc: Himanshu Madhani <> Cc: Jan Hubicka <> Signed-off-by: Andrew Morton <> Signed-off-by: Linus Torvalds <>
Diffstat (limited to 'arch')
0 files changed, 0 insertions, 0 deletions