On Thu, Dec 07, 2006 at 06:29:37PM +0530, Mohan Kumar M wrote:
> Maneesh,
> 
> Can you check this ;-)
> 
> =============================
> 
> Hello,
> 
> We have encountered a strange problem with kdump in ppc970 based
> machines. When a kdump kernel is booted with maxcpus=1 parameter,
> interrupt is distributed to non-existent cpus also. It created lot of
> interrupt missing problems.
> 
> This problem can be resolved by passing the additional kernel parameter
> "noirqdistrib", which uses boot cpu id as interrupt distribution server.
> 
> To overcome this problem, I have created the patch, which
> checks for the condition if the machine is ppc970 based and maxcpus
> kernel parameter is specified. If the condition is met, the default
> distribution server is assigned to be current boot cpu instead of
> reading from the gserver#s property.
> 
> Tested on PPC970 based box and POWER5 based box.
> 

Mohan,

This looks ok to me but perhaps you would like to take it through
ppc64 maintainers (ie on ppc64 mailinglist).

Thanks
Maneesh


> Patch is generated over 2.6.19-git7.
> 
> 
> o Kdump with maxcpus kernel parameter in PPC970xx creates interrupt
>   distribution problem, so set default distribution server to the
>   current cpu (i.e. boot cpu)
> 
> Signed-off-by: Mohan Kumar M <[EMAIL PROTECTED]>
> ---
>  arch/powerpc/platforms/pseries/xics.c |   35 
> +++++++++++++++++++++++++++++++++-
>  1 file changed, 34 insertions(+), 1 deletion(-)
> 
> Index: linux-2.6.19-git7/arch/powerpc/platforms/pseries/xics.c
> ===================================================================
> --- linux-2.6.19-git7.orig/arch/powerpc/platforms/pseries/xics.c
> +++ linux-2.6.19-git7/arch/powerpc/platforms/pseries/xics.c
> @@ -680,6 +680,27 @@ static struct device_node *cpuid_to_of_n
>       return NULL;
>  }
> 
> +static int is_processor_970(void)
> +{
> +     unsigned long rval;
> +     int rc;
> +     rval = PVR_VER(mfspr(SPRN_PVR));
> +
> +     switch(rval) {
> +             case PV_970:
> +             case PV_970FX:
> +             case PV_970MP:
> +             case PV_970GX:
> +                     rc = 1;
> +                     break;
> +             default:
> +                     rc = 0;
> +                     break;
> +     }
> +
> +     return rc;
> +}
> +
>  void __init xics_init_IRQ(void)
>  {
>       int i, j;
> @@ -688,6 +709,7 @@ void __init xics_init_IRQ(void)
>       const u32 *ireg, *isize;
>       int found = 0;
>       u32 hcpuid;
> +     int fix_970_intr_distrib = 0;
> 
>       ppc64_boot_msg(0x20, "XICS Init");
> 
> @@ -707,6 +729,13 @@ void __init xics_init_IRQ(void)
> 
>       xics_init_host();
> 
> +     /* Kdump with maxcpus kernel parameter in PPC970xx creates interrupt
> +      * distribution problem, so set default distribution server to the
> +      * current cpu (i.e. boot cpu)
> +      */
> +     if (strstr(saved_command_line, "maxcpus=") && is_processor_970())
> +             fix_970_intr_distrib = 1;
> +
>       /* Find the server numbers for the boot cpu. */
>       np = cpuid_to_of_node(boot_cpuid);
>       BUG_ON(!np);
> @@ -724,7 +753,11 @@ void __init xics_init_IRQ(void)
>       for (j = 0; j < i; j += 2) {
>               if (ireg[j] == hcpuid) {
>                       default_server = hcpuid;
> -                     default_distrib_server = ireg[j+1];
> +
> +                     if (fix_970_intr_distrib)
> +                             default_distrib_server = hcpuid;
> +                     else
> +                             default_distrib_server = ireg[j+1];
> 
>                       isize = get_property(np,
>                                       "ibm,interrupt-server#-size", NULL);
_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot

Reply via email to