From: Philipp Rudo <prudo@linux.vnet.ibm.com>
To: AKASHI Takahiro <takahiro.akashi@linaro.org>
Cc: herbert@gondor.apana.org.au, bhe@redhat.com,
ard.biesheuvel@linaro.org, catalin.marinas@arm.com,
julien.thierry@arm.com, will.deacon@arm.com,
linux-kernel@vger.kernel.org, kexec@lists.infradead.org,
dhowells@redhat.com, arnd@arndb.de,
linux-arm-kernel@lists.infradead.org, mpe@ellerman.id.au,
bauerman@linux.vnet.ibm.com, akpm@linux-foundation.org,
dyoung@redhat.com, davem@davemloft.net, vgoyal@redhat.com
Subject: Re: [PATCH v8 03/13] kexec_file, x86, powerpc: factor out kexec_file_ops functions
Date: Tue, 27 Feb 2018 10:26:38 +0100 [thread overview]
Message-ID: <20180227102638.19e8cd53@ThinkPad> (raw)
In-Reply-To: <20180227020304.GE6019@linaro.org>
On Tue, 27 Feb 2018 11:03:07 +0900
AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> On Mon, Feb 26, 2018 at 12:17:18PM +0100, Philipp Rudo wrote:
> > Hi AKASHI
> >
> > On Thu, 22 Feb 2018 20:17:22 +0900
> > AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> >
> > [...]
> >
> > > diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> > > index 990adae52151..a6d14a768b3e 100644
> > > --- a/kernel/kexec_file.c
> > > +++ b/kernel/kexec_file.c
> > > @@ -26,34 +26,83 @@
> > > #include <linux/vmalloc.h>
> > > #include "kexec_internal.h"
> > >
> > > +const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> > > +
> >
> > Having a weak definition of kexec_file_loaders causes trouble on s390 with
> > gcc 4.8 (newer versions seem to work fine). For me it looks like that in this
> > version gcc doesn't recognize __weak but use the default value for
> > optimization. This leads to _kexec_kernel_image_probe to always return ENOEXEC
> > because the for-loop gets optimized out.
>
> I gave it a try to compile with gcc 4.9 (not 4.8) for arm64
> and didn't see any errors or warnings, but
I talked to our compiler guys, and it looks like its a bug in gcc which was
introduced with gcc 4.8 and removed again with gcc 4.9. So I was just extremely
lucky hitting the sweat spot...
> > The problem can easily be worked around by declaring kexec_file_loaders in
> > include/linux/kexec.h and defining it in arch code. In particular doing this
> >
> > diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> > index 37e9dce518aa..fc0788540d90 100644
> > --- a/include/linux/kexec.h
> > +++ b/include/linux/kexec.h
> > @@ -139,6 +139,8 @@ struct kexec_file_ops {
> > #endif
> > };
> >
> > +extern const struct kexec_file_ops * const kexec_file_loaders[];
> > +
> > /**
> > * struct kexec_buf - parameters for finding a place for a buffer in memory
> > * @image: kexec image in which memory to search.
> > diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> > index 17ba407d0e79..4e3d1e4bc7f6 100644
> > --- a/kernel/kexec_file.c
> > +++ b/kernel/kexec_file.c
> > @@ -31,8 +31,6 @@
> > #include <linux/vmalloc.h>
> > #include "kexec_internal.h"
> >
> > -const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> > -
> > #ifdef CONFIG_ARCH_HAS_KEXEC_PURGATORY
> > static int kexec_calculate_store_digests(struct kimage *image);
> > #else
>
> Your change is just fine with me, too.
> I will incorporate it in my next version.
Thanks a lot
Philipp
> Thanks,
> -Takahiro AKASHI
>
> > A nice side effect of this solution is, that a developer who forgets to define
> > kexec_file_loaders gets a linker error. So he directly knows what's missing
> > instead of first having to find out where/why an error gets returned.
> >
> > Otherwise the series is fine for me.
> >
> > Thanks
> > Philipp
> >
> > > #ifdef CONFIG_ARCH_HAS_KEXEC_PURGATORY
> > > static int kexec_calculate_store_digests(struct kimage *image);
> > > #else
> > > static int kexec_calculate_store_digests(struct kimage *image) { return 0; };
> > > #endif
> > >
> > > +int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > + unsigned long buf_len)
> > > +{
> > > + const struct kexec_file_ops * const *fops;
> > > + int ret = -ENOEXEC;
> > > +
> > > + for (fops = &kexec_file_loaders[0]; *fops && (*fops)->probe; ++fops) {
> > > + ret = (*fops)->probe(buf, buf_len);
> > > + if (!ret) {
> > > + image->fops = *fops;
> > > + return ret;
> > > + }
> > > + }
> > > +
> > > + return ret;
> > > +}
> > > +
> > > /* Architectures can provide this probe function */
> > > int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > unsigned long buf_len)
> > > {
> > > - return -ENOEXEC;
> > > + return _kexec_kernel_image_probe(image, buf, buf_len);
> > > +}
> > > +
> > > +void *_kexec_kernel_image_load(struct kimage *image)
> > > +{
> > > + if (!image->fops || !image->fops->load)
> > > + return ERR_PTR(-ENOEXEC);
> > > +
> > > + return image->fops->load(image, image->kernel_buf,
> > > + image->kernel_buf_len, image->initrd_buf,
> > > + image->initrd_buf_len, image->cmdline_buf,
> > > + image->cmdline_buf_len);
> > > }
> > >
> > > void * __weak arch_kexec_kernel_image_load(struct kimage *image)
> > > {
> > > - return ERR_PTR(-ENOEXEC);
> > > + return _kexec_kernel_image_load(image);
> > > +}
> > > +
> > > +int _kimage_file_post_load_cleanup(struct kimage *image)
> > > +{
> > > + if (!image->fops || !image->fops->cleanup)
> > > + return 0;
> > > +
> > > + return image->fops->cleanup(image->image_loader_data);
> > > }
> > >
> > > int __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
> > > {
> > > - return -EINVAL;
> > > + return _kimage_file_post_load_cleanup(image);
> > > }
> > >
> > > #ifdef CONFIG_KEXEC_VERIFY_SIG
> > > +int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > + unsigned long buf_len)
> > > +{
> > > + if (!image->fops || !image->fops->verify_sig) {
> > > + pr_debug("kernel loader does not support signature verification.\n");
> > > + return -EKEYREJECTED;
> > > + }
> > > +
> > > + return image->fops->verify_sig(buf, buf_len);
> > > +}
> > > +
> > > int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > unsigned long buf_len)
> > > {
> > > - return -EKEYREJECTED;
> > > + return _kexec_kernel_verify_sig(image, buf, buf_len);
> > > }
> > > #endif
> > >
> >
>
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
WARNING: multiple messages have this Message-ID (diff)
From: prudo@linux.vnet.ibm.com (Philipp Rudo)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v8 03/13] kexec_file, x86, powerpc: factor out kexec_file_ops functions
Date: Tue, 27 Feb 2018 10:26:38 +0100 [thread overview]
Message-ID: <20180227102638.19e8cd53@ThinkPad> (raw)
In-Reply-To: <20180227020304.GE6019@linaro.org>
On Tue, 27 Feb 2018 11:03:07 +0900
AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> On Mon, Feb 26, 2018 at 12:17:18PM +0100, Philipp Rudo wrote:
> > Hi AKASHI
> >
> > On Thu, 22 Feb 2018 20:17:22 +0900
> > AKASHI Takahiro <takahiro.akashi@linaro.org> wrote:
> >
> > [...]
> >
> > > diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> > > index 990adae52151..a6d14a768b3e 100644
> > > --- a/kernel/kexec_file.c
> > > +++ b/kernel/kexec_file.c
> > > @@ -26,34 +26,83 @@
> > > #include <linux/vmalloc.h>
> > > #include "kexec_internal.h"
> > >
> > > +const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> > > +
> >
> > Having a weak definition of kexec_file_loaders causes trouble on s390 with
> > gcc 4.8 (newer versions seem to work fine). For me it looks like that in this
> > version gcc doesn't recognize __weak but use the default value for
> > optimization. This leads to _kexec_kernel_image_probe to always return ENOEXEC
> > because the for-loop gets optimized out.
>
> I gave it a try to compile with gcc 4.9 (not 4.8) for arm64
> and didn't see any errors or warnings, but
I talked to our compiler guys, and it looks like its a bug in gcc which was
introduced with gcc 4.8 and removed again with gcc 4.9. So I was just extremely
lucky hitting the sweat spot...
> > The problem can easily be worked around by declaring kexec_file_loaders in
> > include/linux/kexec.h and defining it in arch code. In particular doing this
> >
> > diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> > index 37e9dce518aa..fc0788540d90 100644
> > --- a/include/linux/kexec.h
> > +++ b/include/linux/kexec.h
> > @@ -139,6 +139,8 @@ struct kexec_file_ops {
> > #endif
> > };
> >
> > +extern const struct kexec_file_ops * const kexec_file_loaders[];
> > +
> > /**
> > * struct kexec_buf - parameters for finding a place for a buffer in memory
> > * @image: kexec image in which memory to search.
> > diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> > index 17ba407d0e79..4e3d1e4bc7f6 100644
> > --- a/kernel/kexec_file.c
> > +++ b/kernel/kexec_file.c
> > @@ -31,8 +31,6 @@
> > #include <linux/vmalloc.h>
> > #include "kexec_internal.h"
> >
> > -const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> > -
> > #ifdef CONFIG_ARCH_HAS_KEXEC_PURGATORY
> > static int kexec_calculate_store_digests(struct kimage *image);
> > #else
>
> Your change is just fine with me, too.
> I will incorporate it in my next version.
Thanks a lot
Philipp
> Thanks,
> -Takahiro AKASHI
>
> > A nice side effect of this solution is, that a developer who forgets to define
> > kexec_file_loaders gets a linker error. So he directly knows what's missing
> > instead of first having to find out where/why an error gets returned.
> >
> > Otherwise the series is fine for me.
> >
> > Thanks
> > Philipp
> >
> > > #ifdef CONFIG_ARCH_HAS_KEXEC_PURGATORY
> > > static int kexec_calculate_store_digests(struct kimage *image);
> > > #else
> > > static int kexec_calculate_store_digests(struct kimage *image) { return 0; };
> > > #endif
> > >
> > > +int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > + unsigned long buf_len)
> > > +{
> > > + const struct kexec_file_ops * const *fops;
> > > + int ret = -ENOEXEC;
> > > +
> > > + for (fops = &kexec_file_loaders[0]; *fops && (*fops)->probe; ++fops) {
> > > + ret = (*fops)->probe(buf, buf_len);
> > > + if (!ret) {
> > > + image->fops = *fops;
> > > + return ret;
> > > + }
> > > + }
> > > +
> > > + return ret;
> > > +}
> > > +
> > > /* Architectures can provide this probe function */
> > > int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > unsigned long buf_len)
> > > {
> > > - return -ENOEXEC;
> > > + return _kexec_kernel_image_probe(image, buf, buf_len);
> > > +}
> > > +
> > > +void *_kexec_kernel_image_load(struct kimage *image)
> > > +{
> > > + if (!image->fops || !image->fops->load)
> > > + return ERR_PTR(-ENOEXEC);
> > > +
> > > + return image->fops->load(image, image->kernel_buf,
> > > + image->kernel_buf_len, image->initrd_buf,
> > > + image->initrd_buf_len, image->cmdline_buf,
> > > + image->cmdline_buf_len);
> > > }
> > >
> > > void * __weak arch_kexec_kernel_image_load(struct kimage *image)
> > > {
> > > - return ERR_PTR(-ENOEXEC);
> > > + return _kexec_kernel_image_load(image);
> > > +}
> > > +
> > > +int _kimage_file_post_load_cleanup(struct kimage *image)
> > > +{
> > > + if (!image->fops || !image->fops->cleanup)
> > > + return 0;
> > > +
> > > + return image->fops->cleanup(image->image_loader_data);
> > > }
> > >
> > > int __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
> > > {
> > > - return -EINVAL;
> > > + return _kimage_file_post_load_cleanup(image);
> > > }
> > >
> > > #ifdef CONFIG_KEXEC_VERIFY_SIG
> > > +int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > + unsigned long buf_len)
> > > +{
> > > + if (!image->fops || !image->fops->verify_sig) {
> > > + pr_debug("kernel loader does not support signature verification.\n");
> > > + return -EKEYREJECTED;
> > > + }
> > > +
> > > + return image->fops->verify_sig(buf, buf_len);
> > > +}
> > > +
> > > int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > unsigned long buf_len)
> > > {
> > > - return -EKEYREJECTED;
> > > + return _kexec_kernel_verify_sig(image, buf, buf_len);
> > > }
> > > #endif
> > >
> >
>
next prev parent reply other threads:[~2018-02-27 9:27 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-22 11:17 [PATCH v8 00/13] arm64: kexec: add kexec_file_load() support AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 01/13] resource: add walk_system_ram_res_rev() AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-23 8:36 ` Dave Young
2018-02-23 8:36 ` Dave Young
2018-03-20 1:43 ` Baoquan He
2018-03-20 1:43 ` Baoquan He
2018-03-20 3:12 ` AKASHI Takahiro
2018-03-20 3:12 ` AKASHI Takahiro
2018-03-20 3:48 ` Baoquan He
2018-03-20 3:48 ` Baoquan He
2018-02-22 11:17 ` [PATCH v8 02/13] kexec_file: make an use of purgatory optional AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-23 8:49 ` Dave Young
2018-02-23 8:49 ` Dave Young
2018-02-26 10:24 ` AKASHI Takahiro
2018-02-26 10:24 ` AKASHI Takahiro
2018-02-28 12:33 ` Dave Young
2018-02-28 12:33 ` Dave Young
2018-03-01 2:59 ` AKASHI Takahiro
2018-03-01 2:59 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 03/13] kexec_file, x86, powerpc: factor out kexec_file_ops functions AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-23 9:24 ` [PATCH v8 03/13] kexec_file,x86,powerpc: " Dave Young
2018-02-23 9:24 ` Dave Young
2018-02-26 10:01 ` AKASHI Takahiro
2018-02-26 10:01 ` AKASHI Takahiro
2018-02-26 11:25 ` Philipp Rudo
2018-02-26 11:25 ` Philipp Rudo
2018-02-28 12:38 ` Dave Young
2018-02-28 12:38 ` Dave Young
2018-03-01 3:18 ` AKASHI Takahiro
2018-03-01 3:18 ` AKASHI Takahiro
2018-02-26 11:17 ` [PATCH v8 03/13] kexec_file, x86, powerpc: " Philipp Rudo
2018-02-26 11:17 ` Philipp Rudo
2018-02-27 2:03 ` AKASHI Takahiro
2018-02-27 2:03 ` AKASHI Takahiro
2018-02-27 9:26 ` Philipp Rudo [this message]
2018-02-27 9:26 ` Philipp Rudo
2018-02-22 11:17 ` [PATCH v8 04/13] x86: kexec_file: factor out elf core header related functions AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-24 3:15 ` Dave Young
2018-02-24 3:15 ` Dave Young
2018-02-26 9:21 ` AKASHI Takahiro
2018-02-26 9:21 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 05/13] kexec_file, x86: move re-factored code to generic side AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 06/13] asm-generic: add kexec_file_load system call to unistd.h AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 07/13] arm64: kexec_file: invoke the kernel without purgatory AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 08/13] arm64: kexec_file: load initrd and device-tree AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 09/13] arm64: kexec_file: add crash dump support AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 10/13] arm64: kexec_file: add Image format support AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 11/13] arm64: kexec_file: enable KEXEC_FILE config AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 12/13] include: pe.h: remove message[] from mz header definition AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-22 11:17 ` [PATCH v8 13/13] arm64: kexec_file: enable KEXEC_VERIFY_SIG for Image AKASHI Takahiro
2018-02-22 11:17 ` AKASHI Takahiro
2018-02-27 4:56 ` [PATCH v8 00/13] arm64: kexec: add kexec_file_load() support AKASHI Takahiro
2018-02-27 4:56 ` AKASHI Takahiro
2018-02-28 12:25 ` Dave Young
2018-02-28 12:25 ` Dave Young
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=20180227102638.19e8cd53@ThinkPad \
--to=prudo@linux.vnet.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=ard.biesheuvel@linaro.org \
--cc=arnd@arndb.de \
--cc=bauerman@linux.vnet.ibm.com \
--cc=bhe@redhat.com \
--cc=catalin.marinas@arm.com \
--cc=davem@davemloft.net \
--cc=dhowells@redhat.com \
--cc=dyoung@redhat.com \
--cc=herbert@gondor.apana.org.au \
--cc=julien.thierry@arm.com \
--cc=kexec@lists.infradead.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mpe@ellerman.id.au \
--cc=takahiro.akashi@linaro.org \
--cc=vgoyal@redhat.com \
--cc=will.deacon@arm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.