1/2 - Remove RTAS arguments from PACA
Subsystems (4)
Andrew, please apply:
This patch removes the RTAS arguments structure on ppc64 from the PACA. The args have to be in the RMO, but since we have a global spinlock for RTAS anyway, there's no reason to have a separate copy of the args per-CPU. This patch replaces the PACA field with a single instance in the global rtas structure.
The one exception is for the rtas_stop_self() call, which can't take the lock, because it never returns. But it has a fixed set of arguments, so we can use another global instance which is initialized at boot.
This lets us remove rtas.h from paca.h, which substantially reduces overall #include hairiness (because paca.h is now, as it wants to be, a nice low-level structure-defining header which relies on very little and can safely be included almost anywhere). Although it does add some noise to the patch, because a bunch of places relied on the indirect inclusion of rtas.h, or even more indirect inclusions (see the hunks applying to eeh.h and current.h!).
arch/ppc64/kernel/rtas.c +19 -16
@@ -45,11 +45,10 @@void call_rtas_display_status (char c) { -struct rtas_args *args; +struct rtas_args *args = &rtas.args;unsigned long s;spin_lock_irqsave (&rtas.lock, s); - args = &(get_paca ()->xRtas); args->token =10 ; args->nargs =1 ;
@@ -90,15 +89,15 @@ err_args.args[2 ] =0 ; temp_args = *rtas_args; -get_paca ()->xRtas = err_args; + rtas.args = err_args;PPCDBG (PPCDBG_RTAS ,"\tentering rtas with 0x%lx\n" ,__pa (&err_args)); -enter_rtas (__pa (&get_paca ()->xRtas)); +enter_rtas (__pa (&rtas.args));PPCDBG (PPCDBG_RTAS ,"\treturned from rtas ...\n" ); - err_args =get_paca ()->xRtas; -get_paca ()->xRtas = temp_args; + err_args = rtas.args; + rtas.args = temp_args;return err_args.rets[0 ]; }
@@ -134,7 +133,7 @@/* Gotta do something different here, use global lock for now... */ spin_lock_irqsave (&rtas.lock, s); - rtas_args = &(get_paca ()->xRtas); + rtas_args = &rtas.args; rtas_args->token = token; rtas_args->nargs = nargs;
@@ -440,9 +439,9 @@spin_lock_irqsave (&rtas.lock, flags); -get_paca ()->xRtas = args; -enter_rtas (__pa (&get_paca ()->xRtas)); - args =get_paca ()->xRtas; + rtas.args = args; +enter_rtas (__pa (&rtas.args)); + args = rtas.args;spin_unlock_irqrestore (&rtas.lock, flags);
@@ -460,19 +459,23 @@ }#ifdef CONFIG_HOTPLUG_CPU -/* This version can't take the spinlock. */ +/* This version can't take the spinlock, because it never returns */ + +struct rtas_args rtas_stop_self_args = { +/* The token is initialized for real in setup_system() */ + .token =RTAS_UNKNOWN_SERVICE , + .nargs =0 , + .nret =1 , + .rets = &rtas_stop_self_args.args[0 ], +};void rtas_stop_self (void ) { -struct rtas_args *rtas_args = &(get_paca ()->xRtas); +struct rtas_args *rtas_args = &rtas_stop_self_args;local_irq_disable (); - rtas_args->token =rtas_token ("stop-self" );BUG_ON (rtas_args->token ==RTAS_UNKNOWN_SERVICE ); - rtas_args->nargs =0 ; - rtas_args->nret =1 ; - rtas_args->rets = &(rtas_args->args[0 ]);printk ("%u %u Ready to die...\n" ,smp_processor_id (),hard_smp_processor_id ());
arch/ppc64/kernel/traps.c +1 -0
@@ -36,6 +36,7 @@#include <asm/io.h> #include <asm/processor.h> #include <asm/ppcdebug.h> +#include <asm/rtas.h> #ifdef CONFIG_PPC_PSERIES /* This is true if we are using the firmware NMI handler (typically LPAR) */
arch/ppc64/kernel/eeh.c +1 -0
@@ -31,6 +31,7 @@#include <asm/io.h> #include <asm/machdep.h> #include <asm/pgtable.h> +#include <asm/rtas.h> #include "pci.h" #undef DEBUG
arch/ppc64/kernel/rtc.c +1 -0
@@ -40,6 +40,7 @@#include <asm/uaccess.h> #include <asm/system.h> #include <asm/time.h> +#include <asm/rtas.h> #include <asm/iSeries/LparData.h> #include <asm/iSeries/mf.h>
arch/ppc64/kernel/setup.c +5 -0
@@ -46,6 +46,7 @@#include <asm/nvram.h> #include <asm/setup.h> #include <asm/system.h> +#include <asm/rtas.h> extern unsigned long klimit;/* extern void *stab; */
@@ -254,6 +255,10 @@ }#endif /* CONFIG_PPC_PMAC */ +#if defined(CONFIG_HOTPLUG_CPU ) && !defined(CONFIG_PPC_PMAC ) + rtas_stop_self_args.token =rtas_token ("stop-self" ); +#endif /* CONFIG_HOTPLUG_CPU && !CONFIG_PPC_PMAC */ +/* Finish initializing the hash table (do the dynamic * patching for the fast-path hashtable.S code) */
arch/ppc64/kernel/pSeries_pci.c +1 -0
@@ -40,6 +40,7 @@#include <asm/ppcdebug.h> #include <asm/naca.h> #include <asm/iommu.h> +#include <asm/rtas.h> #include "open_pic.h" #include "pci.h"
arch/ppc64/kernel/smp.c +1 -0
@@ -52,6 +52,7 @@#include <asm/xics.h> #include <asm/cputable.h> #include <asm/system.h> +#include <asm/rtas.h> int smp_threads_ready;unsigned long cache_decay_ticks;
arch/ppc64/kernel/lparcfg.c +1 -0
@@ -28,6 +28,7 @@#include <asm/iSeries/ItLpPaca.h> #include <asm/hvcall.h> #include <asm/cputable.h> +#include <asm/rtas.h> #define MODULE_VERS "1.0"#define MODULE_NAME "lparcfg"
arch/ppc64/xmon/xmon.c +1 -0
@@ -30,6 +30,7 @@#include <asm/paca.h> #include <asm/ppcdebug.h> #include <asm/cputable.h> +#include <asm/rtas.h> #include "nonstdio.h" #include "privinst.h"
include/asm-ppc64/rtas.h +3 -4
@@ -51,18 +51,17 @@u32 nargs;u32 nret;rtas_arg_t args[16 ]; -#if 0 -spinlock_t lock; -#endif rtas_arg_t *rets;/* Pointer to return values in args[]. */ }; +extern struct rtas_args rtas_stop_self_args; +struct rtas_t {unsigned long entry;/* physical address pointer */ unsigned long base;/* physical address pointer */ unsigned long size;spinlock_t lock; - +struct rtas_args args;struct device_node *dev;/* virtual address pointer */ };
include/asm-ppc64/paca.h +1 -3
@@ -29,7 +29,6 @@#include <asm/iSeries/ItLpPaca.h> #include <asm/iSeries/ItLpRegSave.h> #include <asm/iSeries/ItLpQueue.h> -#include <asm/rtas.h> #include <asm/mmu.h> #include <asm/processor.h>
@@ -122,10 +121,9 @@* CACHE_LINE_17-18 0x0800 - 0x08FF Reserved *===================================================================================== */ -struct rtas_args xRtas;/* Per processor RTAS struct */ u64 xR1;/* r1 save for RTAS calls */ u64 xSavedMsr;/* Old msr saved here by HvCall */ -u8 rsvd5[256 -16 -sizeof (struct rtas_args )]; +u8 rsvd5[256 -16 ];/*===================================================================================== * CACHE_LINE_19-30 0x0900 - 0x0EFF Reserved
include/asm-ppc64/eeh.h +1 -0
@@ -24,6 +24,7 @@#include <linux/init.h> struct pci_dev ; +struct device_node ;/* I/O addresses are converted to EEH "tokens" such that a driver will cause * a bad page fault if the address is used directly (i.e. these addresses are
include/asm-ppc64/current.h +0 -2
@@ -10,8 +10,6 @@* 2 of the License, or (at your option) any later version. */ -#include <asm/thread_info.h> -#define get_current () (get_paca()->xCurrent)#define current get_current()
drivers/pci/hotplug/rpadlpar_core.c +1 -0
@@ -18,6 +18,7 @@#include <linux/pci.h> #include <asm/pci-bridge.h> #include <asm/semaphore.h> +#include <asm/rtas.h> #include "../pci.h" #include "rpaphp.h" #include "rpadlpar.h"
drivers/pci/hotplug/rpaphp_pci.c +1 -0
@@ -24,6 +24,7 @@*/ #include <linux/pci.h> #include <asm/pci-bridge.h> +#include <asm/rtas.h> #include "../pci.h" /* for pci_add_new_bus */ #include "rpaphp.h"
drivers/pci/hotplug/rpaphp_slot.c +1 -0
@@ -27,6 +27,7 @@#include <linux/kobject.h> #include <linux/sysfs.h> #include <linux/pci.h> +#include <asm/rtas.h> #include "rpaphp.h" static ssize_t removable_read_file (struct hotplug_slot *php_slot,char *buf)
Signature · 4 lines
David Gibson | For every complex problem there is a david AT gibson.dropbear.id.au | solution which is simple, neat and | wrong. http://www.ozlabs.org/people/dgibson