From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Julien Thierry <julien.thierry@arm.com>
Cc: herbert@gondor.apana.org.au, bhe@redhat.com,
ard.biesheuvel@linaro.org, catalin.marinas@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 v4 03/10] kexec_file: factor out arch_kexec_kernel_*() from x86, powerpc
Date: Fri, 6 Oct 2017 16:06:24 +0900 [thread overview]
Message-ID: <20171006070623.GB6756@linaro.org> (raw)
In-Reply-To: <5f65195f-4a6f-c2c1-d346-36541e263c64@arm.com>
On Thu, Oct 05, 2017 at 11:21:38AM +0100, Julien Thierry wrote:
> Hi Takahiro,
>
> On 02/10/17 07:14, AKASHI Takahiro wrote:
> >arch_kexec_kernel_*() and arch_kimage_file_post_load_cleanup can now be
> >duplicated among some architectures, so let's factor them out.
> >
> >Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> >Cc: Dave Young <dyoung@redhat.com>
> >Cc: Vivek Goyal <vgoyal@redhat.com>
> >Cc: Baoquan He <bhe@redhat.com>
> >Cc: Michael Ellerman <mpe@ellerman.id.au>
> >Cc: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
> >---
> > arch/powerpc/kernel/kexec_elf_64.c | 2 +-
> > arch/powerpc/kernel/machine_kexec_file_64.c | 36 ++---------------
> > arch/x86/kernel/kexec-bzimage64.c | 2 +-
> > arch/x86/kernel/machine_kexec_64.c | 45 +--------------------
> > include/linux/kexec.h | 15 +++----
> > kernel/kexec_file.c | 63 ++++++++++++++++++++++++++---
> > 6 files changed, 73 insertions(+), 90 deletions(-)
> >
> >diff --git a/arch/powerpc/kernel/kexec_elf_64.c b/arch/powerpc/kernel/kexec_elf_64.c
> >index 9a42309b091a..6c78c11c7faf 100644
> >--- a/arch/powerpc/kernel/kexec_elf_64.c
> >+++ b/arch/powerpc/kernel/kexec_elf_64.c
> >@@ -657,7 +657,7 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
> > return ret ? ERR_PTR(ret) : fdt;
> > }
> >-struct kexec_file_ops kexec_elf64_ops = {
> >+const struct kexec_file_ops kexec_elf64_ops = {
> > .probe = elf64_probe,
> > .load = elf64_load,
> > };
> >diff --git a/arch/powerpc/kernel/machine_kexec_file_64.c b/arch/powerpc/kernel/machine_kexec_file_64.c
> >index 992c0d258e5d..e7ce78857f0b 100644
> >--- a/arch/powerpc/kernel/machine_kexec_file_64.c
> >+++ b/arch/powerpc/kernel/machine_kexec_file_64.c
> >@@ -31,8 +31,9 @@
> > #define SLAVE_CODE_SIZE 256
> >-static struct kexec_file_ops *kexec_file_loaders[] = {
> >+const struct kexec_file_ops * const kexec_file_loaders[] = {
> > &kexec_elf64_ops,
> >+ NULL
> > };
> > int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >@@ -45,38 +46,7 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > if (image->type == KEXEC_TYPE_CRASH)
> > return -ENOTSUPP;
> >- for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
> >- fops = kexec_file_loaders[i];
> >- if (!fops || !fops->probe)
> >- continue;
> >-
> >- ret = fops->probe(buf, buf_len);
> >- if (!ret) {
> >- image->fops = fops;
> >- return ret;
> >- }
> >- }
> >-
> >- return ret;
> >-}
> >-
> >-void *arch_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);
> >-}
> >-
> >-int arch_kimage_file_post_load_cleanup(struct kimage *image)
> >-{
> >- if (!image->fops || !image->fops->cleanup)
> >- return 0;
> >-
> >- return image->fops->cleanup(image->image_loader_data);
> >+ return _kexec_kernel_image_probe(image, buf, buf_len);
> > }
> > /**
> >diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c
> >index fb095ba0c02f..705654776c0c 100644
> >--- a/arch/x86/kernel/kexec-bzimage64.c
> >+++ b/arch/x86/kernel/kexec-bzimage64.c
> >@@ -538,7 +538,7 @@ static int bzImage64_verify_sig(const char *kernel, unsigned long kernel_len)
> > }
> > #endif
> >-struct kexec_file_ops kexec_bzImage64_ops = {
> >+const struct kexec_file_ops kexec_bzImage64_ops = {
> > .probe = bzImage64_probe,
> > .load = bzImage64_load,
> > .cleanup = bzImage64_cleanup,
> >diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
> >index 1f790cf9d38f..2cdd29d64181 100644
> >--- a/arch/x86/kernel/machine_kexec_64.c
> >+++ b/arch/x86/kernel/machine_kexec_64.c
> >@@ -30,8 +30,9 @@
> > #include <asm/set_memory.h>
> > #ifdef CONFIG_KEXEC_FILE
> >-static struct kexec_file_ops *kexec_file_loaders[] = {
> >+const struct kexec_file_ops * const kexec_file_loaders[] = {
> > &kexec_bzImage64_ops,
> >+ NULL
> > };
> > #endif
> >@@ -363,27 +364,6 @@ void arch_crash_save_vmcoreinfo(void)
> > /* arch-dependent functionality related to kexec file-based syscall */
> > #ifdef CONFIG_KEXEC_FILE
> >-int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >- unsigned long buf_len)
> >-{
> >- int i, ret = -ENOEXEC;
> >- struct kexec_file_ops *fops;
> >-
> >- for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
> >- fops = kexec_file_loaders[i];
> >- if (!fops || !fops->probe)
> >- continue;
> >-
> >- ret = fops->probe(buf, buf_len);
> >- if (!ret) {
> >- image->fops = fops;
> >- return ret;
> >- }
> >- }
> >-
> >- return ret;
> >-}
> >-
> > void *arch_kexec_kernel_image_load(struct kimage *image)
> > {
> > vfree(image->arch.elf_headers);
> >@@ -398,27 +378,6 @@ void *arch_kexec_kernel_image_load(struct kimage *image)
> > image->cmdline_buf_len);
> > }
> >-int arch_kimage_file_post_load_cleanup(struct kimage *image)
> >-{
> >- if (!image->fops || !image->fops->cleanup)
> >- return 0;
> >-
> >- return image->fops->cleanup(image->image_loader_data);
> >-}
> >-
> >-#ifdef CONFIG_KEXEC_VERIFY_SIG
> >-int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel,
> >- unsigned long kernel_len)
> >-{
> >- if (!image->fops || !image->fops->verify_sig) {
> >- pr_debug("kernel loader does not support signature verification.");
> >- return -EKEYREJECTED;
> >- }
> >-
> >- return image->fops->verify_sig(kernel, kernel_len);
> >-}
> >-#endif
> >-
> > /*
> > * Apply purgatory relocations.
> > *
> >diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> >index 2b7590f5483a..c64c29c1fb0e 100644
> >--- a/include/linux/kexec.h
> >+++ b/include/linux/kexec.h
> >@@ -208,7 +208,7 @@ struct kimage {
> > unsigned long cmdline_buf_len;
> > /* File operations provided by image loader */
> >- struct kexec_file_ops *fops;
> >+ const struct kexec_file_ops *fops;
> > /* Image loader handling the kernel can store a pointer here */
> > void *image_loader_data;
> >@@ -276,12 +276,13 @@ int crash_shrink_memory(unsigned long new_size);
> > size_t crash_get_memory_size(void);
> > void crash_free_reserved_phys_range(unsigned long begin, unsigned long end);
> >-int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >- unsigned long buf_len);
> >-void * __weak arch_kexec_kernel_image_load(struct kimage *image);
> >-int __weak arch_kimage_file_post_load_cleanup(struct kimage *image);
> >-int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
> >- unsigned long buf_len);
> >+int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> >+ unsigned long buf_len);
> >+void *_kexec_kernel_image_load(struct kimage *image);
> >+int _kexec_kernel_post_load_cleanup(struct kimage *image);
> >+int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> >+ unsigned long buf_len);
> >+
> > int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
> > Elf_Shdr *sechdrs, unsigned int relsec);
> > int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
> >diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> >index 9f48f4412297..130965b28392 100644
> >--- a/kernel/kexec_file.c
> >+++ b/kernel/kexec_file.c
> >@@ -26,30 +26,83 @@
> > #include <linux/vmalloc.h>
> > #include "kexec_internal.h"
> >+const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> >+
> > static int kexec_calculate_store_digests(struct kimage *image);
> >+int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> >+ unsigned long buf_len)
> >+{
> >+ int i, ret = -ENOEXEC;
> >+ const struct kexec_file_ops *fops;
> >+
> >+ for (i = 0; ; i++) {
> >+ fops = kexec_file_loaders[i];
> >+ if (!fops || !fops->probe)
> >+ break;
> >+
>
> Could we have something like:
>
> for (fops = &kexec_file_loaders[0]; fops && fops->probe; ++fops) {
> [...]
> }
>
> And get rid of i? I think it's nicer to have the condition clearly stated in
> the loop.
Okay
I will also fix kbuild errors for x86 & powerpc.
Thanks,
-Takahiro AKASHI
> Thanks,
>
> >+ 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 __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
> >+int _kexec_kernel_post_load_cleanup(struct kimage *image)
> > {
> >- return -EINVAL;
> >+ if (!image->fops || !image->fops->cleanup)
> >+ return 0;
> >+
> >+ return image->fops->cleanup(image->image_loader_data);
> >+}
> >+
> >+int __weak arch_kexec_kernel_post_load_cleanup(struct kimage *image)
> >+{
> >+ return _kexec_kernel_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
> >
>
> --
> Julien Thierry
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
WARNING: multiple messages have this Message-ID (diff)
From: takahiro.akashi@linaro.org (AKASHI Takahiro)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4 03/10] kexec_file: factor out arch_kexec_kernel_*() from x86, powerpc
Date: Fri, 6 Oct 2017 16:06:24 +0900 [thread overview]
Message-ID: <20171006070623.GB6756@linaro.org> (raw)
In-Reply-To: <5f65195f-4a6f-c2c1-d346-36541e263c64@arm.com>
On Thu, Oct 05, 2017 at 11:21:38AM +0100, Julien Thierry wrote:
> Hi Takahiro,
>
> On 02/10/17 07:14, AKASHI Takahiro wrote:
> >arch_kexec_kernel_*() and arch_kimage_file_post_load_cleanup can now be
> >duplicated among some architectures, so let's factor them out.
> >
> >Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> >Cc: Dave Young <dyoung@redhat.com>
> >Cc: Vivek Goyal <vgoyal@redhat.com>
> >Cc: Baoquan He <bhe@redhat.com>
> >Cc: Michael Ellerman <mpe@ellerman.id.au>
> >Cc: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
> >---
> > arch/powerpc/kernel/kexec_elf_64.c | 2 +-
> > arch/powerpc/kernel/machine_kexec_file_64.c | 36 ++---------------
> > arch/x86/kernel/kexec-bzimage64.c | 2 +-
> > arch/x86/kernel/machine_kexec_64.c | 45 +--------------------
> > include/linux/kexec.h | 15 +++----
> > kernel/kexec_file.c | 63 ++++++++++++++++++++++++++---
> > 6 files changed, 73 insertions(+), 90 deletions(-)
> >
> >diff --git a/arch/powerpc/kernel/kexec_elf_64.c b/arch/powerpc/kernel/kexec_elf_64.c
> >index 9a42309b091a..6c78c11c7faf 100644
> >--- a/arch/powerpc/kernel/kexec_elf_64.c
> >+++ b/arch/powerpc/kernel/kexec_elf_64.c
> >@@ -657,7 +657,7 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
> > return ret ? ERR_PTR(ret) : fdt;
> > }
> >-struct kexec_file_ops kexec_elf64_ops = {
> >+const struct kexec_file_ops kexec_elf64_ops = {
> > .probe = elf64_probe,
> > .load = elf64_load,
> > };
> >diff --git a/arch/powerpc/kernel/machine_kexec_file_64.c b/arch/powerpc/kernel/machine_kexec_file_64.c
> >index 992c0d258e5d..e7ce78857f0b 100644
> >--- a/arch/powerpc/kernel/machine_kexec_file_64.c
> >+++ b/arch/powerpc/kernel/machine_kexec_file_64.c
> >@@ -31,8 +31,9 @@
> > #define SLAVE_CODE_SIZE 256
> >-static struct kexec_file_ops *kexec_file_loaders[] = {
> >+const struct kexec_file_ops * const kexec_file_loaders[] = {
> > &kexec_elf64_ops,
> >+ NULL
> > };
> > int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >@@ -45,38 +46,7 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > if (image->type == KEXEC_TYPE_CRASH)
> > return -ENOTSUPP;
> >- for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
> >- fops = kexec_file_loaders[i];
> >- if (!fops || !fops->probe)
> >- continue;
> >-
> >- ret = fops->probe(buf, buf_len);
> >- if (!ret) {
> >- image->fops = fops;
> >- return ret;
> >- }
> >- }
> >-
> >- return ret;
> >-}
> >-
> >-void *arch_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);
> >-}
> >-
> >-int arch_kimage_file_post_load_cleanup(struct kimage *image)
> >-{
> >- if (!image->fops || !image->fops->cleanup)
> >- return 0;
> >-
> >- return image->fops->cleanup(image->image_loader_data);
> >+ return _kexec_kernel_image_probe(image, buf, buf_len);
> > }
> > /**
> >diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c
> >index fb095ba0c02f..705654776c0c 100644
> >--- a/arch/x86/kernel/kexec-bzimage64.c
> >+++ b/arch/x86/kernel/kexec-bzimage64.c
> >@@ -538,7 +538,7 @@ static int bzImage64_verify_sig(const char *kernel, unsigned long kernel_len)
> > }
> > #endif
> >-struct kexec_file_ops kexec_bzImage64_ops = {
> >+const struct kexec_file_ops kexec_bzImage64_ops = {
> > .probe = bzImage64_probe,
> > .load = bzImage64_load,
> > .cleanup = bzImage64_cleanup,
> >diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
> >index 1f790cf9d38f..2cdd29d64181 100644
> >--- a/arch/x86/kernel/machine_kexec_64.c
> >+++ b/arch/x86/kernel/machine_kexec_64.c
> >@@ -30,8 +30,9 @@
> > #include <asm/set_memory.h>
> > #ifdef CONFIG_KEXEC_FILE
> >-static struct kexec_file_ops *kexec_file_loaders[] = {
> >+const struct kexec_file_ops * const kexec_file_loaders[] = {
> > &kexec_bzImage64_ops,
> >+ NULL
> > };
> > #endif
> >@@ -363,27 +364,6 @@ void arch_crash_save_vmcoreinfo(void)
> > /* arch-dependent functionality related to kexec file-based syscall */
> > #ifdef CONFIG_KEXEC_FILE
> >-int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >- unsigned long buf_len)
> >-{
> >- int i, ret = -ENOEXEC;
> >- struct kexec_file_ops *fops;
> >-
> >- for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
> >- fops = kexec_file_loaders[i];
> >- if (!fops || !fops->probe)
> >- continue;
> >-
> >- ret = fops->probe(buf, buf_len);
> >- if (!ret) {
> >- image->fops = fops;
> >- return ret;
> >- }
> >- }
> >-
> >- return ret;
> >-}
> >-
> > void *arch_kexec_kernel_image_load(struct kimage *image)
> > {
> > vfree(image->arch.elf_headers);
> >@@ -398,27 +378,6 @@ void *arch_kexec_kernel_image_load(struct kimage *image)
> > image->cmdline_buf_len);
> > }
> >-int arch_kimage_file_post_load_cleanup(struct kimage *image)
> >-{
> >- if (!image->fops || !image->fops->cleanup)
> >- return 0;
> >-
> >- return image->fops->cleanup(image->image_loader_data);
> >-}
> >-
> >-#ifdef CONFIG_KEXEC_VERIFY_SIG
> >-int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel,
> >- unsigned long kernel_len)
> >-{
> >- if (!image->fops || !image->fops->verify_sig) {
> >- pr_debug("kernel loader does not support signature verification.");
> >- return -EKEYREJECTED;
> >- }
> >-
> >- return image->fops->verify_sig(kernel, kernel_len);
> >-}
> >-#endif
> >-
> > /*
> > * Apply purgatory relocations.
> > *
> >diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> >index 2b7590f5483a..c64c29c1fb0e 100644
> >--- a/include/linux/kexec.h
> >+++ b/include/linux/kexec.h
> >@@ -208,7 +208,7 @@ struct kimage {
> > unsigned long cmdline_buf_len;
> > /* File operations provided by image loader */
> >- struct kexec_file_ops *fops;
> >+ const struct kexec_file_ops *fops;
> > /* Image loader handling the kernel can store a pointer here */
> > void *image_loader_data;
> >@@ -276,12 +276,13 @@ int crash_shrink_memory(unsigned long new_size);
> > size_t crash_get_memory_size(void);
> > void crash_free_reserved_phys_range(unsigned long begin, unsigned long end);
> >-int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >- unsigned long buf_len);
> >-void * __weak arch_kexec_kernel_image_load(struct kimage *image);
> >-int __weak arch_kimage_file_post_load_cleanup(struct kimage *image);
> >-int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
> >- unsigned long buf_len);
> >+int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> >+ unsigned long buf_len);
> >+void *_kexec_kernel_image_load(struct kimage *image);
> >+int _kexec_kernel_post_load_cleanup(struct kimage *image);
> >+int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> >+ unsigned long buf_len);
> >+
> > int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
> > Elf_Shdr *sechdrs, unsigned int relsec);
> > int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
> >diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> >index 9f48f4412297..130965b28392 100644
> >--- a/kernel/kexec_file.c
> >+++ b/kernel/kexec_file.c
> >@@ -26,30 +26,83 @@
> > #include <linux/vmalloc.h>
> > #include "kexec_internal.h"
> >+const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> >+
> > static int kexec_calculate_store_digests(struct kimage *image);
> >+int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> >+ unsigned long buf_len)
> >+{
> >+ int i, ret = -ENOEXEC;
> >+ const struct kexec_file_ops *fops;
> >+
> >+ for (i = 0; ; i++) {
> >+ fops = kexec_file_loaders[i];
> >+ if (!fops || !fops->probe)
> >+ break;
> >+
>
> Could we have something like:
>
> for (fops = &kexec_file_loaders[0]; fops && fops->probe; ++fops) {
> [...]
> }
>
> And get rid of i? I think it's nicer to have the condition clearly stated in
> the loop.
Okay
I will also fix kbuild errors for x86 & powerpc.
Thanks,
-Takahiro AKASHI
> Thanks,
>
> >+ 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 __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
> >+int _kexec_kernel_post_load_cleanup(struct kimage *image)
> > {
> >- return -EINVAL;
> >+ if (!image->fops || !image->fops->cleanup)
> >+ return 0;
> >+
> >+ return image->fops->cleanup(image->image_loader_data);
> >+}
> >+
> >+int __weak arch_kexec_kernel_post_load_cleanup(struct kimage *image)
> >+{
> >+ return _kexec_kernel_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
> >
>
> --
> Julien Thierry
WARNING: multiple messages have this Message-ID (diff)
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Julien Thierry <julien.thierry@arm.com>
Cc: catalin.marinas@arm.com, will.deacon@arm.com,
bauerman@linux.vnet.ibm.com, dhowells@redhat.com,
vgoyal@redhat.com, herbert@gondor.apana.org.au,
davem@davemloft.net, akpm@linux-foundation.org,
mpe@ellerman.id.au, dyoung@redhat.com, bhe@redhat.com,
arnd@arndb.de, ard.biesheuvel@linaro.org,
kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 03/10] kexec_file: factor out arch_kexec_kernel_*() from x86, powerpc
Date: Fri, 6 Oct 2017 16:06:24 +0900 [thread overview]
Message-ID: <20171006070623.GB6756@linaro.org> (raw)
In-Reply-To: <5f65195f-4a6f-c2c1-d346-36541e263c64@arm.com>
On Thu, Oct 05, 2017 at 11:21:38AM +0100, Julien Thierry wrote:
> Hi Takahiro,
>
> On 02/10/17 07:14, AKASHI Takahiro wrote:
> >arch_kexec_kernel_*() and arch_kimage_file_post_load_cleanup can now be
> >duplicated among some architectures, so let's factor them out.
> >
> >Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
> >Cc: Dave Young <dyoung@redhat.com>
> >Cc: Vivek Goyal <vgoyal@redhat.com>
> >Cc: Baoquan He <bhe@redhat.com>
> >Cc: Michael Ellerman <mpe@ellerman.id.au>
> >Cc: Thiago Jung Bauermann <bauerman@linux.vnet.ibm.com>
> >---
> > arch/powerpc/kernel/kexec_elf_64.c | 2 +-
> > arch/powerpc/kernel/machine_kexec_file_64.c | 36 ++---------------
> > arch/x86/kernel/kexec-bzimage64.c | 2 +-
> > arch/x86/kernel/machine_kexec_64.c | 45 +--------------------
> > include/linux/kexec.h | 15 +++----
> > kernel/kexec_file.c | 63 ++++++++++++++++++++++++++---
> > 6 files changed, 73 insertions(+), 90 deletions(-)
> >
> >diff --git a/arch/powerpc/kernel/kexec_elf_64.c b/arch/powerpc/kernel/kexec_elf_64.c
> >index 9a42309b091a..6c78c11c7faf 100644
> >--- a/arch/powerpc/kernel/kexec_elf_64.c
> >+++ b/arch/powerpc/kernel/kexec_elf_64.c
> >@@ -657,7 +657,7 @@ static void *elf64_load(struct kimage *image, char *kernel_buf,
> > return ret ? ERR_PTR(ret) : fdt;
> > }
> >-struct kexec_file_ops kexec_elf64_ops = {
> >+const struct kexec_file_ops kexec_elf64_ops = {
> > .probe = elf64_probe,
> > .load = elf64_load,
> > };
> >diff --git a/arch/powerpc/kernel/machine_kexec_file_64.c b/arch/powerpc/kernel/machine_kexec_file_64.c
> >index 992c0d258e5d..e7ce78857f0b 100644
> >--- a/arch/powerpc/kernel/machine_kexec_file_64.c
> >+++ b/arch/powerpc/kernel/machine_kexec_file_64.c
> >@@ -31,8 +31,9 @@
> > #define SLAVE_CODE_SIZE 256
> >-static struct kexec_file_ops *kexec_file_loaders[] = {
> >+const struct kexec_file_ops * const kexec_file_loaders[] = {
> > &kexec_elf64_ops,
> >+ NULL
> > };
> > int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >@@ -45,38 +46,7 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > if (image->type == KEXEC_TYPE_CRASH)
> > return -ENOTSUPP;
> >- for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
> >- fops = kexec_file_loaders[i];
> >- if (!fops || !fops->probe)
> >- continue;
> >-
> >- ret = fops->probe(buf, buf_len);
> >- if (!ret) {
> >- image->fops = fops;
> >- return ret;
> >- }
> >- }
> >-
> >- return ret;
> >-}
> >-
> >-void *arch_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);
> >-}
> >-
> >-int arch_kimage_file_post_load_cleanup(struct kimage *image)
> >-{
> >- if (!image->fops || !image->fops->cleanup)
> >- return 0;
> >-
> >- return image->fops->cleanup(image->image_loader_data);
> >+ return _kexec_kernel_image_probe(image, buf, buf_len);
> > }
> > /**
> >diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c
> >index fb095ba0c02f..705654776c0c 100644
> >--- a/arch/x86/kernel/kexec-bzimage64.c
> >+++ b/arch/x86/kernel/kexec-bzimage64.c
> >@@ -538,7 +538,7 @@ static int bzImage64_verify_sig(const char *kernel, unsigned long kernel_len)
> > }
> > #endif
> >-struct kexec_file_ops kexec_bzImage64_ops = {
> >+const struct kexec_file_ops kexec_bzImage64_ops = {
> > .probe = bzImage64_probe,
> > .load = bzImage64_load,
> > .cleanup = bzImage64_cleanup,
> >diff --git a/arch/x86/kernel/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
> >index 1f790cf9d38f..2cdd29d64181 100644
> >--- a/arch/x86/kernel/machine_kexec_64.c
> >+++ b/arch/x86/kernel/machine_kexec_64.c
> >@@ -30,8 +30,9 @@
> > #include <asm/set_memory.h>
> > #ifdef CONFIG_KEXEC_FILE
> >-static struct kexec_file_ops *kexec_file_loaders[] = {
> >+const struct kexec_file_ops * const kexec_file_loaders[] = {
> > &kexec_bzImage64_ops,
> >+ NULL
> > };
> > #endif
> >@@ -363,27 +364,6 @@ void arch_crash_save_vmcoreinfo(void)
> > /* arch-dependent functionality related to kexec file-based syscall */
> > #ifdef CONFIG_KEXEC_FILE
> >-int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >- unsigned long buf_len)
> >-{
> >- int i, ret = -ENOEXEC;
> >- struct kexec_file_ops *fops;
> >-
> >- for (i = 0; i < ARRAY_SIZE(kexec_file_loaders); i++) {
> >- fops = kexec_file_loaders[i];
> >- if (!fops || !fops->probe)
> >- continue;
> >-
> >- ret = fops->probe(buf, buf_len);
> >- if (!ret) {
> >- image->fops = fops;
> >- return ret;
> >- }
> >- }
> >-
> >- return ret;
> >-}
> >-
> > void *arch_kexec_kernel_image_load(struct kimage *image)
> > {
> > vfree(image->arch.elf_headers);
> >@@ -398,27 +378,6 @@ void *arch_kexec_kernel_image_load(struct kimage *image)
> > image->cmdline_buf_len);
> > }
> >-int arch_kimage_file_post_load_cleanup(struct kimage *image)
> >-{
> >- if (!image->fops || !image->fops->cleanup)
> >- return 0;
> >-
> >- return image->fops->cleanup(image->image_loader_data);
> >-}
> >-
> >-#ifdef CONFIG_KEXEC_VERIFY_SIG
> >-int arch_kexec_kernel_verify_sig(struct kimage *image, void *kernel,
> >- unsigned long kernel_len)
> >-{
> >- if (!image->fops || !image->fops->verify_sig) {
> >- pr_debug("kernel loader does not support signature verification.");
> >- return -EKEYREJECTED;
> >- }
> >-
> >- return image->fops->verify_sig(kernel, kernel_len);
> >-}
> >-#endif
> >-
> > /*
> > * Apply purgatory relocations.
> > *
> >diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> >index 2b7590f5483a..c64c29c1fb0e 100644
> >--- a/include/linux/kexec.h
> >+++ b/include/linux/kexec.h
> >@@ -208,7 +208,7 @@ struct kimage {
> > unsigned long cmdline_buf_len;
> > /* File operations provided by image loader */
> >- struct kexec_file_ops *fops;
> >+ const struct kexec_file_ops *fops;
> > /* Image loader handling the kernel can store a pointer here */
> > void *image_loader_data;
> >@@ -276,12 +276,13 @@ int crash_shrink_memory(unsigned long new_size);
> > size_t crash_get_memory_size(void);
> > void crash_free_reserved_phys_range(unsigned long begin, unsigned long end);
> >-int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> >- unsigned long buf_len);
> >-void * __weak arch_kexec_kernel_image_load(struct kimage *image);
> >-int __weak arch_kimage_file_post_load_cleanup(struct kimage *image);
> >-int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
> >- unsigned long buf_len);
> >+int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> >+ unsigned long buf_len);
> >+void *_kexec_kernel_image_load(struct kimage *image);
> >+int _kexec_kernel_post_load_cleanup(struct kimage *image);
> >+int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> >+ unsigned long buf_len);
> >+
> > int __weak arch_kexec_apply_relocations_add(const Elf_Ehdr *ehdr,
> > Elf_Shdr *sechdrs, unsigned int relsec);
> > int __weak arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
> >diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> >index 9f48f4412297..130965b28392 100644
> >--- a/kernel/kexec_file.c
> >+++ b/kernel/kexec_file.c
> >@@ -26,30 +26,83 @@
> > #include <linux/vmalloc.h>
> > #include "kexec_internal.h"
> >+const __weak struct kexec_file_ops * const kexec_file_loaders[] = {NULL};
> >+
> > static int kexec_calculate_store_digests(struct kimage *image);
> >+int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> >+ unsigned long buf_len)
> >+{
> >+ int i, ret = -ENOEXEC;
> >+ const struct kexec_file_ops *fops;
> >+
> >+ for (i = 0; ; i++) {
> >+ fops = kexec_file_loaders[i];
> >+ if (!fops || !fops->probe)
> >+ break;
> >+
>
> Could we have something like:
>
> for (fops = &kexec_file_loaders[0]; fops && fops->probe; ++fops) {
> [...]
> }
>
> And get rid of i? I think it's nicer to have the condition clearly stated in
> the loop.
Okay
I will also fix kbuild errors for x86 & powerpc.
Thanks,
-Takahiro AKASHI
> Thanks,
>
> >+ 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 __weak arch_kimage_file_post_load_cleanup(struct kimage *image)
> >+int _kexec_kernel_post_load_cleanup(struct kimage *image)
> > {
> >- return -EINVAL;
> >+ if (!image->fops || !image->fops->cleanup)
> >+ return 0;
> >+
> >+ return image->fops->cleanup(image->image_loader_data);
> >+}
> >+
> >+int __weak arch_kexec_kernel_post_load_cleanup(struct kimage *image)
> >+{
> >+ return _kexec_kernel_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
> >
>
> --
> Julien Thierry
next prev parent reply other threads:[~2017-10-06 7:04 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-02 6:14 [PATCH v4 00/10] arm64: kexec: add kexec_file_load() support AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 01/10] include: pe.h: remove message[] from mz header definition AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 02/10] resource: add walk_system_ram_res_rev() AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-05 9:36 ` Julien Thierry
2017-10-05 9:36 ` Julien Thierry
2017-10-05 9:36 ` Julien Thierry
2017-10-06 7:01 ` AKASHI Takahiro
2017-10-06 7:01 ` AKASHI Takahiro
2017-10-06 7:01 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 03/10] kexec_file: factor out arch_kexec_kernel_*() from x86, powerpc AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-04 9:08 ` kbuild test robot
2017-10-04 9:08 ` kbuild test robot
2017-10-04 9:08 ` kbuild test robot
2017-10-04 9:40 ` kbuild test robot
2017-10-04 9:40 ` kbuild test robot
2017-10-04 9:40 ` kbuild test robot
2017-10-05 10:21 ` Julien Thierry
2017-10-05 10:21 ` Julien Thierry
2017-10-05 10:21 ` Julien Thierry
2017-10-06 7:06 ` AKASHI Takahiro [this message]
2017-10-06 7:06 ` AKASHI Takahiro
2017-10-06 7:06 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 04/10] kexec_file: factor out crashdump elf header function from x86 AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 05/10] asm-generic: add kexec_file_load system call to unistd.h AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 06/10] arm64: kexec_file: create purgatory AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 07/10] arm64: kexec_file: load initrd, device-tree and purgatory segments AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 08/10] arm64: kexec_file: set up for crash dump adding elf core header AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-05 14:15 ` Julien Thierry
2017-10-05 14:15 ` Julien Thierry
2017-10-05 14:15 ` Julien Thierry
2017-10-06 7:11 ` AKASHI Takahiro
2017-10-06 7:11 ` AKASHI Takahiro
2017-10-06 7:11 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 09/10] arm64: enable KEXEC_FILE config AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` [PATCH v4 10/10] arm64: kexec_file: add Image format support AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
2017-10-02 6:14 ` AKASHI Takahiro
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=20171006070623.GB6756@linaro.org \
--to=takahiro.akashi@linaro.org \
--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=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.