Alan Cox wrote:
The next public revision guide from AMD will contain an errata (383)
that documents the bug. However, it doesn't really tell us anything
that we didn't already know.
Could someone on this list please test the attached patch in an amd64
FreeBSD 8 guest running on vSphere 4 with an AMD Family 10h processor
underneath? Before testing the patch, remove the manual setting of
vm.pmap.pg_ps_enabled="0" from /boot/loader.conf. After booting the
virtual machine, please run "sysctl vm.pmap.pg_ps_enabled" to verify
that superpage promotion has been automatically disabled.
Thanks,
Alan
Index: amd64/amd64/pmap.c
===================================================================
--- amd64/amd64/pmap.c (revision 204175)
+++ amd64/amd64/pmap.c (working copy)
@@ -686,6 +686,15 @@ pmap_init(void)
pv_entry_high_water = 9 * (pv_entry_max / 10);
/*
+ * Disable large page mappings by default if the kernel is running in
+ * a virtual machine on an AMD Family 10h processor. This is a work-
+ * around for Erratum 383.
+ */
+ if (vm_guest == VM_GUEST_VM && cpu_vendor_id == CPU_VENDOR_AMD &&
+ CPUID_TO_FAMILY(cpu_id) == 0x10)
+ pg_ps_enabled = 0;
+
+ /*
* Are large page mappings enabled?
*/
TUNABLE_INT_FETCH("vm.pmap.pg_ps_enabled", &pg_ps_enabled);
Index: kern/subr_param.c
===================================================================
--- kern/subr_param.c (revision 204175)
+++ kern/subr_param.c (working copy)
@@ -74,10 +74,6 @@ __FBSDID("$FreeBSD$");
#define MAXFILES (maxproc * 2)
#endif
-/* Values of enum VM_GUEST members are used as indices in
- * vm_guest_sysctl_names */
-enum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN };
-
static int sysctl_kern_vm_guest(SYSCTL_HANDLER_ARGS);
int hz;
Index: sys/systm.h
===================================================================
--- sys/systm.h (revision 204175)
+++ sys/systm.h (working copy)
@@ -45,6 +45,10 @@
#include <sys/queue.h>
#include <sys/stdint.h> /* for people using printf mainly */
+/* Values of enum VM_GUEST members are used as indices in
+ * vm_guest_sysctl_names */
+enum VM_GUEST { VM_GUEST_NO = 0, VM_GUEST_VM, VM_GUEST_XEN };
+
extern int cold; /* nonzero if we are doing a cold boot */
extern int rebooting; /* boot() has been called. */
extern const char *panicstr; /* panic message */
@@ -63,6 +67,7 @@ extern int bootverbose; /* nonzero to print
verbo
extern int maxusers; /* system tune hint */
extern int ngroups_max; /* max # of supplemental groups */
+extern int vm_guest; /* Running as virtual machine guest? */
#ifdef INVARIANTS /* The option is always available */
#define KASSERT(exp,msg) do {
\
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[email protected]"