1 #define pr_fmt(fmt) "list_sort_test: " fmt
3 #include <linux/kernel.h>
4 #include <linux/list_sort.h>
5 #include <linux/list.h>
6 #include <linux/module.h>
7 #include <linux/printk.h>
8 #include <linux/slab.h>
9 #include <linux/random.h>
12 * The pattern of set bits in the list length determines which cases
13 * are hit in list_sort().
15 #define TEST_LIST_LEN (512+128+2) /* not including head */
17 #define TEST_POISON1 0xDEADBEEF
18 #define TEST_POISON2 0xA324354C
22 struct list_head list
;
28 /* Array, containing pointers to all elements in the test list */
29 static struct debug_el
**elts __initdata
;
31 static int __init
check(struct debug_el
*ela
, struct debug_el
*elb
)
33 if (ela
->serial
>= TEST_LIST_LEN
) {
34 pr_err("error: incorrect serial %d\n", ela
->serial
);
37 if (elb
->serial
>= TEST_LIST_LEN
) {
38 pr_err("error: incorrect serial %d\n", elb
->serial
);
41 if (elts
[ela
->serial
] != ela
|| elts
[elb
->serial
] != elb
) {
42 pr_err("error: phantom element\n");
45 if (ela
->poison1
!= TEST_POISON1
|| ela
->poison2
!= TEST_POISON2
) {
46 pr_err("error: bad poison: %#x/%#x\n",
47 ela
->poison1
, ela
->poison2
);
50 if (elb
->poison1
!= TEST_POISON1
|| elb
->poison2
!= TEST_POISON2
) {
51 pr_err("error: bad poison: %#x/%#x\n",
52 elb
->poison1
, elb
->poison2
);
58 static int __init
cmp(void *priv
, struct list_head
*a
, struct list_head
*b
)
60 struct debug_el
*ela
, *elb
;
62 ela
= container_of(a
, struct debug_el
, list
);
63 elb
= container_of(b
, struct debug_el
, list
);
66 return ela
->value
- elb
->value
;
69 static int __init
list_sort_test(void)
71 int i
, count
= 1, err
= -ENOMEM
;
73 struct list_head
*cur
;
76 pr_debug("start testing list_sort()\n");
78 elts
= kcalloc(TEST_LIST_LEN
, sizeof(*elts
), GFP_KERNEL
);
82 for (i
= 0; i
< TEST_LIST_LEN
; i
++) {
83 el
= kmalloc(sizeof(*el
), GFP_KERNEL
);
87 /* force some equivalencies */
88 el
->value
= prandom_u32() % (TEST_LIST_LEN
/ 3);
90 el
->poison1
= TEST_POISON1
;
91 el
->poison2
= TEST_POISON2
;
93 list_add_tail(&el
->list
, &head
);
96 list_sort(NULL
, &head
, cmp
);
99 for (cur
= head
.next
; cur
->next
!= &head
; cur
= cur
->next
) {
100 struct debug_el
*el1
;
103 if (cur
->next
->prev
!= cur
) {
104 pr_err("error: list is corrupted\n");
108 cmp_result
= cmp(NULL
, cur
, cur
->next
);
109 if (cmp_result
> 0) {
110 pr_err("error: list is not sorted\n");
114 el
= container_of(cur
, struct debug_el
, list
);
115 el1
= container_of(cur
->next
, struct debug_el
, list
);
116 if (cmp_result
== 0 && el
->serial
>= el1
->serial
) {
117 pr_err("error: order of equivalent elements not "
122 if (check(el
, el1
)) {
123 pr_err("error: element check failed\n");
128 if (head
.prev
!= cur
) {
129 pr_err("error: list is corrupted\n");
134 if (count
!= TEST_LIST_LEN
) {
135 pr_err("error: bad list length %d", count
);
141 for (i
= 0; i
< TEST_LIST_LEN
; i
++)
146 module_init(list_sort_test
);
147 MODULE_LICENSE("GPL");