Re: [PATCH 3/4] module: unexport each_symbol()

Tim Abbott
2009-09-23T17:34:30Z

Hi Alan,

I really like what you're doing with this patch series; using a binary
search for the symbol table has been something I've wanted to do in the
kernel's module loader ever since I optimized Ksplice's symbol resolution
code to use binary rather than linear searches.

While Ksplice is not in-tree yet, Ksplice is a user of each_symbol (and in
fact was the reason why each_symbol was originally exported). Is it easy
to modify your patch series so that you don't have to remove each_symbol?

Best regards,
-Tim Abbott

On Tue, 22 Sep 2009, Alan Jenkins wrote:

> find_symbol() is about to be re-written to avoid traversing every single
> exported symbol. each_symbol() has acquired no other in-tree user, so
> let us remove it.
>
> Also struct symsearch is useless outside of module.c, so move it there
> instead of cluttering up module.h.
>
> Signed-off-by: Alan Jenkins <alan-jenkins@tuffmail.co.uk>
> ---
> include/linux/module.h | 15 ---------------
> kernel/module.c | 14 ++++++++++++--
> 2 files changed, 12 insertions(+), 17 deletions(-)
>
> diff --git a/include/linux/module.h b/include/linux/module.h
> index 65b62e9..df25f99 100644
> --- a/include/linux/module.h
> +++ b/include/linux/module.h
> @@ -348,17 +348,6 @@ static inline int within_module_init(unsigned long addr, struct module *mod)
> /* Search for module by name: must hold module_mutex. */
> struct module *find_module(const char *name);
>
> -struct symsearch {
> - const struct kernel_symbol *start, *stop;
> - const unsigned long *crcs;
> - enum {
> - NOT_GPL_ONLY,
> - GPL_ONLY,
> - WILL_BE_GPL_ONLY,
> - } licence;
> - bool unused;
> -};
> -
> /* Search for an exported symbol by name. */
> const struct kernel_symbol *find_symbol(const char *name,
> struct module **owner,
> @@ -366,10 +355,6 @@ const struct kernel_symbol *find_symbol(const char *name,
> bool gplok,
> bool warn);
>
> -/* Walk the exported symbol table */
> -bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
> - unsigned int symnum, void *data), void *data);
> -
> /* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
> symnum out of range. */
> int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
> diff --git a/kernel/module.c b/kernel/module.c
> index 2d53718..b24fc55 100644
> --- a/kernel/module.c
> +++ b/kernel/module.c
> @@ -186,6 +186,17 @@ extern const unsigned long __start___kcrctab_unused[];
> extern const unsigned long __start___kcrctab_unused_gpl[];
> #endif
>
> +struct symsearch {
> + const struct kernel_symbol *start, *stop;
> + const unsigned long *crcs;
> + enum {
> + NOT_GPL_ONLY,
> + GPL_ONLY,
> + WILL_BE_GPL_ONLY,
> + } licence;
> + bool unused;
> +};
> +
> #ifndef CONFIG_MODVERSIONS
> #define symversion(base, idx) NULL
> #else
> @@ -212,7 +223,7 @@ static bool each_symbol_in_section(const struct symsearch *arr,
> }
>
> /* Returns true as soon as fn returns true, otherwise false. */
> -bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
> +static bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
> unsigned int symnum, void *data), void *data)
> {
> struct module *mod;
> @@ -266,7 +277,6 @@ bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
> }
> return false;
> }
> -EXPORT_SYMBOL_GPL(each_symbol);
>
> struct find_symbol_arg {
> /* Input */
> --
> 1.6.3.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>