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]"

Reply via email to