#include #include #include #include #include #include #include #include #include #include #define TESTTIMES 10000 void testRangePerf(void); static int __init test_init(void) { printk("BEGIN TEST\n"); testRangePerf(); printk("END TEST\n"); return 0; } static void __exit test_exit(void) { return; } void testRangePerf(void) { int i, j; struct timespec64 start, end; struct task_struct *ts; struct vm_area_struct *vma; printk("BEGIN testRangePerf\n"); ts = current; vma = ts->mm->mmap; printk("vma->start: %lx, vma->end: %lx, ttl = 0, PAGE_SIZE = 0x%lx\n", vma->vm_start, vma->vm_end, PAGE_SIZE); for (i = 1; i <= 10; i++) { ktime_get_ts64(&start); for (j = 0; j < TESTTIMES; j++) { __flush_tlb_range(vma, vma->vm_start, vma->vm_start + PAGE_SIZE * i, PAGE_SIZE, false); } ktime_get_ts64(&end); printk("test __flush_tlb_range with %04d pages, used time: %12lld ns\n", i, ((end.tv_sec - start.tv_sec) * 1000000000 + end.tv_nsec - start.tv_nsec) / TESTTIMES); msleep(100); } for (i = 16; i <= 512; i+=i) { ktime_get_ts64(&start); for (j = 0; j < TESTTIMES; j++) { __flush_tlb_range(vma, vma->vm_start, vma->vm_start + PAGE_SIZE * i, PAGE_SIZE, false); } ktime_get_ts64(&end); printk("test __flush_tlb_range with %04d pages, used time: %12lld ns\n", i, ((end.tv_sec - start.tv_sec) * 1000000000 + end.tv_nsec - start.tv_nsec) / TESTTIMES); msleep(100); } printk("vma->start: %lx, vma->end: %lx, ttl = 0, PAGE_SIZE = 0x%lx\n", vma->vm_start, vma->vm_end, PMD_SIZE); for (i = 1; i <= 10; i++) { ktime_get_ts64(&start); for (j = 0; j < TESTTIMES; j++) { __flush_tlb_range(vma, vma->vm_start, vma->vm_start + PMD_SIZE * i, PMD_SIZE, false); } ktime_get_ts64(&end); printk("test __flush_tlb_range with %04d pages, used time: %12lld ns\n", i, ((end.tv_sec - start.tv_sec) * 1000000000 + end.tv_nsec - start.tv_nsec) / TESTTIMES); msleep(100); } for (i = 16; i <= 512; i+=i) { ktime_get_ts64(&start); for (j = 0; j < TESTTIMES; j++) { __flush_tlb_range(vma, vma->vm_start, vma->vm_start + PMD_SIZE * i, PMD_SIZE, false); } ktime_get_ts64(&end); printk("test __flush_tlb_range with %04d pages, used time: %12lld ns\n", i, ((end.tv_sec - start.tv_sec) * 1000000000 + end.tv_nsec - start.tv_nsec) / TESTTIMES); msleep(100); } } module_init(test_init) module_exit(test_exit) MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Eillon"); MODULE_DESCRIPTION("do TTL test"); MODULE_VERSION("1.0");