Kexec Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Dave Young <dyoung@redhat.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,
	davem@davemloft.net, vgoyal@redhat.com
Subject: Re: [PATCH v3 03/10] kexec_file: factor out arch_kexec_kernel_*() from x86, powerpc
Date: Fri, 22 Sep 2017 16:58:09 +0900	[thread overview]
Message-ID: <20170922075807.GM17186@linaro.org> (raw)
In-Reply-To: <20170921073516.GA6643@dhcp-128-65.nay.redhat.com>

Hi Dave,

On Thu, Sep 21, 2017 at 03:35:16PM +0800, Dave Young wrote:
> Hi AKASHI,
> On 09/15/17 at 07:59pm, 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/include/asm/kexec.h            |  4 ++
> >  arch/powerpc/kernel/machine_kexec_file_64.c | 36 ++----------------
> >  arch/x86/kernel/machine_kexec_64.c          | 59 +----------------------------
> >  include/linux/kexec.h                       | 26 ++++++++++---
> >  kernel/kexec_file.c                         | 52 +++++++++++++++++++------
> >  5 files changed, 70 insertions(+), 107 deletions(-)
> > 
> > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
> > index 25668bc8cb2a..50810d24e38f 100644
> > --- a/arch/powerpc/include/asm/kexec.h
> > +++ b/arch/powerpc/include/asm/kexec.h
> > @@ -94,6 +94,10 @@ static inline bool kdump_in_progress(void)
> >  #ifdef CONFIG_KEXEC_FILE
> >  extern struct kexec_file_ops kexec_elf64_ops;
> >  
> > +#define arch_kexec_kernel_image_probe arch_kexec_kernel_image_probe
> > +int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > +				  unsigned long buf_len);
> > +
> >  #ifdef CONFIG_IMA_KEXEC
> >  #define ARCH_HAS_KIMAGE_ARCH
> >  
> > diff --git a/arch/powerpc/kernel/machine_kexec_file_64.c b/arch/powerpc/kernel/machine_kexec_file_64.c
> > index 992c0d258e5d..5b7c4a3fbb50 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[] = {
> > +struct kexec_file_ops *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/machine_kexec_64.c b/arch/x86/kernel/machine_kexec_64.c
> > index cb0a30473c23..f4df8315d001 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[] = {
> > +struct kexec_file_ops *kexec_file_loaders[] = {
> >  		&kexec_bzImage64_ops,
> > +		NULL
> >  };
> >  #endif
> >  
> > @@ -361,62 +362,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);
> > -	image->arch.elf_headers = NULL;
> > -
> > -	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);
> > -}
> > -
> > -#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 dd056fab9e35..4a2b24d94e04 100644
> > --- a/include/linux/kexec.h
> > +++ b/include/linux/kexec.h
> > @@ -134,6 +134,26 @@ struct kexec_file_ops {
> >  #endif
> >  };
> >  
> > +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);
> > +
> > +#ifndef arch_kexec_kernel_image_probe
> > +#define arch_kexec_kernel_image_probe kexec_kernel_image_probe
> > +#endif
> > +#ifndef arch_kexec_kernel_image_load
> > +#define arch_kexec_kernel_image_load kexec_kernel_image_load
> > +#endif
> > +#ifndef arch_kimage_file_post_load_cleanup
> > +#define arch_kimage_file_post_load_cleanup kexec_kernel_post_load_cleanup
> > +#endif
> > +#ifndef arch_kexec_kernel_verify_sig
> > +#define arch_kexec_kernel_verify_sig kexec_kernel_verify_sig
> > +#endif
> > +
> >  /**
> >   * struct kexec_buf - parameters for finding a place for a buffer in memory
> >   * @image:	kexec image in which memory to search.
> > @@ -276,12 +296,6 @@ 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);
> 
> I thought we can keep using the __weak function in common code and drop
> the arch functions, no need the #ifndef arch_kexec_kernel_image_probe
> and the function renaming stuff.  But I did not notice the powerpc
> _probe function checks KEXEC_ON_CRASH, that should be checked earlier
> and we can fail out early if not supported, but I have no idea
> how to do it gracefully for now.
> 
> Also for x86 _load function it cleanups image->arch.elf_headers, it can
> not be dropped simply.

Yeah, arm64 post_load_cleanup function also has some extra stuff.
See my patch #7/8.

> Consider the above two issues, maybe you can keep the powerpc
> version of _probe() and x86 version of _load(), and still copy the common code
> to kexec_file.c weak functions.

It was exactly what I made before submitting v3, but I changed
my mind a bit. My intension is to prevent the code being duplicated
even though it has only a few lines of code.

I agree that '#ifndef arch_kexec_kernel_image_probe' in kexec.h would be
quite ugly, but similar usages can be spotted in the kernel source.

That said if you don't like it at all, I defer to you.

Thanks,
-Takahiro AKASHI

> I can post patch to cleanup the x86
> _load function in the future.

> >  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..6203b54e04c5 100644
> > --- a/kernel/kexec_file.c
> > +++ b/kernel/kexec_file.c
> > @@ -26,30 +26,60 @@
> >  #include <linux/vmalloc.h>
> >  #include "kexec_internal.h"
> >  
> > +__weak struct kexec_file_ops *kexec_file_loaders[] = {NULL};
> > +
> >  static int kexec_calculate_store_digests(struct kimage *image);
> >  
> > -/* Architectures can provide this probe function */
> > -int __weak arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
> > -					 unsigned long buf_len)
> > +int kexec_kernel_image_probe(struct kimage *image, void *buf,
> > +			     unsigned long buf_len)
> >  {
> > -	return -ENOEXEC;
> > +	int i, ret = -ENOEXEC;
> > +	struct kexec_file_ops *fops;
> > +
> > +	for (i = 0; ; i++) {
> > +		fops = kexec_file_loaders[i];
> > +		if (!fops || !fops->probe)
> > +			break;
> > +
> > +		ret = fops->probe(buf, buf_len);
> > +		if (!ret) {
> > +			image->fops = fops;
> > +			return ret;
> > +		}
> > +	}
> > +
> > +	return ret;
> >  }
> >  
> > -void * __weak arch_kexec_kernel_image_load(struct kimage *image)
> > +void *kexec_kernel_image_load(struct kimage *image)
> >  {
> > -	return ERR_PTR(-ENOEXEC);
> > +	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 __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);
> >  }
> >  
> >  #ifdef CONFIG_KEXEC_VERIFY_SIG
> > -int __weak arch_kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > -					unsigned long buf_len)
> > +int kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > +			    unsigned long buf_len)
> >  {
> > -	return -EKEYREJECTED;
> > +	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);
> >  }
> >  #endif
> >  
> > -- 
> > 2.14.1
> > 
> > 
> > _______________________________________________
> > kexec mailing list
> > kexec@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/kexec
> 
> Thanks
> Dave

_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec

  reply	other threads:[~2017-09-22  7:56 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-15 10:59 [PATCH v3 00/10] arm64: kexec: add kexec_file_load() support AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 01/10] include: pe.h: remove message[] from mz header definition AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 02/10] resource: add walk_system_ram_res_rev() AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 03/10] kexec_file: factor out arch_kexec_kernel_*() from x86, powerpc AKASHI Takahiro
2017-09-21  7:35   ` Dave Young
2017-09-22  7:58     ` AKASHI Takahiro [this message]
2017-09-25  8:03       ` Dave Young
2017-09-25  8:30         ` Dave Young
2017-09-25 18:15         ` AKASHI Takahiro
2017-09-25 15:36       ` David Howells
2017-09-25 18:18         ` AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 04/10] kexec_file: factor out crashdump elf header function from x86 AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 05/10] asm-generic: add kexec_file_load system call to unistd.h AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 06/10] arm64: kexec_file: create purgatory AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 07/10] arm64: kexec_file: load initrd, device-tree and purgatory segments AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 08/10] arm64: kexec_file: set up for crash dump adding elf core header AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 09/10] arm64: enable KEXEC_FILE config AKASHI Takahiro
2017-09-15 10:59 ` [PATCH v3 10/10] arm64: kexec_file: add Image format support 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=20170922075807.GM17186@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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox