vm: Detect and enable bzeront() when available for vm zeroidle.
authorVenkatesh Srinivas <me@endeavour.zapto.org>
Sat, 5 Jun 2010 01:16:31 +0000 (18:16 -0700)
committerVenkatesh Srinivas <me@endeavour.zapto.org>
Fri, 11 Jun 2010 05:20:09 +0000 (22:20 -0700)
bzeront() is available when SSE is detected and mmxopt = 1.

sys/platform/pc32/isa/npx.c
sys/platform/pc64/isa/npx.c
sys/vm/vm_zeroidle.c

index 1516315..8f60077 100644 (file)
@@ -153,6 +153,8 @@ static      void    fpurstor        (union savefpu *);
 
 int    hw_float;               /* XXX currently just alias for npx_exists */
 
+extern int bzeront_avail;
+
 SYSCTL_INT(_hw,HW_FLOATINGPT, floatingpoint,
        CTLFLAG_RD, &hw_float, 0, 
        "Floatingpoint instructions executed in hardware");
@@ -492,6 +494,9 @@ npx_attach(device_t dev)
                        /* XXX */
                }
        }
+
+       if ((cpu_feature & CPUID_MMX) && (cpu_feature & CPUID_SSE) && mmxopt)
+               bzeront_avail = 1;
 #endif
 #if 0
        if (cpu_class == CPUCLASS_586 && npx_ex16 && npx_exists &&
index 58a085b..666b495 100644 (file)
@@ -154,6 +154,8 @@ static      void    fpurstor        (union savefpu *);
 
 int    hw_float;               /* XXX currently just alias for npx_exists */
 
+extern int bzeront_avail;
+
 SYSCTL_INT(_hw,HW_FLOATINGPT, floatingpoint,
        CTLFLAG_RD, &hw_float, 0, 
        "Floatingpoint instructions executed in hardware");
@@ -492,6 +494,9 @@ npx_attach(device_t dev)
                        /* XXX */
                }
        }
+
+        if ((cpu_feature & CPUID_MMX) && (cpu_feature & CPUID_SSE) && mmxopt)
+                bzeront_avail = 1;
 #endif
 #if 0
        if (cpu_class == CPUCLASS_586 && npx_ex16 && npx_exists &&
index fc12339..fa857be 100644 (file)
@@ -72,6 +72,7 @@ SYSCTL_INT(_vm, OID_AUTO, idlezero_enable, CTLFLAG_RW, &idlezero_enable, 0,
 static int idlezero_rate = NPAGES_RUN;
 SYSCTL_INT(_vm, OID_AUTO, idlezero_rate, CTLFLAG_RW, &idlezero_rate, 0,
           "Maximum pages per second to zero");
+int bzeront_avail = 0;
 static int idlezero_nocache = 0;
 SYSCTL_INT(_vm, OID_AUTO, idlezero_nocache, CTLFLAG_RW, &idlezero_nocache, 0,
           "Maximum pages per second to zero");
@@ -239,6 +240,8 @@ pagezero_start(void __unused *arg)
        int error;
        struct thread *td;
 
+       idlezero_nocache = bzeront_avail;
+
        error = kthread_create(vm_pagezero, NULL, &td, "pagezero");
        if (error)
                panic("pagezero_start: error %d\n", error);