teknoraver icon

test_string

teknoraver | PRO | 06/16/21 12:54:51 AM UTC (Edited) | 0 ⭐ | 861 👁️ | Never ⏰ | []
C |

1.43 KB

|

None

|

0 👍

/

0 👎

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;
}
 

Comments