[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] x86: avoid redundant TLB flushes
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1233684859 0 # Node ID c3b5e36248c94d43a1619201de114fd84135a20c # Parent 66020c204f145a11d3b6f6b13912fc3e245fccb5 x86: avoid redundant TLB flushes While in some places the guest requested flushes were already folded into the deferred ops, this wasn't done consistently. Also avoid using an uninitialized variable, even if doing so has no correctness issue. Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx> --- xen/arch/x86/mm.c | 24 +++++++++++++++++------- 1 files changed, 17 insertions(+), 7 deletions(-) diff -r 66020c204f14 -r c3b5e36248c9 xen/arch/x86/mm.c --- a/xen/arch/x86/mm.c Tue Feb 03 18:13:55 2009 +0000 +++ b/xen/arch/x86/mm.c Tue Feb 03 18:14:19 2009 +0000 @@ -2773,7 +2773,7 @@ int do_mmuext_op( } case MMUEXT_TLB_FLUSH_ALL: - flush_tlb_mask(d->domain_dirty_cpumask); + this_cpu(percpu_mm_info).deferred_ops |= DOP_FLUSH_ALL_TLBS; break; case MMUEXT_INVLPG_ALL: @@ -3567,34 +3567,40 @@ int do_update_va_mapping(unsigned long v if ( pl1e ) guest_unmap_l1e(v, pl1e); - process_deferred_ops(); - switch ( flags & UVMF_FLUSHTYPE_MASK ) { case UVMF_TLB_FLUSH: switch ( (bmap_ptr = flags & ~UVMF_FLUSHTYPE_MASK) ) { case UVMF_LOCAL: - flush_tlb_local(); + this_cpu(percpu_mm_info).deferred_ops |= DOP_FLUSH_TLB; break; case UVMF_ALL: - flush_tlb_mask(d->domain_dirty_cpumask); + this_cpu(percpu_mm_info).deferred_ops |= DOP_FLUSH_ALL_TLBS; break; default: + if ( this_cpu(percpu_mm_info).deferred_ops & DOP_FLUSH_ALL_TLBS ) + break; if ( unlikely(!is_pv_32on64_domain(d) ? get_user(vmask, (unsigned long *)bmap_ptr) : get_user(vmask, (unsigned int *)bmap_ptr)) ) - rc = -EFAULT; + rc = -EFAULT, vmask = 0; pmask = vcpumask_to_pcpumask(d, vmask); + if ( cpu_isset(smp_processor_id(), pmask) ) + this_cpu(percpu_mm_info).deferred_ops &= ~DOP_FLUSH_TLB; flush_tlb_mask(pmask); break; } break; case UVMF_INVLPG: + if ( this_cpu(percpu_mm_info).deferred_ops & DOP_FLUSH_ALL_TLBS ) + break; switch ( (bmap_ptr = flags & ~UVMF_FLUSHTYPE_MASK) ) { case UVMF_LOCAL: + if ( this_cpu(percpu_mm_info).deferred_ops & DOP_FLUSH_TLB ) + break; if ( !paging_mode_enabled(d) || (paging_invlpg(v, va) != 0) ) flush_tlb_one_local(va); @@ -3606,13 +3612,17 @@ int do_update_va_mapping(unsigned long v if ( unlikely(!is_pv_32on64_domain(d) ? get_user(vmask, (unsigned long *)bmap_ptr) : get_user(vmask, (unsigned int *)bmap_ptr)) ) - rc = -EFAULT; + rc = -EFAULT, vmask = 0; pmask = vcpumask_to_pcpumask(d, vmask); + if ( this_cpu(percpu_mm_info).deferred_ops & DOP_FLUSH_TLB ) + cpu_clear(smp_processor_id(), pmask); flush_tlb_one_mask(pmask, va); break; } break; } + + process_deferred_ops(); return rc; } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |