Patchwork powerpc/iseries: Kexec is known not to work on iseries

login
register
mail settings
Submitter Michael Ellerman
Date Dec. 23, 2008, 9:23 a.m.
Message ID <102d4cdd8493017c104fda0dccc513bce056430c.1230024187.git.michael@ellerman.id.au>
Download mbox | patch
Permalink /patch/15425/
State Accepted, archived
Commit 5c9a2606bcad101e169012d9f79ab3aed60926aa
Headers show

Comments

Michael Ellerman - Dec. 23, 2008, 9:23 a.m.
The non-zero return from the prepare callback is returned by sys_kexec_load()
to userspace, indicating that kexec is not supported on the machine.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
---
 arch/powerpc/platforms/iseries/setup.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
Nathan Lynch - Dec. 23, 2008, 6:50 p.m.
Hi,

Michael Ellerman wrote:
> The non-zero return from the prepare callback is returned by sys_kexec_load()
> to userspace, indicating that kexec is not supported on the machine.

...

> @@ -638,6 +639,13 @@ static int __init iseries_probe(void)
>  	return 1;
>  }
>  
> +#ifdef CONFIG_KEXEC
> +static int iseries_kexec_prepare(struct kimage *image)
> +{
> +	return -ENOSYS;
> +}
> +#endif
> +
>  define_machine(iseries) {
>  	.name			= "iSeries",
>  	.setup_arch		= iSeries_setup_arch,
> @@ -658,6 +666,9 @@ define_machine(iseries) {
>  	.probe			= iseries_probe,
>  	.ioremap		= iseries_ioremap,
>  	.iounmap		= iseries_iounmap,
> +#ifdef CONFIG_KEXEC
> +	.machine_kexec_prepare	= iseries_kexec_prepare,
> +#endif
>  	/* XXX Implement enable_pmcs for iSeries */
>  };

But machine_kexec_prepare() already returns -ENOSYS if the platform
doesn't have the hook in ppc_md.  I must be missing something; what is
this patch fixing?
Anton Vorontsov - Dec. 23, 2008, 7:12 p.m.
Hi Nathan,

On Tue, Dec 23, 2008 at 12:50:51PM -0600, Nathan Lynch wrote:
> Hi,
> 
> Michael Ellerman wrote:
> > The non-zero return from the prepare callback is returned by sys_kexec_load()
> > to userspace, indicating that kexec is not supported on the machine.
> 
> ...
> 
> > @@ -638,6 +639,13 @@ static int __init iseries_probe(void)
> >  	return 1;
> >  }
> >  
> > +#ifdef CONFIG_KEXEC
> > +static int iseries_kexec_prepare(struct kimage *image)
> > +{
> > +	return -ENOSYS;
> > +}
> > +#endif
> > +
> >  define_machine(iseries) {
> >  	.name			= "iSeries",
> >  	.setup_arch		= iSeries_setup_arch,
> > @@ -658,6 +666,9 @@ define_machine(iseries) {
> >  	.probe			= iseries_probe,
> >  	.ioremap		= iseries_ioremap,
> >  	.iounmap		= iseries_iounmap,
> > +#ifdef CONFIG_KEXEC
> > +	.machine_kexec_prepare	= iseries_kexec_prepare,
> > +#endif
> >  	/* XXX Implement enable_pmcs for iSeries */
> >  };
> 
> But machine_kexec_prepare() already returns -ENOSYS if the platform
> doesn't have the hook in ppc_md. I must be missing something;

Yeah, the kexec discussion, starting from here:
http://ozlabs.org/pipermail/linuxppc-dev/2008-December/066321.html

The default behaviour has changed.

Patch

diff --git a/arch/powerpc/platforms/iseries/setup.c b/arch/powerpc/platforms/iseries/setup.c
index 70b688c..24519b9 100644
--- a/arch/powerpc/platforms/iseries/setup.c
+++ b/arch/powerpc/platforms/iseries/setup.c
@@ -23,6 +23,7 @@ 
 #include <linux/string.h>
 #include <linux/seq_file.h>
 #include <linux/kdev_t.h>
+#include <linux/kexec.h>
 #include <linux/major.h>
 #include <linux/root_dev.h>
 #include <linux/kernel.h>
@@ -638,6 +639,13 @@  static int __init iseries_probe(void)
 	return 1;
 }
 
+#ifdef CONFIG_KEXEC
+static int iseries_kexec_prepare(struct kimage *image)
+{
+	return -ENOSYS;
+}
+#endif
+
 define_machine(iseries) {
 	.name			= "iSeries",
 	.setup_arch		= iSeries_setup_arch,
@@ -658,6 +666,9 @@  define_machine(iseries) {
 	.probe			= iseries_probe,
 	.ioremap		= iseries_ioremap,
 	.iounmap		= iseries_iounmap,
+#ifdef CONFIG_KEXEC
+	.machine_kexec_prepare	= iseries_kexec_prepare,
+#endif
 	/* XXX Implement enable_pmcs for iSeries */
 };