Re: [PATCH 1/2] if_enabled.h: Add IF_ENABLED_OR_ELSE() and IF_ENABLED() macros

From: Paul Cercueil
Date: Tue Dec 08 2020 - 16:00:37 EST


Hi Randy,

Le mar. 8 déc. 2020 à 9:39, Randy Dunlap <rdunlap@xxxxxxxxxxxxx> a écrit :
On 12/8/20 8:48 AM, Paul Cercueil wrote:

Signed-off-by: Paul Cercueil <paul@xxxxxxxxxxxxxxx>

Hi Paul,

Why not just add these 2 new macros to <linux/kconfig.h> ?

Maybe you don't want to add the other 2 headers there also?

That means including <linux/compiler.h> in <linux/kconfig.h>, which causes build failures:

LD vmlinux
SORTTAB vmlinux
SYSMAP System.map
AS arch/mips/boot/compressed/head.o
CC arch/mips/boot/compressed/decompress.o
CC arch/mips/boot/compressed/string.o
CC arch/mips/boot/compressed/dummy.o
OBJCOPY arch/mips/boot/compressed/vmlinux.bin
HOSTCC arch/mips/boot/compressed/calc_vmlinuz_load_addr
GZIP arch/mips/boot/compressed/vmlinux.bin.z
In file included from ./include/linux/kcsan-checks.h:7,
from ./include/asm-generic/rwonce.h:27,
from ./arch/mips/include/generated/asm/rwonce.h:1,
from ./include/linux/compiler.h:246,
from ././include/linux/kconfig.h:8,
from <command-line>:32:
/include/linux/compiler_attributes.h:64: warning: "__always_inline" redefined
64 | #define __always_inline inline __attribute__((__always_inline__))
|
In file included from ./include/linux/stddef.h:5,
from ./include/uapi/linux/posix_types.h:5,
from ./include/uapi/linux/types.h:14,
from ./include/linux/types.h:6,
from ./include/linux/kasan-checks.h:5,
from ./include/asm-generic/rwonce.h:26,
from ./arch/mips/include/generated/asm/rwonce.h:1,
from ./include/linux/compiler.h:246,
from ././include/linux/kconfig.h:8,
from <command-line>:32:
/include/uapi/linux/stddef.h:5: note: this is the location of the previous definition
5 | #define __always_inline inline
|
In file included from ./arch/mips/include/generated/asm/rwonce.h:1,
from ./include/linux/compiler.h:246,
from ././include/linux/kconfig.h:8,
from <command-line>:32:
/include/asm-generic/rwonce.h:64:31: error: expected ‘;’ before ‘unsigned’
64 | static __no_sanitize_or_inline
| ^
| ;
65 | unsigned long __read_once_word_nocheck(const void *addr)
| ~~~~~~~~
/include/asm-generic/rwonce.h:65:15: warning: no previous prototype for ‘__read_once_word_nocheck’ [-Wmissing-prototypes]
65 | unsigned long __read_once_word_nocheck(const void *addr)
| ^~~~~~~~~~~~~~~~~~~~~~~~
/include/asm-generic/rwonce.h:82:28: error: expected ‘;’ before ‘unsigned’
82 | static __no_kasan_or_inline
| ^
| ;
83 | unsigned long read_word_at_a_time(const void *addr)
| ~~~~~~~~
/include/asm-generic/rwonce.h:83:15: warning: no previous prototype for ‘read_word_at_a_time’ [-Wmissing-prototypes]
83 | unsigned long read_word_at_a_time(const void *addr)
| ^~~~~~~~~~~~~~~~~~~


That's why I opted for a new header.

Cheers,
-Paul

---
include/linux/if_enabled.h | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
create mode 100644 include/linux/if_enabled.h

diff --git a/include/linux/if_enabled.h b/include/linux/if_enabled.h
new file mode 100644
index 000000000000..8189d1402340
--- /dev/null
+++ b/include/linux/if_enabled.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LINUX_IF_ENABLED_H
+#define __LINUX_IF_ENABLED_H
+
+#include <linux/build_bug.h>
+#include <linux/compiler_types.h>
+#include <linux/kconfig.h>
+
+/*
+ * IF_ENABLED_OR_ELSE(CONFIG_FOO, a, b) evaluates to (a) if CONFIG_FOO is set
+ * to 'y' or 'm', (b) otherwise.
+ */
+#define IF_ENABLED_OR_ELSE(option, a, b) \
+ (BUILD_BUG_ON_ZERO(__same_type((a), (b))) || IS_ENABLED(option) ? (a) : (b))
+
+/*
+ * IF_ENABLED(CONFIG_FOO, ptr) evaluates to (ptr) if CONFIG_FOO is set to 'y'
+ * or 'm', NULL otherwise.
+ */
+#define IF_ENABLED(option, ptr) IF_ENABLED_OR_ELSE(option, ptr, NULL)
+
+#endif /* __LINUX_IF_ENABLED_H */



thanks.
--
~Randy