dm-crypt: use __bio_add_page to add single page to clone bio
[linux-block.git] / lib / test_vmalloc.c
index de4ee0d50906215e9469b29229594251a9995dcf..9dd9745d365f7b9b70d45957c25cd61e5f17bad2 100644 (file)
@@ -53,6 +53,7 @@ __param(int, run_test_mask, INT_MAX,
                "\t\tid: 128,  name: pcpu_alloc_test\n"
                "\t\tid: 256,  name: kvfree_rcu_1_arg_vmalloc_test\n"
                "\t\tid: 512,  name: kvfree_rcu_2_arg_vmalloc_test\n"
+               "\t\tid: 1024, name: vm_map_ram_test\n"
                /* Add a new test case description here. */
 );
 
@@ -334,7 +335,7 @@ kvfree_rcu_1_arg_vmalloc_test(void)
                        return -1;
 
                p->array[0] = 'a';
-               kvfree_rcu(p);
+               kvfree_rcu_mightsleep(p);
        }
 
        return 0;
@@ -358,6 +359,41 @@ kvfree_rcu_2_arg_vmalloc_test(void)
        return 0;
 }
 
+static int
+vm_map_ram_test(void)
+{
+       unsigned long nr_allocated;
+       unsigned int map_nr_pages;
+       unsigned char *v_ptr;
+       struct page **pages;
+       int i;
+
+       map_nr_pages = nr_pages > 0 ? nr_pages:1;
+       pages = kmalloc(map_nr_pages * sizeof(struct page), GFP_KERNEL);
+       if (!pages)
+               return -1;
+
+       nr_allocated = alloc_pages_bulk_array(GFP_KERNEL, map_nr_pages, pages);
+       if (nr_allocated != map_nr_pages)
+               goto cleanup;
+
+       /* Run the test loop. */
+       for (i = 0; i < test_loop_count; i++) {
+               v_ptr = vm_map_ram(pages, map_nr_pages, NUMA_NO_NODE);
+               *v_ptr = 'a';
+               vm_unmap_ram(v_ptr, map_nr_pages);
+       }
+
+cleanup:
+       for (i = 0; i < nr_allocated; i++)
+               __free_page(pages[i]);
+
+       kfree(pages);
+
+       /* 0 indicates success. */
+       return nr_allocated != map_nr_pages;
+}
+
 struct test_case_desc {
        const char *test_name;
        int (*test_func)(void);
@@ -374,6 +410,7 @@ static struct test_case_desc test_case_array[] = {
        { "pcpu_alloc_test", pcpu_alloc_test },
        { "kvfree_rcu_1_arg_vmalloc_test", kvfree_rcu_1_arg_vmalloc_test },
        { "kvfree_rcu_2_arg_vmalloc_test", kvfree_rcu_2_arg_vmalloc_test },
+       { "vm_map_ram_test", vm_map_ram_test },
        /* Add a new test case here. */
 };