From 2fbea8b491c5f4abea40a6d619d56e9acb4cf5cb Mon Sep 17 00:00:00 2001 From: "de Dinechin, Christophe (Integrity VM)" Date: Thu, 13 Dec 2007 15:03:07 +0000 Subject: [PATCH] --- yaml --- r: 75084 b: refs/heads/master c: aec103bfa60e9f72bd66a144236592f54b986a03 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/ia64/mm/tlb.c | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index a5be99a8d81d..91edf4c1dcb7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3cdc7fc7fd5bd1ead75758dfadef609a6e9fd3de +refs/heads/master: aec103bfa60e9f72bd66a144236592f54b986a03 diff --git a/trunk/arch/ia64/mm/tlb.c b/trunk/arch/ia64/mm/tlb.c index cef164729db7..655da240d13c 100644 --- a/trunk/arch/ia64/mm/tlb.c +++ b/trunk/arch/ia64/mm/tlb.c @@ -10,6 +10,7 @@ * IPI based ptc implementation and A-step IPI implementation. * Rohit Seth * Ken Chen + * Christophe de Dinechin : Avoid ptc.e on memory allocation */ #include #include @@ -89,9 +90,16 @@ ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start, { static DEFINE_SPINLOCK(ptcg_lock); - if (mm != current->active_mm || !current->mm) { - flush_tlb_all(); - return; + struct mm_struct *active_mm = current->active_mm; + + if (mm != active_mm) { + /* Restore region IDs for mm */ + if (mm && active_mm) { + activate_context(mm); + } else { + flush_tlb_all(); + return; + } } /* HW requires global serialization of ptc.ga. */ @@ -107,6 +115,10 @@ ia64_global_tlb_purge (struct mm_struct *mm, unsigned long start, } while (start < end); } spin_unlock(&ptcg_lock); + + if (mm != active_mm) { + activate_context(active_mm); + } } void