static __init int memcpy_align_selftest(void) { struct page *page1, *page2; char *dst, *src; int err = 0; int i, j; ktime_t j0, j1; printk("Strings selftest: testing with size: %d\n", PG_SIZE); page1 = alloc_pages(GFP_KERNEL, MAX_ORDER-1); if (!page1) return 1; page2 = alloc_pages(GFP_KERNEL, MAX_ORDER-1); if (!page2) { err = 1; goto free1; } src = page_to_virt(page1); dst = page_to_virt(page1); preempt_disable(); for (i = 0; i < sizeof(void*); i++) { for (j = 0; j < sizeof(void*); j++) { t0 = ktime_get(); memcpy(dst + j, src + i, PG_SIZE - max(i, j)); t1 = ktime_get(); printk("Strings selftest: memcpy(src+%d, dst+%d): %llu Mb/s\n", i, j, PG_SIZE * (1000000000l / 1048576l) / (t1-t0)); } } preempt_enable(); put_page(page2); free1: put_page(page1); return err; } static __init int memset_align_selftest(void) { struct page *page; ktime_t t0, t1; char *dst; int i; printk("Strings selftest: testing with size: %d\n", PG_SIZE); page = alloc_pages(GFP_KERNEL, MAX_ORDER-1); if (!page) return 1; dst = page_to_virt(page); preempt_disable(); for (i = 0; i < sizeof(void*); i++) { t0 = ktime_get(); memset(dst + i, 0, PG_SIZE - i); t1 = ktime_get(); printk("Strings selftest: memset(dst+%d): %llu Mb/s\n", i, PG_SIZE * (1000000000l / 1048576l) / (t1-t0)); } preempt_enable(); put_page(page); return 0; }