2020-02-20 17:37:53

by Jesse Brandeburg

[permalink] [raw]
Subject: [PATCH v2 2/2] lib: make a test module with set/clear bit

Test some bit clears/sets to make sure assembly doesn't change.
Instruct Kbuild to build this file with extra warning level -Wextra,
to catch new issues, and also doesn't hurt to build with C=1.

This was used to test changes to arch/x86/include/asm/bitops.h.

Recommended usage:
make defconfig
scripts/config -m CONFIG_TEST_BITOPS
make modules_prepare
make C=1 W=1 lib/test_bitops.ko
objdump -S -d lib/test_bitops.ko

Signed-off-by: Jesse Brandeburg <[email protected]>
---
v2: use correct CC: list
---
lib/Kconfig.debug | 13 ++++++++++++
lib/Makefile | 2 ++
lib/test_bitops.c | 34 ++++++++++++++++++++++++++++++
tools/testing/selftests/lib/config | 1 +
4 files changed, 50 insertions(+)
create mode 100644 lib/test_bitops.c

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 69def4a9df00..61a5d00ea064 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1947,6 +1947,19 @@ config TEST_LKM

If unsure, say N.

+config TEST_BITOPS
+ tristate "Test module for compilation of clear_bit/set_bit operations"
+ depends on m
+ help
+ This builds the "test_bitops" module that is much like the
+ TEST_LKM module except that it does a basic exercise of the
+ clear_bit and set_bit macros to make sure there are no compiler
+ warnings from C=1 sparse checker or -Wextra compilations. It has
+ no dependencies and doesn't run or load unless explicitly requested
+ by name. for example: modprobe test_bitops.
+
+ If unsure, say N.
+
config TEST_VMALLOC
tristate "Test module for stress/performance analysis of vmalloc allocator"
default n
diff --git a/lib/Makefile b/lib/Makefile
index 611872c06926..b18db565b355 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -89,6 +89,8 @@ obj-$(CONFIG_TEST_OBJAGG) += test_objagg.o
obj-$(CONFIG_TEST_STACKINIT) += test_stackinit.o
obj-$(CONFIG_TEST_BLACKHOLE_DEV) += test_blackhole_dev.o
obj-$(CONFIG_TEST_MEMINIT) += test_meminit.o
+obj-$(CONFIG_TEST_BITOPS) += test_bitops.o
+CFLAGS_test_bitops.o += -Werror

obj-$(CONFIG_TEST_LIVEPATCH) += livepatch/

diff --git a/lib/test_bitops.c b/lib/test_bitops.c
new file mode 100644
index 000000000000..077af86cf616
--- /dev/null
+++ b/lib/test_bitops.c
@@ -0,0 +1,34 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/printk.h>
+
+/* a tiny module only meant to compile-test set/clear_bit */
+
+static DECLARE_BITMAP(g_bitmap, 80);
+
+static int __init test_bitops_startup(void)
+{
+ pr_warn("Loaded test module\n");
+ set_bit(4, g_bitmap);
+ set_bit(11, g_bitmap);
+ set_bit(40, g_bitmap);
+ return 0;
+}
+
+static void __exit test_bitops_unstartup(void)
+{
+ clear_bit(4, g_bitmap);
+ clear_bit(11, g_bitmap);
+ clear_bit(40, g_bitmap);
+ pr_warn("Unloaded test module\n");
+}
+
+module_init(test_bitops_startup);
+module_exit(test_bitops_unstartup);
+
+MODULE_AUTHOR("Jesse Brandeburg <[email protected]>");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Bit testing module");
diff --git a/tools/testing/selftests/lib/config b/tools/testing/selftests/lib/config
index 14a77ea4a8da..b80ee3f6e265 100644
--- a/tools/testing/selftests/lib/config
+++ b/tools/testing/selftests/lib/config
@@ -2,3 +2,4 @@ CONFIG_TEST_PRINTF=m
CONFIG_TEST_BITMAP=m
CONFIG_PRIME_NUMBERS=m
CONFIG_TEST_STRSCPY=m
+CONFIG_TEST_BITOPS=m
--
2.24.1


2020-02-20 18:11:07

by Peter Zijlstra

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] lib: make a test module with set/clear bit

On Thu, Feb 20, 2020 at 09:37:22AM -0800, Jesse Brandeburg wrote:
> Test some bit clears/sets to make sure assembly doesn't change.
> Instruct Kbuild to build this file with extra warning level -Wextra,
> to catch new issues, and also doesn't hurt to build with C=1.
>
> This was used to test changes to arch/x86/include/asm/bitops.h.
>
> Recommended usage:
> make defconfig
> scripts/config -m CONFIG_TEST_BITOPS
> make modules_prepare
> make C=1 W=1 lib/test_bitops.ko
> objdump -S -d lib/test_bitops.ko

I only applied this second patch:

# sparse --version
0.6.0 (Debian: 0.6.0-3+b1)

# grep TEST_BITOPS defconfig-build/.config
CONFIG_TEST_BITOPS=m

# make C=1 W=1 O=defconfig-build/ lib/test_bitops.ko
make[1]: Entering directory '/usr/src/linux-2.6/defconfig-build'
GEN Makefile
HOSTCC scripts/basic/fixdep
HOSTCC arch/x86/tools/relocs_32.o
HOSTCC arch/x86/tools/relocs_64.o
HOSTCC arch/x86/tools/relocs_common.o
HOSTLD arch/x86/tools/relocs
HOSTCC scripts/selinux/genheaders/genheaders
HOSTCC scripts/selinux/mdp/mdp
HOSTCC scripts/kallsyms
HOSTCC scripts/sorttable
HOSTCC scripts/asn1_compiler
HOSTCC scripts/extract-cert
HOSTCC scripts/mod/mk_elfconfig
CHECK ../scripts/mod/empty.c
CC scripts/mod/empty.o
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/modpost.o
CC scripts/mod/devicetable-offsets.s
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
CC kernel/bounds.s
CC arch/x86/kernel/asm-offsets.s
CALL ../scripts/checksyscalls.sh
CALL ../scripts/atomic/check-atomics.sh
DESCEND objtool
HOSTCC /usr/src/linux-2.6/defconfig-build/tools/objtool/fixdep.o
HOSTLD /usr/src/linux-2.6/defconfig-build/tools/objtool/fixdep-in.o
LINK /usr/src/linux-2.6/defconfig-build/tools/objtool/fixdep
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/exec-cmd.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/help.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/pager.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/parse-options.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/run-command.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/sigchain.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/subcmd-config.o
LD /usr/src/linux-2.6/defconfig-build/tools/objtool/libsubcmd-in.o
AR /usr/src/linux-2.6/defconfig-build/tools/objtool/libsubcmd.a
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/arch/x86/decode.o
LD /usr/src/linux-2.6/defconfig-build/tools/objtool/arch/x86/objtool-in.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/builtin-check.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/builtin-orc.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/check.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/orc_gen.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/orc_dump.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/elf.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/special.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/objtool.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/libstring.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/libctype.o
CC /usr/src/linux-2.6/defconfig-build/tools/objtool/str_error_r.o
LD /usr/src/linux-2.6/defconfig-build/tools/objtool/objtool-in.o
LINK /usr/src/linux-2.6/defconfig-build/tools/objtool/objtool
CHECK ../lib/test_bitops.c
CC [M] lib/test_bitops.o
MODPOST 1 modules
CC [M] lib/test_bitops.mod.o
LD [M] lib/test_bitops.ko
make[1]: Leaving directory '/usr/src/linux-2.6/defconfig-build'


No warnings for me!

2020-02-20 19:04:50

by Jesse Brandeburg

[permalink] [raw]
Subject: Re: [PATCH v2 2/2] lib: make a test module with set/clear bit

On Thu, 20 Feb 2020 19:10:33 +0100 Peter wrote:
> On Thu, Feb 20, 2020 at 09:37:22AM -0800, Jesse Brandeburg wrote:
> > Test some bit clears/sets to make sure assembly doesn't change.
> > Instruct Kbuild to build this file with extra warning level -Wextra,
> > to catch new issues, and also doesn't hurt to build with C=1.
> >
> > This was used to test changes to arch/x86/include/asm/bitops.h.
> >
> > Recommended usage:
> > make defconfig
> > scripts/config -m CONFIG_TEST_BITOPS
> > make modules_prepare
> > make C=1 W=1 lib/test_bitops.ko
> > objdump -S -d lib/test_bitops.ko
>
> I only applied this second patch:
>
> # sparse --version
> 0.6.0 (Debian: 0.6.0-3+b1)

Thanks for the review! The module was created to verify assembly didn't
change before/after, but it's not a reproducer. Let me fix that (I had
skipped that step as I originally didn't plan to upstream the
test-patch).