On Wed, 2019-03-13 at 10:06 +0100, Christophe Leroy wrote: > Hello, Thanks for reviewing :) > > Le 13/03/2019 à 04:42, Alastair D'Silva a écrit : > > From: Alastair D'Silva <alast...@d-silva.org> > > > > When building an LTO kernel, the existing code generates warnings: > > ./arch/powerpc/include/asm/paca.h:37:30: warning: register of > > ‘local_paca’ used for multiple global register variables > > register struct paca_struct *local_paca asm("r13"); > > ^ > > ./arch/powerpc/include/asm/paca.h:37:30: note: conflicts with > > ‘local_paca’ > > How do you build a LTO kernel ?
I'm using Andi Kleen's LTO tree: https://github.com/andikleen/linux-misc/tree/lto-420-1 with a few other patches: https://github.com/andikleen/linux-misc/pull/27 You'll need to add the following to your .config: CONFIG_LTO_MENU=y CONFIG_LTO=y > > > This patch reworks local_paca into an inline getter & setter > > function, > > which addresses the warning. > > This patch adds sparse warnings, see > https://patchwork.ozlabs.org/patch/1055875/ These warnings are bogus, they replace warnings that flagged against spinlock.h. > > Generated ASM from this patch is broadly similar (addresses have > > changed and the compiler uses different GPRs in some places). > > Your text might be confusion. When I read it the first time I > thought > you were saying that the compiler was now using another GPR than r13. > I'll see if I can improve it. > > Signed-off-by: Alastair D'Silva <alast...@d-silva.org> > > I guess the same has to be done for current, see > arch/powerpc/include/asm/current.h : > > /* > * We keep `current' in r2 for speed. > */ > register struct task_struct *current asm ("r2"); Hmm, I didn't see problems on PPC64 as that already uses an inline function. I'll address this in another patch for the PPC32 case. > > --- > > arch/powerpc/include/asm/paca.h | 44 +++++++++++++++++++++++----- > > ----- > > arch/powerpc/kernel/paca.c | 2 +- > > 2 files changed, 32 insertions(+), 14 deletions(-) > > > > diff --git a/arch/powerpc/include/asm/paca.h > > b/arch/powerpc/include/asm/paca.h > > index e843bc5d1a0f..9c9e2dea0f9b 100644 > > --- a/arch/powerpc/include/asm/paca.h > > +++ b/arch/powerpc/include/asm/paca.h > > @@ -34,19 +34,6 @@ > > #include <asm/cpuidle.h> > > #include <asm/atomic.h> > > > > -register struct paca_struct *local_paca asm("r13"); > > - > > -#if defined(CONFIG_DEBUG_PREEMPT) && defined(CONFIG_SMP) > > -extern unsigned int debug_smp_processor_id(void); /* from > > linux/smp.h */ > > -/* > > - * Add standard checks that preemption cannot occur when using > > get_paca(): > > - * otherwise the paca_struct it points to may be the wrong one > > just after. > > - */ > > -#define get_paca() ((void) debug_smp_processor_id(), local_paca) > > -#else > > -#define get_paca() local_paca > > -#endif > > - > > #ifdef CONFIG_PPC_PSERIES > > #define get_lppaca() (get_paca()->lppaca_ptr) > > #endif > > @@ -266,6 +253,37 @@ struct paca_struct { > > #endif > > } ____cacheline_aligned; > > > > +#if defined(CONFIG_DEBUG_PREEMPT) && defined(CONFIG_SMP) > > +extern unsigned int debug_smp_processor_id(void); /* from > > linux/smp.h */ > > +#endif > > Why moving this down, why not leaving at the same place as before ? > > If you really need to move it, you should remove the 'extern' at the > same time to make checkpatch happy. I moved it to keep it close to the usage of it. I suppose the new implementation should be in the same place though. > > + > > +static inline struct paca_struct *get_paca_no_preempt_check(void) > > +{ > > + register struct paca_struct *paca asm("r13"); > > Should be a blank line there. Whoops, I thought I ran checkpatch, but clearly, I forgot. I'll resubmit. > > + return paca; > > +} > > + > > +static inline struct paca_struct *get_paca(void) > > +{ > > +#if defined(CONFIG_DEBUG_PREEMPT) && defined(CONFIG_SMP) > > + /* > > + * Add standard checks that preemption cannot occur when using > > get_paca(): > > + * otherwise the paca_struct it points to may be the wrong one > > just after. > > + */ > > + debug_smp_processor_id(); > > +#endif > > + return get_paca_no_preempt_check(); > > +} > > + > > +#define local_paca get_paca_no_preempt_check() > > + > > +static inline void set_paca(struct paca_struct *new) > > +{ > > + register struct paca_struct *paca asm("r13"); > > Blank line should be added here. > > > + paca = new; > > +} > > + > > + > > extern void copy_mm_to_paca(struct mm_struct *mm); > > extern struct paca_struct **paca_ptrs; > > extern void initialise_paca(struct paca_struct *new_paca, int > > cpu); > > diff --git a/arch/powerpc/kernel/paca.c > > b/arch/powerpc/kernel/paca.c > > index 913bfca09c4f..ae5c243f9d5a 100644 > > --- a/arch/powerpc/kernel/paca.c > > +++ b/arch/powerpc/kernel/paca.c > > @@ -172,7 +172,7 @@ void __init initialise_paca(struct paca_struct > > *new_paca, int cpu) > > void setup_paca(struct paca_struct *new_paca) > > { > > /* Setup r13 */ > > - local_paca = new_paca; > > + set_paca(new_paca); > > > > #ifdef CONFIG_PPC_BOOK3E > > /* On Book3E, initialize the TLB miss exception frames */ > > > > Christophe > -- Alastair D'Silva Open Source Developer Linux Technology Centre, IBM Australia mob: 0423 762 819