Message ID | 20180202154104.1522809-2-arnd@arndb.de |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Fri, Feb 2, 2018 at 5:31 PM, Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > 2018-02-03 0:40 GMT+09:00 Arnd Bergmann <arnd@arndb.de>: >> --- >> include/linux/kconfig.h | 6 ++++++ >> 1 file changed, 6 insertions(+) >> >> diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h >> index fec5076eda91..cc8fa109cfa3 100644 >> --- a/include/linux/kconfig.h >> +++ b/include/linux/kconfig.h >> @@ -4,6 +4,12 @@ >> >> #include <generated/autoconf.h> >> >> +#ifdef CONFIG_CPU_BIG_ENDIAN >> +#define __BIG_ENDIAN 4321 >> +#else >> +#define __LITTLE_ENDIAN 1234 >> +#endif >> + >> #define __ARG_PLACEHOLDER_1 0, >> #define __take_second_arg(__ignored, val, ...) val >> >> -- >> 2.9.0 >> > > If all architectures define > CONFIG_CPU_BIG_ENDIAN or CONFIG_CPU_LITTLE_ENDIAN, > is it possible to use this for endian test? > > i.e. > > Is it possible to replace like this? > #ifdef __BIG_ENDIAN -> #ifdef CONFIG_CPU_BIG_ENDIAN > > #ifdef __LITTLE_ENDIAN -> #ifdef CONFIG_CPU_LITTLE_ENDIAN I believe we don't always define CONFIG_CPU_LITTLE_ENDIAN, but it would work in principle. The main issue here is changing so many files: $ git grep -wl '__\(BIG\|LITTLE\)_ENDIAN' | wc -l 418 $ git grep -wl 'CONFIG_CPU_\(BIG\|LITTLE\)_ENDIAN' | wc -l 145 Arnd
Thanks. I've queued both for 4.16-rc2 (or maybe -rc3).
diff --git a/include/linux/kconfig.h b/include/linux/kconfig.h index fec5076eda91..cc8fa109cfa3 100644 --- a/include/linux/kconfig.h +++ b/include/linux/kconfig.h @@ -4,6 +4,12 @@ #include <generated/autoconf.h> +#ifdef CONFIG_CPU_BIG_ENDIAN +#define __BIG_ENDIAN 4321 +#else +#define __LITTLE_ENDIAN 1234 +#endif + #define __ARG_PLACEHOLDER_1 0, #define __take_second_arg(__ignored, val, ...) val
Build testing with LTO found a couple of files that get compiled differently depending on whether asm/byteorder.h gets included early enough or not. In particular, include/asm-generic/qrwlock_types.h is affected by this, but there are probably others as well. The symptom is a series of LTO link time warnings, including these: net/netlabel/netlabel_unlabeled.h:223: error: type of 'netlbl_unlhsh_add' does not match original declaration [-Werror=lto-type-mismatch] int netlbl_unlhsh_add(struct net *net, net/netlabel/netlabel_unlabeled.c:377: note: 'netlbl_unlhsh_add' was previously declared here include/net/ipv6.h:360: error: type of 'ipv6_renew_options_kern' does not match original declaration [-Werror=lto-type-mismatch] ipv6_renew_options_kern(struct sock *sk, net/ipv6/exthdrs.c:1162: note: 'ipv6_renew_options_kern' was previously declared here net/core/dev.c:761: note: 'dev_get_by_name_rcu' was previously declared here struct net_device *dev_get_by_name_rcu(struct net *net, const char *name) net/core/dev.c:761: note: code may be misoptimized unless -fno-strict-aliasing is used drivers/gpu/drm/i915/i915_drv.h:3377: error: type of 'i915_gem_object_set_to_wc_domain' does not match original declaration [-Werror=lto-type-mismatch] i915_gem_object_set_to_wc_domain(struct drm_i915_gem_object *obj, bool write); drivers/gpu/drm/i915/i915_gem.c:3639: note: 'i915_gem_object_set_to_wc_domain' was previously declared here include/linux/debugfs.h:92:9: error: type of 'debugfs_attr_read' does not match original declaration [-Werror=lto-type-mismatch] ssize_t debugfs_attr_read(struct file *file, char __user *buf, fs/debugfs/file.c:318: note: 'debugfs_attr_read' was previously declared here include/linux/rwlock_api_smp.h:30: error: type of '_raw_read_unlock' does not match original declaration [-Werror=lto-type-mismatch] void __lockfunc _raw_read_unlock(rwlock_t *lock) __releases(lock); kernel/locking/spinlock.c:246:26: note: '_raw_read_unlock' was previously declared here include/linux/fs.h:3308:5: error: type of 'simple_attr_open' does not match original declaration [-Werror=lto-type-mismatch] int simple_attr_open(struct inode *inode, struct file *file, fs/libfs.c:795: note: 'simple_attr_open' was previously declared here All of the above are caused by include/asm-generic/qrwlock_types.h failing to include asm/byteorder.h after commit e0d02285f16e ("locking/qrwlock: Use 'struct qrwlock' instead of 'struct __qrwlock'") in linux-4.15. Similar bugs may or may not exist in older kernels as well, but there is no easy way to test those with link-time optimizations, and kernels before 4.14 are harder to fix because they don't have Babu's patch series We had similar issues with CONFIG_ symbols in the past and ended up always including the configuration headers though linux/kconfig.h. This works around the issue through that same file, defining either __BIG_ENDIAN or __LITTLE_ENDIAN depending on CONFIG_CPU_BIG_ENDIAN, which is now always set on all architectures since commit 4c97a0c8fee3 ("arch: define CPU_BIG_ENDIAN for all fixed big endian archs"). Cc: stable@vger.kernel.org Cc: Babu Moger <babu.moger@oracle.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- include/linux/kconfig.h | 6 ++++++ 1 file changed, 6 insertions(+) -- 2.9.0