From: Masahiro Yamada <yamada.masahiro@socionext.com> To: Jessica Yu <jeyu@kernel.org> Cc: Matthias Maennich <maennich@google.com>, Greg Kroah-Hartman <gregkh@linuxfoundation.org>, Joel Fernandes <joel@joelfernandes.org>, Martijn Coenen <maco@android.com>, Will Deacon <will.deacon@arm.com>, Will Deacon <will@kernel.org>, Linux Kernel Mailing List <linux-kernel@vger.kernel.org> Subject: Re: [PATCH 4/7] module: avoid code duplication in include/linux/export.h Date: Fri, 27 Sep 2019 18:58:47 +0900 [thread overview] Message-ID: <CAK7LNAR1ON6XjbpzDS-WXLGB49mvXkOyddHZ4mxoA-gXNrJOzQ@mail.gmail.com> (raw) In-Reply-To: <20190927093603.9140-5-yamada.masahiro@socionext.com> On Fri, Sep 27, 2019 at 6:37 PM Masahiro Yamada <yamada.masahiro@socionext.com> wrote: > > include/linux/export.h has lots of code duplication between > EXPORT_SYMBOL and EXPORT_SYMBOL_NS. > > To improve the maintainability and readability, unify the > implementation. > > When the symbol has no namespace, pass the empty string "" to > the 'ns' parameter. > > The drawback of this change is, it grows the code size. > When the symbol has no namespace, sym->namespace was previously > NULL, but it is now am empty string "". So, it increases 1 byte Just a nit. I meant "an empty string" instead of "am empty string". > for every no namespace EXPORT_SYMBOL. > > A typical kernel configuration has 10K exported symbols, so it > increases 10KB in rough estimation. > > I did not come up with a good idea to refactor it without increasing > the code size. > > I am not sure how big a deal it is, but at least include/linux/export.h > looks nicer. > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > --- > > include/linux/export.h | 100 +++++++++++++---------------------------- > kernel/module.c | 2 +- > 2 files changed, 33 insertions(+), 69 deletions(-) > > diff --git a/include/linux/export.h b/include/linux/export.h > index 621158ecd2e2..55245a405a2f 100644 > --- a/include/linux/export.h > +++ b/include/linux/export.h > @@ -48,45 +48,28 @@ extern struct module __this_module; > * absolute relocations that require runtime processing on relocatable > * kernels. > */ > -#define __KSYMTAB_ENTRY_NS(sym, sec, ns) \ > +#define __KSYMTAB_ENTRY(sym, sec, ns) \ > __ADDRESSABLE(sym) \ > asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\" \n" \ > " .balign 4 \n" \ > - "__ksymtab_" #ns NS_SEPARATOR #sym ": \n" \ > + "__ksymtab_" ns NS_SEPARATOR #sym ": \n" \ > " .long " #sym "- . \n" \ > " .long __kstrtab_" #sym "- . \n" \ > " .long __kstrtabns_" #sym "- . \n" \ > " .previous \n") > > -#define __KSYMTAB_ENTRY(sym, sec) \ > - __ADDRESSABLE(sym) \ > - asm(" .section \"___ksymtab" sec "+" #sym "\", \"a\" \n" \ > - " .balign 4 \n" \ > - "__ksymtab_" #sym ": \n" \ > - " .long " #sym "- . \n" \ > - " .long __kstrtab_" #sym "- . \n" \ > - " .long 0 \n" \ > - " .previous \n") > - > struct kernel_symbol { > int value_offset; > int name_offset; > int namespace_offset; > }; > #else > -#define __KSYMTAB_ENTRY_NS(sym, sec, ns) \ > - static const struct kernel_symbol __ksymtab_##sym##__##ns \ > - asm("__ksymtab_" #ns NS_SEPARATOR #sym) \ > - __attribute__((section("___ksymtab" sec "+" #sym), used)) \ > - __aligned(sizeof(void *)) \ > - = { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym } > - > -#define __KSYMTAB_ENTRY(sym, sec) \ > +#define __KSYMTAB_ENTRY(sym, sec, ns) \ > static const struct kernel_symbol __ksymtab_##sym \ > - asm("__ksymtab_" #sym) \ > + asm("__ksymtab_" ns NS_SEPARATOR #sym) \ > __attribute__((section("___ksymtab" sec "+" #sym), used)) \ > __aligned(sizeof(void *)) \ > - = { (unsigned long)&sym, __kstrtab_##sym, NULL } > + = { (unsigned long)&sym, __kstrtab_##sym, __kstrtabns_##sym } > > struct kernel_symbol { > unsigned long value; > @@ -97,29 +80,21 @@ struct kernel_symbol { > > #ifdef __GENKSYMS__ > > -#define ___EXPORT_SYMBOL(sym,sec) __GENKSYMS_EXPORT_SYMBOL(sym) > -#define ___EXPORT_SYMBOL_NS(sym,sec,ns) __GENKSYMS_EXPORT_SYMBOL(sym) > +#define ___EXPORT_SYMBOL(sym, sec, ns) __GENKSYMS_EXPORT_SYMBOL(sym) > > #else > > -#define ___export_symbol_common(sym, sec) \ > +/* For every exported symbol, place a struct in the __ksymtab section */ > +#define ___EXPORT_SYMBOL(sym, sec, ns) \ > extern typeof(sym) sym; \ > __CRC_SYMBOL(sym, sec); \ > static const char __kstrtab_##sym[] \ > __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ > - = #sym \ > - > -/* For every exported symbol, place a struct in the __ksymtab section */ > -#define ___EXPORT_SYMBOL_NS(sym, sec, ns) \ > - ___export_symbol_common(sym, sec); \ > + = #sym; \ > static const char __kstrtabns_##sym[] \ > __attribute__((section("__ksymtab_strings"), used, aligned(1))) \ > - = #ns; \ > - __KSYMTAB_ENTRY_NS(sym, sec, ns) > - > -#define ___EXPORT_SYMBOL(sym, sec) \ > - ___export_symbol_common(sym, sec); \ > - __KSYMTAB_ENTRY(sym, sec) > + = ns; \ > + __KSYMTAB_ENTRY(sym, sec, ns) > > #endif > > @@ -130,8 +105,7 @@ struct kernel_symbol { > * be reused in other execution contexts such as the UEFI stub or the > * decompressor. > */ > -#define __EXPORT_SYMBOL_NS(sym, sec, ns) > -#define __EXPORT_SYMBOL(sym, sec) > +#define __EXPORT_SYMBOL(sym, sec, ns) > > #elif defined(CONFIG_TRIM_UNUSED_KSYMS) > > @@ -147,48 +121,38 @@ struct kernel_symbol { > #define __ksym_marker(sym) \ > static int __ksym_marker_##sym[0] __section(".discard.ksym") __used > > -#define __EXPORT_SYMBOL(sym, sec) \ > +#define __EXPORT_SYMBOL(sym, sec, ns) \ > __ksym_marker(sym); \ > - __cond_export_sym(sym, sec, __is_defined(__KSYM_##sym)) > -#define __cond_export_sym(sym, sec, conf) \ > - ___cond_export_sym(sym, sec, conf) > -#define ___cond_export_sym(sym, sec, enabled) \ > - __cond_export_sym_##enabled(sym, sec) > -#define __cond_export_sym_1(sym, sec) ___EXPORT_SYMBOL(sym, sec) > -#define __cond_export_sym_0(sym, sec) /* nothing */ > - > -#define __EXPORT_SYMBOL_NS(sym, sec, ns) \ > - __ksym_marker(sym); \ > - __cond_export_ns_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) > -#define __cond_export_ns_sym(sym, sec, ns, conf) \ > - ___cond_export_ns_sym(sym, sec, ns, conf) > -#define ___cond_export_ns_sym(sym, sec, ns, enabled) \ > - __cond_export_ns_sym_##enabled(sym, sec, ns) > -#define __cond_export_ns_sym_1(sym, sec, ns) ___EXPORT_SYMBOL_NS(sym, sec, ns) > -#define __cond_export_ns_sym_0(sym, sec, ns) /* nothing */ > + __cond_export_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) > +#define __cond_export_sym(sym, sec, ns, conf) \ > + ___cond_export_sym(sym, sec, ns, conf) > +#define ___cond_export_sym(sym, sec, ns, enabled) \ > + __cond_export_sym_##enabled(sym, sec, ns) > +#define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns) > +#define __cond_export_sym_0(sym, sec, ns) /* nothing */ > > #else > > -#define __EXPORT_SYMBOL_NS(sym,sec,ns) ___EXPORT_SYMBOL_NS(sym,sec,ns) > -#define __EXPORT_SYMBOL(sym,sec) ___EXPORT_SYMBOL(sym,sec) > +#define __EXPORT_SYMBOL(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns) > > #endif /* CONFIG_MODULES */ > > #ifdef DEFAULT_SYMBOL_NAMESPACE > -#undef __EXPORT_SYMBOL > -#define __EXPORT_SYMBOL(sym, sec) \ > - __EXPORT_SYMBOL_NS(sym, sec, DEFAULT_SYMBOL_NAMESPACE) > +#include <linux/stringify.h> > +#define _EXPORT_SYMBOL(sym, sec) __EXPORT_SYMBOL(sym, sec, __stringify(DEFAULT_SYMBOL_NAMESPACE)) > +#else > +#define _EXPORT_SYMBOL(sym, sec) __EXPORT_SYMBOL(sym, sec, "") > #endif > > -#define EXPORT_SYMBOL(sym) __EXPORT_SYMBOL(sym, "") > -#define EXPORT_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_gpl") > -#define EXPORT_SYMBOL_GPL_FUTURE(sym) __EXPORT_SYMBOL(sym, "_gpl_future") > -#define EXPORT_SYMBOL_NS(sym, ns) __EXPORT_SYMBOL_NS(sym, "", ns) > -#define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL_NS(sym, "_gpl", ns) > +#define EXPORT_SYMBOL(sym) _EXPORT_SYMBOL(sym, "") > +#define EXPORT_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_gpl") > +#define EXPORT_SYMBOL_GPL_FUTURE(sym) _EXPORT_SYMBOL(sym, "_gpl_future") > +#define EXPORT_SYMBOL_NS(sym, ns) __EXPORT_SYMBOL(sym, "", #ns) > +#define EXPORT_SYMBOL_NS_GPL(sym, ns) __EXPORT_SYMBOL(sym, "_gpl", #ns) > > #ifdef CONFIG_UNUSED_SYMBOLS > -#define EXPORT_UNUSED_SYMBOL(sym) __EXPORT_SYMBOL(sym, "_unused") > -#define EXPORT_UNUSED_SYMBOL_GPL(sym) __EXPORT_SYMBOL(sym, "_unused_gpl") > +#define EXPORT_UNUSED_SYMBOL(sym) _EXPORT_SYMBOL(sym, "_unused") > +#define EXPORT_UNUSED_SYMBOL_GPL(sym) _EXPORT_SYMBOL(sym, "_unused_gpl") > #else > #define EXPORT_UNUSED_SYMBOL(sym) > #define EXPORT_UNUSED_SYMBOL_GPL(sym) > diff --git a/kernel/module.c b/kernel/module.c > index 32873bcce738..73f69ff86db5 100644 > --- a/kernel/module.c > +++ b/kernel/module.c > @@ -1399,7 +1399,7 @@ static int verify_namespace_is_imported(const struct load_info *info, > char *imported_namespace; > > namespace = kernel_symbol_namespace(sym); > - if (namespace) { > + if (namespace && namespace[0]) { > imported_namespace = get_modinfo(info, "import_ns"); > while (imported_namespace) { > if (strcmp(namespace, imported_namespace) == 0) > -- > 2.17.1 > -- Best Regards Masahiro Yamada
next prev parent reply other threads:[~2019-09-27 9:59 UTC|newest] Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-09-27 9:35 [PATCH 0/7] module: various bug-fixes and clean-ups for module namespace Masahiro Yamada 2019-09-27 9:35 ` [PATCH 1/7] modpost: fix broken sym->namespace for external module builds Masahiro Yamada 2019-09-27 9:56 ` Masahiro Yamada 2019-09-27 11:46 ` Matthias Maennich 2019-09-27 9:35 ` [PATCH 2/7] module: swap the order of symbol.namespace Masahiro Yamada 2019-09-27 12:07 ` Matthias Maennich 2019-09-27 9:35 ` [PATCH 3/7] module: rename __kstrtab_ns_* to __kstrtabns_* to avoid symbol conflict Masahiro Yamada 2019-09-27 12:14 ` Matthias Maennich 2019-09-27 9:36 ` [PATCH 4/7] module: avoid code duplication in include/linux/export.h Masahiro Yamada 2019-09-27 9:58 ` Masahiro Yamada [this message] 2019-09-27 11:07 ` Rasmus Villemoes 2019-09-27 12:36 ` Matthias Maennich 2019-10-29 19:19 ` Jessica Yu 2019-10-29 21:11 ` Rasmus Villemoes 2019-10-31 10:13 ` Jessica Yu 2019-10-31 11:03 ` Rasmus Villemoes 2019-10-31 11:26 ` Jessica Yu 2019-09-27 9:36 ` [PATCH 5/7] kbuild: fix build error of 'make nsdeps' in clean tree Masahiro Yamada 2019-09-27 12:44 ` Matthias Maennich 2019-09-27 9:36 ` [PATCH 6/7] nsdeps: fix hashbang of scripts/nsdeps Masahiro Yamada 2019-09-27 13:10 ` Matthias Maennich 2019-09-27 9:36 ` [PATCH 7/7] nsdeps: make generated patches independent of locale Masahiro Yamada 2019-09-27 13:27 ` Matthias Maennich 2019-09-27 15:42 ` Masahiro Yamada 2019-09-27 18:14 ` Greg Kroah-Hartman 2019-09-29 1:18 ` Masahiro Yamada 2019-09-29 1:30 ` Masahiro Yamada 2019-10-01 11:46 ` Matthias Maennich 2019-09-29 10:14 ` Greg Kroah-Hartman 2019-09-27 13:41 ` [PATCH 0/7] module: various bug-fixes and clean-ups for module namespace Matthias Maennich 2019-09-27 15:43 ` Masahiro Yamada 2019-10-02 18:57 ` Jessica Yu 2019-10-02 20:43 ` Matthias Maennich 2019-10-03 1:26 ` Masahiro Yamada 2019-10-03 8:03 ` Masahiro Yamada
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=CAK7LNAR1ON6XjbpzDS-WXLGB49mvXkOyddHZ4mxoA-gXNrJOzQ@mail.gmail.com \ --to=yamada.masahiro@socionext.com \ --cc=gregkh@linuxfoundation.org \ --cc=jeyu@kernel.org \ --cc=joel@joelfernandes.org \ --cc=linux-kernel@vger.kernel.org \ --cc=maco@android.com \ --cc=maennich@google.com \ --cc=will.deacon@arm.com \ --cc=will@kernel.org \ --subject='Re: [PATCH 4/7] module: avoid code duplication in include/linux/export.h' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).