]> git.saurik.com Git - apple/xnu.git/blobdiff - tools/tests/superpages/measure_tlbs.c
xnu-4903.270.47.tar.gz
[apple/xnu.git] / tools / tests / superpages / measure_tlbs.c
index 02097c5889db03da51b859315c50c02eb5f16e16..d413f0bab8fb77932fecc28d47b3c70005d19167 100644 (file)
 #define RUNS2 (RUNS0/20)
 
 clock_t
-testt(boolean_t superpages, int mode, int write, int kb) {
+testt(boolean_t superpages, int mode, int write, int kb)
+{
        static int sum;
        char *data;
        unsigned int run, p, p2, i, res;
        mach_vm_address_t addr = 0;
-       int pages = kb/4;
-       mach_vm_size_t  size = SUPERPAGE_ROUND_UP(pages*PAGE_SIZE); /* allocate full superpages */
+       int pages = kb / 4;
+       mach_vm_size_t  size = SUPERPAGE_ROUND_UP(pages * PAGE_SIZE); /* allocate full superpages */
        int kr;
 
        kr = mach_vm_allocate(mach_task_self(), &addr, size, VM_FLAGS_ANYWHERE | (superpages? VM_FLAGS_SUPERPAGE_SIZE_2MB : VM_FLAGS_SUPERPAGE_NONE));
 
-       if (!addr)
+       if (!addr) {
                return 0;
+       }
 
        data = (char*)(long)addr;
 
        /* touch every base page to make sure everything is mapped and zero-filled */
-       for (p = 0; p<pages; p++) {
-               sum += data[p*PAGE_SIZE];
+       for (p = 0; p < pages; p++) {
+               sum += data[p * PAGE_SIZE];
        }
 
        clock_t a = clock(); /* start timing */
        switch (mode) {
-               case 0: /* one byte every 4096 */
-                       if (write) {
-                               for (run = 0; run < RUNS0; run++) {
-                                       for (p = 0; p<pages; p++) {
-                                               data[p*PAGE_SIZE] = run & 0xFF;
-                                       }
+       case 0:         /* one byte every 4096 */
+               if (write) {
+                       for (run = 0; run < RUNS0; run++) {
+                               for (p = 0; p < pages; p++) {
+                                       data[p * PAGE_SIZE] = run & 0xFF;
                                }
-                       } else {
-                               for (run = 0; run < RUNS0; run++) {
-                                       for (p = 0; p<pages; p++) {
-                                               sum += data[p*PAGE_SIZE];
-                                       }
+                       }
+               } else {
+                       for (run = 0; run < RUNS0; run++) {
+                               for (p = 0; p < pages; p++) {
+                                       sum += data[p * PAGE_SIZE];
                                }
                        }
-                       break;
-               case 1: /* every byte */
-                       if (write) {
-                               for (run = 0; run < RUNS1/PAGE_SIZE; run++) {
-                                       for (i = 0; i<pages*PAGE_SIZE; i++) {
-                                               data[i] = run & 0xFF;
-                                       }
+               }
+               break;
+       case 1:         /* every byte */
+               if (write) {
+                       for (run = 0; run < RUNS1 / PAGE_SIZE; run++) {
+                               for (i = 0; i < pages * PAGE_SIZE; i++) {
+                                       data[i] = run & 0xFF;
                                }
-                       } else {
-                               for (run = 0; run < RUNS1/PAGE_SIZE; run++) {
-                                       for (i = 0; i<pages*PAGE_SIZE; i++) {
-                                               sum += data[i];
-                                       }
+                       }
+               } else {
+                       for (run = 0; run < RUNS1 / PAGE_SIZE; run++) {
+                               for (i = 0; i < pages * PAGE_SIZE; i++) {
+                                       sum += data[i];
                                }
                        }
-                       break;
-               case 2: /* random */
+               }
+               break;
+       case 2:         /* random */
 #define PRIME 15485863
-#define NODE_SIZE 128          /* bytes per node */
-#define NODE_ACCESSES 16       /* accesses per node */
-                       p = 0;
-                       if (write) {
-                               for (run = 0; run < RUNS2*pages; run++) {
-                                       p += PRIME;
-                                       p2 = p % (pages*PAGE_SIZE/NODE_SIZE);
+#define NODE_SIZE 128           /* bytes per node */
+#define NODE_ACCESSES 16        /* accesses per node */
+               p = 0;
+               if (write) {
+                       for (run = 0; run < RUNS2 * pages; run++) {
+                               p += PRIME;
+                               p2 = p % (pages * PAGE_SIZE / NODE_SIZE);
 //printf("p2 = %d\n", p2);
-                                       for (i = 0; i < NODE_ACCESSES; i++) {
-                                               data[p2*NODE_SIZE+i] = run & 0xFF;
-                                       }
+                               for (i = 0; i < NODE_ACCESSES; i++) {
+                                       data[p2 * NODE_SIZE + i] = run & 0xFF;
                                }
-                       } else {
-                               for (run = 0; run < RUNS2*pages; run++) {
-                                       p += PRIME;
-                                       p2 = p % (pages*PAGE_SIZE/NODE_SIZE);
-                                       for (i = 0; i < NODE_ACCESSES; i++) {
-                                               sum += data[p2*NODE_SIZE+i];
-                                       }
+                       }
+               } else {
+                       for (run = 0; run < RUNS2 * pages; run++) {
+                               p += PRIME;
+                               p2 = p % (pages * PAGE_SIZE / NODE_SIZE);
+                               for (i = 0; i < NODE_ACCESSES; i++) {
+                                       sum += data[p2 * NODE_SIZE + i];
                                }
                        }
-                       break;
+               }
+               break;
        }
        clock_t b = clock(); /* stop timing */
        mach_vm_deallocate(mach_task_self(), addr, size);
-       res = b-a;
+       res = b - a;
        res /= pages;
        return res;
 }
 
-int main(int argc, char **argv) {
+int
+main(int argc, char **argv)
+{
        int kb;
        uint64_t time1, time2, time3, time4;
 
        int mode;
 
        printf("; m0 r s; m0 r b; m0 w s; m0 w b; m1 r s; m1 r b; m1 w s; m1 w b; m2 r s; m2 r b; m2 w s; m2 w b\n");
-       for (kb=START; kb<MAX; kb+=STEP) {
+       for (kb = START; kb < MAX; kb += STEP) {
                printf("%d", kb);
-               for (mode=0; mode<=2; mode++) {
-                       time1=time2=time3=time4=-1;
-                       time1 = testt(TRUE, mode, 0, kb);       // read super
-                       time2 = testt(FALSE, mode, 0, kb);      // read base
-                       time3 = testt(TRUE, mode, 1, kb);       // write super
-                       time4 = testt(FALSE, mode, 1, kb);      // write base
+               for (mode = 0; mode <= 2; mode++) {
+                       time1 = time2 = time3 = time4 = -1;
+                       time1 = testt(TRUE, mode, 0, kb);       // read super
+                       time2 = testt(FALSE, mode, 0, kb);      // read base
+                       time3 = testt(TRUE, mode, 1, kb);       // write super
+                       time4 = testt(FALSE, mode, 1, kb);      // write base
                        printf("; %lld; %lld; %lld; %lld", time1, time2, time3, time4);
                        fflush(stdout);
                }