diff options
author | dillon <dillon@FreeBSD.org> | 2001-12-31 20:02:46 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2001-12-31 20:02:46 +0000 |
commit | 46fe7974a97df60eb6e1dcb3f63f21a9cf51c0e4 (patch) | |
tree | bfc0d38f07c50520fceccb5c49b99fa9eb34abb1 | |
parent | 544b7f650b84ebff1e5222615498b9bb03a79b74 (diff) | |
download | FreeBSD-src-46fe7974a97df60eb6e1dcb3f63f21a9cf51c0e4.zip FreeBSD-src-46fe7974a97df60eb6e1dcb3f63f21a9cf51c0e4.tar.gz |
You know those 'XXX what about SMP' comments in pmap_kenter()? Well,
they were right. Fix both kenter() and kremove() for SMP by ensuring that
the tlb is flushed on other cpu's. This will directly solve random-corruption
panic issues in -stable when it is MFC'd. Better to be safe then sorry, we
can optimize this later.
Original Suspicion by: peter
Maybe MFC: immediately on re's permission
-rw-r--r-- | sys/amd64/amd64/pmap.c | 13 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 13 |
2 files changed, 20 insertions, 6 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index fdbade3..881a2cc 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -700,8 +700,11 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa) pte = vtopte(va); opte = *pte; *pte = npte; - /*if (opte)*/ - invltlb_1pg(va); /* XXX what about SMP? */ +#ifdef SMP + invlpg(va); +#else + invltlb_1pg(va); +#endif } /* @@ -714,7 +717,11 @@ pmap_kremove(vm_offset_t va) pte = vtopte(va); *pte = 0; - invltlb_1pg(va); /* XXX what about SMP? */ +#ifdef SMP + invlpg(va); +#else + invltlb_1pg(va); +#endif } /* diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index fdbade3..881a2cc 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -700,8 +700,11 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa) pte = vtopte(va); opte = *pte; *pte = npte; - /*if (opte)*/ - invltlb_1pg(va); /* XXX what about SMP? */ +#ifdef SMP + invlpg(va); +#else + invltlb_1pg(va); +#endif } /* @@ -714,7 +717,11 @@ pmap_kremove(vm_offset_t va) pte = vtopte(va); *pte = 0; - invltlb_1pg(va); /* XXX what about SMP? */ +#ifdef SMP + invlpg(va); +#else + invltlb_1pg(va); +#endif } /* |