All of lore.kernel.org
 help / color / mirror / Atom feed
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Dave Young <dyoung@redhat.com>
Cc: linux-s390@vger.kernel.org, prudo@linux.vnet.ibm.com,
	bhe@redhat.com, mpe@ellerman.id.au, kexec@lists.infradead.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	bauerman@linux.vnet.ibm.com, vgoyal@redhat.com
Subject: Re: [PATCH 2/7] kexec_file,x86,powerpc: factor out kexec_file_ops functions
Date: Fri, 2 Mar 2018 16:16:45 +0900	[thread overview]
Message-ID: <20180302071644.GS6019@linaro.org> (raw)
In-Reply-To: <20180302060857.GD15422@dhcp-128-65.nay.redhat.com>

On Fri, Mar 02, 2018 at 02:08:57PM +0800, Dave Young wrote:
> On 03/02/18 at 01:53pm, Dave Young wrote:
> > On 03/02/18 at 02:24pm, AKASHI Takahiro wrote:
> > > On Fri, Mar 02, 2018 at 01:04:26PM +0800, Dave Young wrote:
> > > > On 02/27/18 at 01:48pm, AKASHI Takahiro wrote:
> > > > > As arch_kexec_kernel_image_{probe,load}(),
> > > > > arch_kimage_file_post_load_cleanup() and arch_kexec_kernel_verify_sig()
> > > > > are almost duplicated among architectures, they can be commonalized with
> > > > > an architecture-defined kexec_file_ops array. 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            |  2 +-
> > > > >  arch/powerpc/kernel/kexec_elf_64.c          |  2 +-
> > > > >  arch/powerpc/kernel/machine_kexec_file_64.c | 39 ++------------------
> > > > >  arch/x86/include/asm/kexec-bzimage64.h      |  2 +-
> > > > >  arch/x86/kernel/kexec-bzimage64.c           |  2 +-
> > > > >  arch/x86/kernel/machine_kexec_64.c          | 45 ++---------------------
> > > > >  include/linux/kexec.h                       | 17 +++++----
> > > > >  kernel/kexec_file.c                         | 55 ++++++++++++++++++++++++++---
> > > > >  8 files changed, 70 insertions(+), 94 deletions(-)
> > > > > 
> > > > > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
> > > > > index d8b1e8e7e035..4a585cba1787 100644
> > > > > --- a/arch/powerpc/include/asm/kexec.h
> > > > > +++ b/arch/powerpc/include/asm/kexec.h
> > > > > @@ -95,7 +95,7 @@ static inline bool kdump_in_progress(void)
> > > > >  }
> > > > >  
> > > > >  #ifdef CONFIG_KEXEC_FILE
> > > > > -extern struct kexec_file_ops kexec_elf64_ops;
> > > > > +extern const struct kexec_file_ops kexec_elf64_ops;
> > > > >  
> > > > >  #ifdef CONFIG_IMA_KEXEC
> > > > >  #define ARCH_HAS_KIMAGE_ARCH
> > > > > 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 e4395f937d63..a27ec647350c 100644
> > > > > --- a/arch/powerpc/kernel/machine_kexec_file_64.c
> > > > > +++ b/arch/powerpc/kernel/machine_kexec_file_64.c
> > > > > @@ -31,52 +31,19 @@
> > > > >  
> > > > >  #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,
> > > > >  				  unsigned long buf_len)
> > > > >  {
> > > > > -	int i, ret = -ENOEXEC;
> > > > > -	struct kexec_file_ops *fops;
> > > > > -
> > > > >  	/* We don't support crash kernels yet. */
> > > > >  	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/include/asm/kexec-bzimage64.h b/arch/x86/include/asm/kexec-bzimage64.h
> > > > > index 9f07cff43705..df89ee7d3e9e 100644
> > > > > --- a/arch/x86/include/asm/kexec-bzimage64.h
> > > > > +++ b/arch/x86/include/asm/kexec-bzimage64.h
> > > > > @@ -2,6 +2,6 @@
> > > > >  #ifndef _ASM_KEXEC_BZIMAGE64_H
> > > > >  #define _ASM_KEXEC_BZIMAGE64_H
> > > > >  
> > > > > -extern struct kexec_file_ops kexec_bzImage64_ops;
> > > > > +extern const struct kexec_file_ops kexec_bzImage64_ops;
> > > > >  
> > > > >  #endif  /* _ASM_KEXE_BZIMAGE64_H */
> > > > > 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 f16f6ceb3875..2e095c3b4537 100644
> > > > > --- a/include/linux/kexec.h
> > > > > +++ b/include/linux/kexec.h
> > > > > @@ -159,6 +159,15 @@ struct kexec_buf {
> > > > >  	bool top_down;
> > > > >  };
> > > > >  
> > > > > +extern const struct kexec_file_ops * const kexec_file_loaders[];
> > > > > +
> > > > > +int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > > > +			      unsigned long buf_len);
> > > > > +void *_kexec_kernel_image_load(struct kimage *image);
> > > > > +int _kimage_file_post_load_cleanup(struct kimage *image);
> > > > > +int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > > > +			     unsigned long buf_len);
> > > > 
> > > > AKASHI, since the above 3 functions nobody else used, suppose it is for
> > > > future use, they can be made static for now.  Later if someone needs
> > > > they can remove the static easily.
> > > 
> > > OK.
> > > May I change those names, for example, to kexec_kernel_image_probe_default()
> > > and so on? I don't like to export _XYZ as a global symbol.
> > 
> > Hmm, if so it is becoming even longer, maybe something shorter eg. below
> > 
> > kexec_image_probe
> > kexec_image_load
> > kexec_image_post_load_cleanup
> > kexec_image_verify_sig

OK.

> > and for the sub routine maybe then add _default suffix, they still look
> > not very good, but I can not think of any better names.

Me, neither. Then, the resulting code looks like:

__weak arch_kexec_(kernel_)image_probe() {
        return kexec_image_probe_default();
}

Should we preserve "kernel_" so as not to change the existing names?


> BTW, there can be a short code comment to explain why they are needed to
> be separate functions so that less confusion while reading code.

Sure

-Takahiro AKASHI


> > 
> > 
> > > 
> > > -Takahiro AKASHI
> > >       
> > > 
> > > 
> > > > > +}
> > > > > +
> > > > >  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
> > > > >  
> > > > > -- 
> > > > > 2.16.2
> > > > > 
> > > > 
> > > > Thanks
> > > > Dave
> > 
> > Thanks
> > Dave

_______________________________________________
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 2/7] kexec_file,x86,powerpc: factor out kexec_file_ops functions
Date: Fri, 2 Mar 2018 16:16:45 +0900	[thread overview]
Message-ID: <20180302071644.GS6019@linaro.org> (raw)
In-Reply-To: <20180302060857.GD15422@dhcp-128-65.nay.redhat.com>

On Fri, Mar 02, 2018 at 02:08:57PM +0800, Dave Young wrote:
> On 03/02/18 at 01:53pm, Dave Young wrote:
> > On 03/02/18 at 02:24pm, AKASHI Takahiro wrote:
> > > On Fri, Mar 02, 2018 at 01:04:26PM +0800, Dave Young wrote:
> > > > On 02/27/18 at 01:48pm, AKASHI Takahiro wrote:
> > > > > As arch_kexec_kernel_image_{probe,load}(),
> > > > > arch_kimage_file_post_load_cleanup() and arch_kexec_kernel_verify_sig()
> > > > > are almost duplicated among architectures, they can be commonalized with
> > > > > an architecture-defined kexec_file_ops array. 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            |  2 +-
> > > > >  arch/powerpc/kernel/kexec_elf_64.c          |  2 +-
> > > > >  arch/powerpc/kernel/machine_kexec_file_64.c | 39 ++------------------
> > > > >  arch/x86/include/asm/kexec-bzimage64.h      |  2 +-
> > > > >  arch/x86/kernel/kexec-bzimage64.c           |  2 +-
> > > > >  arch/x86/kernel/machine_kexec_64.c          | 45 ++---------------------
> > > > >  include/linux/kexec.h                       | 17 +++++----
> > > > >  kernel/kexec_file.c                         | 55 ++++++++++++++++++++++++++---
> > > > >  8 files changed, 70 insertions(+), 94 deletions(-)
> > > > > 
> > > > > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
> > > > > index d8b1e8e7e035..4a585cba1787 100644
> > > > > --- a/arch/powerpc/include/asm/kexec.h
> > > > > +++ b/arch/powerpc/include/asm/kexec.h
> > > > > @@ -95,7 +95,7 @@ static inline bool kdump_in_progress(void)
> > > > >  }
> > > > >  
> > > > >  #ifdef CONFIG_KEXEC_FILE
> > > > > -extern struct kexec_file_ops kexec_elf64_ops;
> > > > > +extern const struct kexec_file_ops kexec_elf64_ops;
> > > > >  
> > > > >  #ifdef CONFIG_IMA_KEXEC
> > > > >  #define ARCH_HAS_KIMAGE_ARCH
> > > > > 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 e4395f937d63..a27ec647350c 100644
> > > > > --- a/arch/powerpc/kernel/machine_kexec_file_64.c
> > > > > +++ b/arch/powerpc/kernel/machine_kexec_file_64.c
> > > > > @@ -31,52 +31,19 @@
> > > > >  
> > > > >  #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,
> > > > >  				  unsigned long buf_len)
> > > > >  {
> > > > > -	int i, ret = -ENOEXEC;
> > > > > -	struct kexec_file_ops *fops;
> > > > > -
> > > > >  	/* We don't support crash kernels yet. */
> > > > >  	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/include/asm/kexec-bzimage64.h b/arch/x86/include/asm/kexec-bzimage64.h
> > > > > index 9f07cff43705..df89ee7d3e9e 100644
> > > > > --- a/arch/x86/include/asm/kexec-bzimage64.h
> > > > > +++ b/arch/x86/include/asm/kexec-bzimage64.h
> > > > > @@ -2,6 +2,6 @@
> > > > >  #ifndef _ASM_KEXEC_BZIMAGE64_H
> > > > >  #define _ASM_KEXEC_BZIMAGE64_H
> > > > >  
> > > > > -extern struct kexec_file_ops kexec_bzImage64_ops;
> > > > > +extern const struct kexec_file_ops kexec_bzImage64_ops;
> > > > >  
> > > > >  #endif  /* _ASM_KEXE_BZIMAGE64_H */
> > > > > 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 f16f6ceb3875..2e095c3b4537 100644
> > > > > --- a/include/linux/kexec.h
> > > > > +++ b/include/linux/kexec.h
> > > > > @@ -159,6 +159,15 @@ struct kexec_buf {
> > > > >  	bool top_down;
> > > > >  };
> > > > >  
> > > > > +extern const struct kexec_file_ops * const kexec_file_loaders[];
> > > > > +
> > > > > +int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > > > +			      unsigned long buf_len);
> > > > > +void *_kexec_kernel_image_load(struct kimage *image);
> > > > > +int _kimage_file_post_load_cleanup(struct kimage *image);
> > > > > +int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > > > +			     unsigned long buf_len);
> > > > 
> > > > AKASHI, since the above 3 functions nobody else used, suppose it is for
> > > > future use, they can be made static for now.  Later if someone needs
> > > > they can remove the static easily.
> > > 
> > > OK.
> > > May I change those names, for example, to kexec_kernel_image_probe_default()
> > > and so on? I don't like to export _XYZ as a global symbol.
> > 
> > Hmm, if so it is becoming even longer, maybe something shorter eg. below
> > 
> > kexec_image_probe
> > kexec_image_load
> > kexec_image_post_load_cleanup
> > kexec_image_verify_sig

OK.

> > and for the sub routine maybe then add _default suffix, they still look
> > not very good, but I can not think of any better names.

Me, neither. Then, the resulting code looks like:

__weak arch_kexec_(kernel_)image_probe() {
        return kexec_image_probe_default();
}

Should we preserve "kernel_" so as not to change the existing names?


> BTW, there can be a short code comment to explain why they are needed to
> be separate functions so that less confusion while reading code.

Sure

-Takahiro AKASHI


> > 
> > 
> > > 
> > > -Takahiro AKASHI
> > >       
> > > 
> > > 
> > > > > +}
> > > > > +
> > > > >  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
> > > > >  
> > > > > -- 
> > > > > 2.16.2
> > > > > 
> > > > 
> > > > Thanks
> > > > Dave
> > 
> > Thanks
> > Dave

WARNING: multiple messages have this Message-ID (diff)
From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Dave Young <dyoung@redhat.com>
Cc: vgoyal@redhat.com, bhe@redhat.com, mpe@ellerman.id.au,
	bauerman@linux.vnet.ibm.com, prudo@linux.vnet.ibm.com,
	kexec@lists.infradead.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org
Subject: Re: [PATCH 2/7] kexec_file,x86,powerpc: factor out kexec_file_ops functions
Date: Fri, 2 Mar 2018 16:16:45 +0900	[thread overview]
Message-ID: <20180302071644.GS6019@linaro.org> (raw)
In-Reply-To: <20180302060857.GD15422@dhcp-128-65.nay.redhat.com>

On Fri, Mar 02, 2018 at 02:08:57PM +0800, Dave Young wrote:
> On 03/02/18 at 01:53pm, Dave Young wrote:
> > On 03/02/18 at 02:24pm, AKASHI Takahiro wrote:
> > > On Fri, Mar 02, 2018 at 01:04:26PM +0800, Dave Young wrote:
> > > > On 02/27/18 at 01:48pm, AKASHI Takahiro wrote:
> > > > > As arch_kexec_kernel_image_{probe,load}(),
> > > > > arch_kimage_file_post_load_cleanup() and arch_kexec_kernel_verify_sig()
> > > > > are almost duplicated among architectures, they can be commonalized with
> > > > > an architecture-defined kexec_file_ops array. 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            |  2 +-
> > > > >  arch/powerpc/kernel/kexec_elf_64.c          |  2 +-
> > > > >  arch/powerpc/kernel/machine_kexec_file_64.c | 39 ++------------------
> > > > >  arch/x86/include/asm/kexec-bzimage64.h      |  2 +-
> > > > >  arch/x86/kernel/kexec-bzimage64.c           |  2 +-
> > > > >  arch/x86/kernel/machine_kexec_64.c          | 45 ++---------------------
> > > > >  include/linux/kexec.h                       | 17 +++++----
> > > > >  kernel/kexec_file.c                         | 55 ++++++++++++++++++++++++++---
> > > > >  8 files changed, 70 insertions(+), 94 deletions(-)
> > > > > 
> > > > > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h
> > > > > index d8b1e8e7e035..4a585cba1787 100644
> > > > > --- a/arch/powerpc/include/asm/kexec.h
> > > > > +++ b/arch/powerpc/include/asm/kexec.h
> > > > > @@ -95,7 +95,7 @@ static inline bool kdump_in_progress(void)
> > > > >  }
> > > > >  
> > > > >  #ifdef CONFIG_KEXEC_FILE
> > > > > -extern struct kexec_file_ops kexec_elf64_ops;
> > > > > +extern const struct kexec_file_ops kexec_elf64_ops;
> > > > >  
> > > > >  #ifdef CONFIG_IMA_KEXEC
> > > > >  #define ARCH_HAS_KIMAGE_ARCH
> > > > > 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 e4395f937d63..a27ec647350c 100644
> > > > > --- a/arch/powerpc/kernel/machine_kexec_file_64.c
> > > > > +++ b/arch/powerpc/kernel/machine_kexec_file_64.c
> > > > > @@ -31,52 +31,19 @@
> > > > >  
> > > > >  #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,
> > > > >  				  unsigned long buf_len)
> > > > >  {
> > > > > -	int i, ret = -ENOEXEC;
> > > > > -	struct kexec_file_ops *fops;
> > > > > -
> > > > >  	/* We don't support crash kernels yet. */
> > > > >  	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/include/asm/kexec-bzimage64.h b/arch/x86/include/asm/kexec-bzimage64.h
> > > > > index 9f07cff43705..df89ee7d3e9e 100644
> > > > > --- a/arch/x86/include/asm/kexec-bzimage64.h
> > > > > +++ b/arch/x86/include/asm/kexec-bzimage64.h
> > > > > @@ -2,6 +2,6 @@
> > > > >  #ifndef _ASM_KEXEC_BZIMAGE64_H
> > > > >  #define _ASM_KEXEC_BZIMAGE64_H
> > > > >  
> > > > > -extern struct kexec_file_ops kexec_bzImage64_ops;
> > > > > +extern const struct kexec_file_ops kexec_bzImage64_ops;
> > > > >  
> > > > >  #endif  /* _ASM_KEXE_BZIMAGE64_H */
> > > > > 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 f16f6ceb3875..2e095c3b4537 100644
> > > > > --- a/include/linux/kexec.h
> > > > > +++ b/include/linux/kexec.h
> > > > > @@ -159,6 +159,15 @@ struct kexec_buf {
> > > > >  	bool top_down;
> > > > >  };
> > > > >  
> > > > > +extern const struct kexec_file_ops * const kexec_file_loaders[];
> > > > > +
> > > > > +int _kexec_kernel_image_probe(struct kimage *image, void *buf,
> > > > > +			      unsigned long buf_len);
> > > > > +void *_kexec_kernel_image_load(struct kimage *image);
> > > > > +int _kimage_file_post_load_cleanup(struct kimage *image);
> > > > > +int _kexec_kernel_verify_sig(struct kimage *image, void *buf,
> > > > > +			     unsigned long buf_len);
> > > > 
> > > > AKASHI, since the above 3 functions nobody else used, suppose it is for
> > > > future use, they can be made static for now.  Later if someone needs
> > > > they can remove the static easily.
> > > 
> > > OK.
> > > May I change those names, for example, to kexec_kernel_image_probe_default()
> > > and so on? I don't like to export _XYZ as a global symbol.
> > 
> > Hmm, if so it is becoming even longer, maybe something shorter eg. below
> > 
> > kexec_image_probe
> > kexec_image_load
> > kexec_image_post_load_cleanup
> > kexec_image_verify_sig

OK.

> > and for the sub routine maybe then add _default suffix, they still look
> > not very good, but I can not think of any better names.

Me, neither. Then, the resulting code looks like:

__weak arch_kexec_(kernel_)image_probe() {
        return kexec_image_probe_default();
}

Should we preserve "kernel_" so as not to change the existing names?


> BTW, there can be a short code comment to explain why they are needed to
> be separate functions so that less confusion while reading code.

Sure

-Takahiro AKASHI


> > 
> > 
> > > 
> > > -Takahiro AKASHI
> > >       
> > > 
> > > 
> > > > > +}
> > > > > +
> > > > >  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
> > > > >  
> > > > > -- 
> > > > > 2.16.2
> > > > > 
> > > > 
> > > > Thanks
> > > > Dave
> > 
> > Thanks
> > Dave

  reply	other threads:[~2018-03-02  7:16 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-27  4:48 [PATCH 0/7] kexec_file: refactoring for other architecutres AKASHI Takahiro
2018-02-27  4:48 ` AKASHI Takahiro
2018-02-27  4:48 ` AKASHI Takahiro
2018-02-27  4:48 ` [PATCH 1/7] kexec_file: make an use of purgatory optional AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-03-02  5:58   ` Dave Young
2018-03-02  5:58     ` Dave Young
2018-03-02  5:58     ` Dave Young
2018-03-02  6:11     ` Dave Young
2018-03-02  6:11       ` Dave Young
2018-03-02  6:11       ` Dave Young
2018-03-02  7:26       ` AKASHI Takahiro
2018-03-02  7:26         ` AKASHI Takahiro
2018-03-02  7:26         ` AKASHI Takahiro
2018-02-27  4:48 ` [PATCH 2/7] kexec_file, x86, powerpc: factor out kexec_file_ops functions AKASHI Takahiro
2018-02-27  4:48   ` [PATCH 2/7] kexec_file,x86,powerpc: " AKASHI Takahiro
2018-02-27  4:48   ` [PATCH 2/7] kexec_file, x86, powerpc: " AKASHI Takahiro
2018-03-02  5:04   ` [PATCH 2/7] kexec_file,x86,powerpc: " Dave Young
2018-03-02  5:04     ` Dave Young
2018-03-02  5:04     ` Dave Young
2018-03-02  5:24     ` AKASHI Takahiro
2018-03-02  5:24       ` AKASHI Takahiro
2018-03-02  5:24       ` AKASHI Takahiro
2018-03-02  5:53       ` Dave Young
2018-03-02  5:53         ` Dave Young
2018-03-02  5:53         ` Dave Young
2018-03-02  6:08         ` Dave Young
2018-03-02  6:08           ` Dave Young
2018-03-02  6:08           ` Dave Young
2018-03-02  7:16           ` AKASHI Takahiro [this message]
2018-03-02  7:16             ` AKASHI Takahiro
2018-03-02  7:16             ` AKASHI Takahiro
2018-03-02  7:56             ` Dave Young
2018-03-02  7:56               ` Dave Young
2018-03-02  7:56               ` Dave Young
2018-02-27  4:48 ` [PATCH 3/7] x86: kexec_file: purge system-ram walking from prepare_elf64_headers() AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48 ` [PATCH 4/7] x86: kexec_file: remove X86_64 dependency " AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-03-02  5:19   ` Dave Young
2018-03-02  5:19     ` Dave Young
2018-03-02  5:19     ` Dave Young
2018-03-02  5:33     ` AKASHI Takahiro
2018-03-02  5:33       ` AKASHI Takahiro
2018-03-02  5:33       ` AKASHI Takahiro
2018-02-27  4:48 ` [PATCH 5/7] x86: kexec_file: lift CRASH_MAX_RANGES limit on crash_mem buffer AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-03-02  5:31   ` Dave Young
2018-03-02  5:31     ` Dave Young
2018-03-02  5:31     ` Dave Young
2018-03-02  5:36     ` AKASHI Takahiro
2018-03-02  5:36       ` AKASHI Takahiro
2018-03-02  5:36       ` AKASHI Takahiro
2018-02-27  4:48 ` [PATCH 6/7] x86: kexec_file: clean up prepare_elf64_headers() AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-03-02  5:39   ` Dave Young
2018-03-02  5:39     ` Dave Young
2018-03-02  5:39     ` Dave Young
2018-03-02  5:58     ` AKASHI Takahiro
2018-03-02  5:58       ` AKASHI Takahiro
2018-03-02  5:58       ` AKASHI Takahiro
2018-03-02  6:04       ` Dave Young
2018-03-02  6:04         ` Dave Young
2018-03-02  6:04         ` Dave Young
2018-02-27  4:48 ` [PATCH 7/7] kexec_file, x86: move re-factored code to generic side AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-02-27  4:48   ` AKASHI Takahiro
2018-03-02  5:56 ` [PATCH 0/7] kexec_file: refactoring for other architecutres Dave Young
2018-03-02  5:56   ` Dave Young
2018-03-02  5:56   ` Dave Young
2018-03-05  2:36   ` Dave Young
2018-03-05  2:36     ` Dave Young
2018-03-05  2:36     ` Dave Young
2018-03-06 10:28     ` AKASHI Takahiro
2018-03-06 10:28       ` AKASHI Takahiro
2018-03-06 10:28       ` 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=20180302071644.GS6019@linaro.org \
    --to=takahiro.akashi@linaro.org \
    --cc=bauerman@linux.vnet.ibm.com \
    --cc=bhe@redhat.com \
    --cc=dyoung@redhat.com \
    --cc=kexec@lists.infradead.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=mpe@ellerman.id.au \
    --cc=prudo@linux.vnet.ibm.com \
    --cc=vgoyal@redhat.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.