On 03/21/2016 07:14 PM, Rasmus Villemoes wrote:
> Using kasprintf to get the function name makes us look up the name
> twice, along with all the vsnprintf overhead of parsing the format
> string etc. It also means there is an allocation failure case to deal
> with. Since symbol_string in vsprintf.c would anyway allocate an array
> of size KSYM_SYMBOL_LEN on the stack, that might as well be done up
> here.
> 
> Moreover, since this is a debug feature and the blacklisted_initcalls
> list is usually empty, we might as well test that and thus avoid
> looking up the symbol name even once in the common case.
> 
> Signed-off-by: Rasmus Villemoes <[email protected]>


Acked-by: Prarit Bhargava <[email protected]>

P.


> ---
>  init/main.c | 9 ++++-----
>  1 file changed, 4 insertions(+), 5 deletions(-)
> 
> diff --git a/init/main.c b/init/main.c
> index b3c6e363ae18..d76d94cd537c 100644
> --- a/init/main.c
> +++ b/init/main.c
> @@ -706,21 +706,20 @@ static int __init initcall_blacklist(char *str)
>  static bool __init_or_module initcall_blacklisted(initcall_t fn)
>  {
>       struct blacklist_entry *entry;
> -     char *fn_name;
> +     char fn_name[KSYM_SYMBOL_LEN];
>  
> -     fn_name = kasprintf(GFP_KERNEL, "%pf", fn);
> -     if (!fn_name)
> +     if (list_empty(&blacklisted_initcalls))
>               return false;
>  
> +     sprint_symbol_no_offset(fn_name, (unsigned long)fn);
> +
>       list_for_each_entry(entry, &blacklisted_initcalls, next) {
>               if (!strcmp(fn_name, entry->buf)) {
>                       pr_debug("initcall %s blacklisted\n", fn_name);
> -                     kfree(fn_name);
>                       return true;
>               }
>       }
>  
> -     kfree(fn_name);
>       return false;
>  }
>  #else
> 

Reply via email to