[PATCH] ppc64: pSeries shared processor fixes

Joel Schopp jschopp at austin.ibm.com
Fri Dec 10 04:25:22 EST 2004


> Hi,
> 
> It turns out there are more issues with our VPA code:
> 
> 1. vpa_init doesnt report errors when it fails. This was masking a bug
> where the VPA spanned 2 pages and phyp failed to register it.
> 2. We call idle_setup before we initialise the boot cpus vpa. This means
> we never select the shared processor idle loop.
> 3. We dont call vpa_init on UP kernels.
> 
> I think this should go in ASAP, can people give it a once over?

Wow.  We really weren't ever using shared idle.  Now that we actually 
are do you think some performance team somewhere would be interested to 
test that it is worthwhile?  Have you tested it at all from a 
performance perspective?

The patch looks good to me.  On a somewhat related note, I never have 
liked that plpar_hcall_norets() actually returns status.  Seems poorly 
named to me.

-Joel

> 
> Signed-off-by: Anton Blanchard <anton at samba.org>
> 
> diff -puN arch/ppc64/kernel/smp.c~fix_vpa arch/ppc64/kernel/smp.c
> --- foobar2/arch/ppc64/kernel/smp.c~fix_vpa	2004-12-10 02:26:35.070363325 +1100
> +++ foobar2-anton/arch/ppc64/kernel/smp.c	2004-12-10 02:26:35.113360044 +1100
> @@ -76,8 +76,6 @@ extern unsigned char stab_array[];
>  
>  extern int cpu_idle(void *unused);
>  void smp_call_function_interrupt(void);
> -extern long register_vpa(unsigned long flags, unsigned long proc,
> -			 unsigned long vpa);
>  
>  int smt_enabled_at_boot = 1;
>  
> diff -puN arch/ppc64/kernel/pSeries_smp.c~fix_vpa arch/ppc64/kernel/pSeries_smp.c
> --- foobar2/arch/ppc64/kernel/pSeries_smp.c~fix_vpa	2004-12-10 02:26:35.075362944 +1100
> +++ foobar2-anton/arch/ppc64/kernel/pSeries_smp.c	2004-12-10 02:26:35.115359891 +1100
> @@ -59,16 +59,6 @@
>  
>  extern void pseries_secondary_smp_init(unsigned long); 
>  
> -static void vpa_init(int cpu)
> -{
> -	unsigned long flags, pcpu = get_hard_smp_processor_id(cpu);
> -
> -	/* Register the Virtual Processor Area (VPA) */
> -	flags = 1UL << (63 - 18);
> -	register_vpa(flags, pcpu, __pa((unsigned long)&(paca[cpu].lppaca)));
> -}
> -
> -
>  /* Get state of physical CPU.
>   * Return codes:
>   *	0	- The processor is in the RTAS stopped state
> diff -puN arch/ppc64/kernel/setup.c~fix_vpa arch/ppc64/kernel/setup.c
> --- foobar2/arch/ppc64/kernel/setup.c~fix_vpa	2004-12-10 02:26:35.081362486 +1100
> +++ foobar2-anton/arch/ppc64/kernel/setup.c	2004-12-10 02:26:35.118359662 +1100
> @@ -1020,11 +1020,11 @@ void __init setup_arch(char **cmdline_p)
>  	/* set up the bootmem stuff with available memory */
>  	do_init_bootmem();
>  
> +	ppc_md.setup_arch();
> +
>  	/* Select the correct idle loop for the platform. */
>  	idle_setup();
>  
> -	ppc_md.setup_arch();
> -
>  	paging_init();
>  	ppc64_boot_msg(0x15, "Setup Done");
>  }
> diff -puN arch/ppc64/kernel/pSeries_setup.c~fix_vpa arch/ppc64/kernel/pSeries_setup.c
> --- foobar2/arch/ppc64/kernel/pSeries_setup.c~fix_vpa	2004-12-10 02:26:35.085362180 +1100
> +++ foobar2-anton/arch/ppc64/kernel/pSeries_setup.c	2004-12-10 02:26:35.120359510 +1100
> @@ -234,6 +234,9 @@ static void __init pSeries_setup_arch(vo
>  #endif
>  
>  	pSeries_nvram_init();
> +
> +	if (cur_cpu_spec->firmware_features & FW_FEATURE_SPLPAR)
> +		vpa_init(boot_cpuid);
>  }
>  
>  static int __init pSeries_init_panel(void)
> diff -puN include/asm-ppc64/plpar_wrappers.h~fix_vpa include/asm-ppc64/plpar_wrappers.h
> --- foobar2/include/asm-ppc64/plpar_wrappers.h~fix_vpa	2004-12-10 02:26:35.090361799 +1100
> +++ foobar2-anton/include/asm-ppc64/plpar_wrappers.h	2004-12-10 02:26:35.121359433 +1100
> @@ -22,12 +22,14 @@ static inline long cede_processor(void)
>  	return(0); 
>  }
>  
> -static inline long register_vpa(unsigned long flags, unsigned long proc, unsigned long vpa)
> +static inline long register_vpa(unsigned long flags, unsigned long proc,
> +				unsigned long vpa)
>  {
> -	plpar_hcall_norets(H_REGISTER_VPA, flags, proc, vpa);
> -	return(0); 
> +	return plpar_hcall_norets(H_REGISTER_VPA, flags, proc, vpa);
>  }
>  
> +void vpa_init(int cpu);
> +
>  static inline long plpar_pte_remove(unsigned long flags,
>  				    unsigned long ptex,
>  				    unsigned long avpn,
> diff -puN arch/ppc64/kernel/pSeries_lpar.c~fix_vpa arch/ppc64/kernel/pSeries_lpar.c
> --- foobar2/arch/ppc64/kernel/pSeries_lpar.c~fix_vpa	2004-12-10 02:26:35.095361417 +1100
> +++ foobar2-anton/arch/ppc64/kernel/pSeries_lpar.c	2004-12-10 02:55:47.622076537 +1100
> @@ -259,6 +259,22 @@ out:
>  	return found;
>  }
>  
> +void vpa_init(int cpu)
> +{
> +	int hwcpu = get_hard_smp_processor_id(cpu);
> +	unsigned long vpa = (unsigned long)&(paca[cpu].lppaca);
> +	long ret;
> +	unsigned long flags;
> +
> +	/* Register the Virtual Processor Area (VPA) */
> +	flags = 1UL << (63 - 18);
> +	ret = register_vpa(flags, hwcpu, __pa(vpa));
> +
> +	if (ret)
> +		printk(KERN_ERR "WARNING: vpa_init: VPA registration for "
> +				"cpu %d (hw %d) of area %lx returns %ld\n",
> +				cpu, hwcpu, __pa(vpa), ret);
> +}
>  
>  long pSeries_lpar_hpte_insert(unsigned long hpte_group,
>  			      unsigned long va, unsigned long prpn,
> _
> _______________________________________________
> Linuxppc64-dev mailing list
> Linuxppc64-dev at ozlabs.org
> https://ozlabs.org/cgi-bin/mailman/listinfo/linuxppc64-dev
> 




More information about the Linuxppc64-dev mailing list