svn commit: r195836 - head/sys/i386/i386
Alan Cox
alc at FreeBSD.org
Thu Jul 23 19:43:25 UTC 2009
Author: alc
Date: Thu Jul 23 19:43:23 2009
New Revision: 195836
URL: http://svn.freebsd.org/changeset/base/195836
Log:
Eliminate unnecessary cache and TLB flushes by pmap_change_attr(). (This
optimization was implemented in the amd64 version roughly 1 year ago.)
Approved by: re (kensmith)
Modified:
head/sys/i386/i386/pmap.c
Modified: head/sys/i386/i386/pmap.c
==============================================================================
--- head/sys/i386/i386/pmap.c Thu Jul 23 19:03:04 2009 (r195835)
+++ head/sys/i386/i386/pmap.c Thu Jul 23 19:43:23 2009 (r195836)
@@ -4482,6 +4482,7 @@ pmap_change_attr(vm_offset_t va, vm_size
pt_entry_t *pte;
u_int opte, npte;
pd_entry_t *pde;
+ boolean_t changed;
base = trunc_page(va);
offset = va & PAGE_MASK;
@@ -4505,6 +4506,8 @@ pmap_change_attr(vm_offset_t va, vm_size
return (EINVAL);
}
+ changed = FALSE;
+
/*
* Ok, all the pages exist and are 4k, so run through them updating
* their cache mode.
@@ -4522,6 +4525,8 @@ pmap_change_attr(vm_offset_t va, vm_size
npte |= pmap_cache_bits(mode, 0);
} while (npte != opte &&
!atomic_cmpset_int((u_int *)pte, opte, npte));
+ if (npte != opte)
+ changed = TRUE;
tmpva += PAGE_SIZE;
size -= PAGE_SIZE;
}
@@ -4530,10 +4535,12 @@ pmap_change_attr(vm_offset_t va, vm_size
* Flush CPU caches to make sure any data isn't cached that shouldn't
* be, etc.
*/
- pmap_invalidate_range(kernel_pmap, base, tmpva);
- /* If "Self Snoop" is supported, do nothing. */
- if (!(cpu_feature & CPUID_SS))
- pmap_invalidate_cache();
+ if (changed) {
+ pmap_invalidate_range(kernel_pmap, base, tmpva);
+ /* If "Self Snoop" is supported, do nothing. */
+ if (!(cpu_feature & CPUID_SS))
+ pmap_invalidate_cache();
+ }
return (0);
}
More information about the svn-src-all
mailing list