[PATCH 2/2] powerpc/hibernate: add restore mmu context after resume

Wang Dongsheng-B40534 B40534 at freescale.com
Wed Jul 10 20:11:54 EST 2013


Hi scott & ben,

About this patch do you have any suggestions?

Thanks

- dongsheng

> -----Original Message-----
> From: Wang Dongsheng-B40534
> Sent: Sunday, June 09, 2013 6:38 PM
> To: benh at kernel.crashing.org
> Cc: johannes at sipsolutions.net; anton at enomsg.org; Wood Scott-B07421;
> galak at kernel.crashing.org; linuxppc-dev at lists.ozlabs.org; Wang Dongsheng-
> B40534
> Subject: [PATCH 2/2] powerpc/hibernate: add restore mmu context after
> resume
> 
> add restore_mmu_context to replace switch_mmu_context in
> restore_processor_state, because the switch_mmu_context will do
> a whole pile of stuff that are probably completely unnecessary.
> 
> There just need to restore the existing process context, and
> invalidate TLB for boot core.
> 
> Signed-off-by: Wang Dongsheng <dongsheng.wang at freescale.com>
> ---
>  arch/powerpc/include/asm/tlbflush.h |  2 ++
>  arch/powerpc/kernel/swsusp.c        |  4 +---
>  arch/powerpc/mm/tlb_nohash.c        | 12 ++++++++++++
>  3 files changed, 15 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/powerpc/include/asm/tlbflush.h
> b/arch/powerpc/include/asm/tlbflush.h
> index 61a5927..c401fe3 100644
> --- a/arch/powerpc/include/asm/tlbflush.h
> +++ b/arch/powerpc/include/asm/tlbflush.h
> @@ -44,6 +44,8 @@ extern void local_flush_tlb_page(struct vm_area_struct
> *vma, unsigned long vmadd
>  extern void __local_flush_tlb_page(struct mm_struct *mm, unsigned long
> vmaddr,
>  				   int tsize, int ind);
> 
> +extern void restore_mmu_context(void);
> +
>  #ifdef CONFIG_SMP
>  extern void flush_tlb_mm(struct mm_struct *mm);
>  extern void flush_tlb_page(struct vm_area_struct *vma, unsigned long
> vmaddr);
> diff --git a/arch/powerpc/kernel/swsusp.c b/arch/powerpc/kernel/swsusp.c
> index eae33e1..0b104d7 100644
> --- a/arch/powerpc/kernel/swsusp.c
> +++ b/arch/powerpc/kernel/swsusp.c
> @@ -32,7 +32,5 @@ void save_processor_state(void)
> 
>  void restore_processor_state(void)
>  {
> -#ifdef CONFIG_PPC32
> -	switch_mmu_context(current->active_mm, current->active_mm);
> -#endif
> +	restore_mmu_context();
>  }
> diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c
> index df32a83..a5a0708 100644
> --- a/arch/powerpc/mm/tlb_nohash.c
> +++ b/arch/powerpc/mm/tlb_nohash.c
> @@ -39,10 +39,12 @@
>  #include <linux/of_fdt.h>
>  #include <linux/hugetlb.h>
> 
> +#include <asm/current.h>
>  #include <asm/tlbflush.h>
>  #include <asm/tlb.h>
>  #include <asm/code-patching.h>
>  #include <asm/hugetlb.h>
> +#include <asm/mmu_context.h>
> 
>  #include "mmu_decl.h"
> 
> @@ -193,6 +195,16 @@ void local_flush_tlb_page(struct vm_area_struct *vma,
> unsigned long vmaddr)
>  }
>  EXPORT_SYMBOL(local_flush_tlb_page);
> 
> +void restore_mmu_context(void)
> +{
> +	struct mm_struct *mm = current->active_mm;
> +
> +	set_context(mm->context.id, mm->pgd);
> +
> +	_tlbil_all();
> +}
> +EXPORT_SYMBOL(restore_mmu_context);
> +
>  /*
>   * And here are the SMP non-local implementations
>   */
> --
> 1.8.0




More information about the Linuxppc-dev mailing list