From mboxrd@z Thu Jan 1 00:00:00 1970 From: ard.biesheuvel@linaro.org (Ard Biesheuvel) Date: Thu, 13 Sep 2018 09:52:55 +0200 Subject: [PATCH 1/5] crypto: arm/aes-ce - enable module autoloading based on CPU feature bits In-Reply-To: References: <1495362220-30044-1-git-send-email-ard.biesheuvel@linaro.org> <1495362220-30044-2-git-send-email-ard.biesheuvel@linaro.org> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 13 September 2018 at 08:24, Stefan Agner wrote: > On 10.09.2018 00:01, Ard Biesheuvel wrote: >> On 10 September 2018 at 08:21, Stefan Agner wrote: >>> Hi Ard, >>> >>> On 21.05.2017 03:23, Ard Biesheuvel wrote: >>>> Make the module autoloadable by tying it to the CPU feature bit that >>>> describes whether the optional instructions it relies on are implemented >>>> by the current CPU. >>>> >>> >>> This leads to a compiler warning when compiling multi_v7_defconfig/ARM32 >>> using Clang 6.0.1: >>> >>> arch/arm/crypto/aes-ce-glue.c:450:1: warning: variable >>> 'cpu_feature_match_AES' is not needed and will not >>> be emitted [-Wunneeded-internal-declaration] >>> module_cpu_feature_match(AES, aes_init); >>> >>> ./include/linux/cpufeature.h:48:33: note: expanded from macro >>> 'module_cpu_feature_match' >>> static struct cpu_feature const cpu_feature_match_ ## x[] = \ >>> >>> :83:1: note: expanded from here >>> cpu_feature_match_AES >>> ^ >>> 1 warning generated. >>> >>> Do you happen to have an idea how to alleviate? >>> >> >> I guess this only happens for modules that are selected as builtin, >> and so MODULE_DEVICE_TABLE() resolves to nothing? >> Does this only occur for CPU features? > > So in the above case CONFIG_ARM_CRYPTO=y, CONFIG_CRYPTO_AES_ARM_CE=m... > > Right now I only saw it with CPU features... I remember seen similar issues, which got resolved. Digging in the git history I found 1f318a8bafcf ("modules: mark __inittest/__exittest as __maybe_unused"), > > This seems to resolve it: > > --- a/include/linux/cpufeature.h > +++ b/include/linux/cpufeature.h > @@ -45,7 +45,7 @@ > * 'asm/cpufeature.h' of your favorite architecture. > */ > #define module_cpu_feature_match(x, __initfunc) \ > -static struct cpu_feature const cpu_feature_match_ ## x[] = \ > +static struct cpu_feature const __maybe_unused cpu_feature_match_ ## x[] = \ > { { .feature = cpu_feature(x) }, { } }; \ > MODULE_DEVICE_TABLE(cpu, cpu_feature_match_ ## x); \ > \ > > Also arch/arm/crypto/crc32-ce-glue.c needs an extra __maybe_unused. > Yes, that looks like the right approach to me. The difference between other uses of MODULE_DEVICE_TABLE() is that the second argument usually gets referenced in some way in the driver struct. It the CPU feature case, that does not happen and so the struct ends up being unreferenced when building the code into the kernel.