From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-kernel@vger.kernel.org, Fenghua Yu <fenghua.yu@intel.com>,
Tony Luck <tony.luck@intel.com>, Joe Perches <joe@perches.com>
Subject: Re: [PATCH] lib: Fix ia64 bootloader linkage
Date: Tue, 16 Oct 2018 18:03:35 +0300 [thread overview]
Message-ID: <20181016150335.GZ15943@smile.fi.intel.com> (raw)
In-Reply-To: <20181016111340.8046-1-alexander.shishkin@linux.intel.com>
On Tue, Oct 16, 2018 at 02:13:40PM +0300, Alexander Shishkin wrote:
> kbuild robot reports that since commit ce76d938dd98 ("lib: Add memcat_p():
> paste 2 pointer arrays together") the ia64/hp/sim/boot fails to link:
>
> > LD arch/ia64/hp/sim/boot/bootloader
> > lib/string.o: In function `__memcat_p':
> > string.c:(.text+0x1f22): undefined reference to `__kmalloc'
> > string.c:(.text+0x1ff2): undefined reference to `__kmalloc'
> > make[1]: *** [arch/ia64/hp/sim/boot/Makefile:37: arch/ia64/hp/sim/boot/bootloader] Error 1
>
> The reason is, the above commit, via __memcat_p(), adds a call to
> __kmalloc to string.o, which happens to be used in the bootloader, but
> there's no kmalloc or slab or anything.
>
> Since the linker would only pull in objects that contain referenced
> symbols, moving __memcat_p() to a different compilation unit solves the
> problem.
>
Oh, nice catch!
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Perhaps checkpatch.pl can somehow catch these...
> Fixes: ce76d938dd98 ("lib: Add memcat_p(): paste 2 pointer arrays together")
> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Reported-by: kbuild test robot <lkp@intel.com>
> Cc: Fenghua Yu <fenghua.yu@intel.com>
> Cc: Tony Luck <tony.luck@intel.com>
> Cc: Joe Perches <joe@perches.com>
> ---
> lib/Makefile | 2 +-
> lib/memcat_p.c | 34 ++++++++++++++++++++++++++++++++++
> lib/string.c | 30 ------------------------------
> lib/test_memcat_p.c | 2 +-
> 4 files changed, 36 insertions(+), 32 deletions(-)
> create mode 100644 lib/memcat_p.c
>
> diff --git a/lib/Makefile b/lib/Makefile
> index c2588a2d7b1e..40e79f88c3cd 100644
> --- a/lib/Makefile
> +++ b/lib/Makefile
> @@ -24,7 +24,7 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \
> flex_proportions.o ratelimit.o show_mem.o \
> is_single_threaded.o plist.o decompress.o kobject_uevent.o \
> earlycpio.o seq_buf.o siphash.o dec_and_lock.o \
> - nmi_backtrace.o nodemask.o win_minmax.o
> + nmi_backtrace.o nodemask.o win_minmax.o memcat_p.o
>
> lib-$(CONFIG_PRINTK) += dump_stack.o
> lib-$(CONFIG_MMU) += ioremap.o
> diff --git a/lib/memcat_p.c b/lib/memcat_p.c
> new file mode 100644
> index 000000000000..b810fbc66962
> --- /dev/null
> +++ b/lib/memcat_p.c
> @@ -0,0 +1,34 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <linux/slab.h>
> +
> +/*
> + * Merge two NULL-terminated pointer arrays into a newly allocated
> + * array, which is also NULL-terminated. Nomenclature is inspired by
> + * memset_p() and memcat() found elsewhere in the kernel source tree.
> + */
> +void **__memcat_p(void **a, void **b)
> +{
> + void **p = a, **new;
> + int nr;
> +
> + /* count the elements in both arrays */
> + for (nr = 0, p = a; *p; nr++, p++)
> + ;
> + for (p = b; *p; nr++, p++)
> + ;
> + /* one for the NULL-terminator */
> + nr++;
> +
> + new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL);
> + if (!new)
> + return NULL;
> +
> + /* nr -> last index; p points to NULL in b[] */
> + for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1)
> + new[nr] = *p;
> +
> + return new;
> +}
> +EXPORT_SYMBOL_GPL(__memcat_p);
> +
> diff --git a/lib/string.c b/lib/string.c
> index 453f35994eb6..38e4ca08e757 100644
> --- a/lib/string.c
> +++ b/lib/string.c
> @@ -891,36 +891,6 @@ void *memscan(void *addr, int c, size_t size)
> EXPORT_SYMBOL(memscan);
> #endif
>
> -/*
> - * Merge two NULL-terminated pointer arrays into a newly allocated
> - * array, which is also NULL-terminated. Nomenclature is inspired by
> - * memset_p() and memcat() found elsewhere in the kernel source tree.
> - */
> -void **__memcat_p(void **a, void **b)
> -{
> - void **p = a, **new;
> - int nr;
> -
> - /* count the elements in both arrays */
> - for (nr = 0, p = a; *p; nr++, p++)
> - ;
> - for (p = b; *p; nr++, p++)
> - ;
> - /* one for the NULL-terminator */
> - nr++;
> -
> - new = kmalloc_array(nr, sizeof(void *), GFP_KERNEL);
> - if (!new)
> - return NULL;
> -
> - /* nr -> last index; p points to NULL in b[] */
> - for (nr--; nr >= 0; nr--, p = p == b ? &a[nr] : p - 1)
> - new[nr] = *p;
> -
> - return new;
> -}
> -EXPORT_SYMBOL_GPL(__memcat_p);
> -
> #ifndef __HAVE_ARCH_STRSTR
> /**
> * strstr - Find the first substring in a %NUL terminated string
> diff --git a/lib/test_memcat_p.c b/lib/test_memcat_p.c
> index 2b163a749ecb..849c477d49d0 100644
> --- a/lib/test_memcat_p.c
> +++ b/lib/test_memcat_p.c
> @@ -1,6 +1,6 @@
> // SPDX-License-Identifier: GPL-2.0
> /*
> - * Test cases for memcat_p() in lib/string.c
> + * Test cases for memcat_p() in lib/memcat_p.c
> */
> #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
>
> --
> 2.19.1
>
--
With Best Regards,
Andy Shevchenko
prev parent reply other threads:[~2018-10-16 15:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <201810161649.o89WBjtC%fengguang.wu@intel.com>
2018-10-16 11:13 ` [PATCH] lib: Fix ia64 bootloader linkage Alexander Shishkin
2018-10-16 15:03 ` Andy Shevchenko [this message]
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=20181016150335.GZ15943@smile.fi.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=fenghua.yu@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=joe@perches.com \
--cc=linux-kernel@vger.kernel.org \
--cc=tony.luck@intel.com \
/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
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox