Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 217575
b: refs/heads/master
c: f3dc0e3
h: refs/heads/master
i:
  217573: b1b752b
  217571: 0418499
  217567: 14de0c0
v: v3
  • Loading branch information
Artem Bityutskiy authored and Linus Torvalds committed Oct 26, 2010
1 parent f33aa52 commit 62a28dd
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 28 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: eeee9ebb54b76a33a13d2c926ffb018a4aea410f
refs/heads/master: f3dc0e384248ea6fda0987f909007fa9ab5fb51a
65 changes: 38 additions & 27 deletions trunk/lib/list_sort.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,56 +165,67 @@ static int cmp(void *priv, struct list_head *a, struct list_head *b)

static int __init list_sort_test(void)
{
int i, count;
struct list_head *head = kmalloc(sizeof(*head), GFP_KERNEL);
struct list_head *cur;
int i, count = 1, err = -EINVAL;
struct debug_el *el;
struct list_head *cur, *tmp;
LIST_HEAD(head);

printk(KERN_DEBUG "testing list_sort()\n");

cur = head;
for (i = 0; i < TEST_LIST_LEN; i++) {
struct debug_el *el = kmalloc(sizeof(*el), GFP_KERNEL);
BUG_ON(!el);
el = kmalloc(sizeof(*el), GFP_KERNEL);
if (!el) {
printk(KERN_ERR "cancel list_sort() testing - cannot "
"allocate memory\n");
goto exit;
}
/* force some equivalencies */
el->value = random32() % (TEST_LIST_LEN/3);
el->serial = i;

el->list.prev = cur;
cur->next = &el->list;
cur = cur->next;
list_add_tail(&el->list, &head);
}
head->prev = cur;

list_sort(NULL, head, cmp);
list_sort(NULL, &head, cmp);

for (cur = head.next; cur->next != &head; cur = cur->next) {
struct debug_el *el1;
int cmp_result;

count = 1;
for (cur = head->next; cur->next != head; cur = cur->next) {
struct debug_el *el = container_of(cur, struct debug_el, list);
int cmp_result = cmp(NULL, cur, cur->next);
if (cur->next->prev != cur) {
printk(KERN_ERR "list_sort() returned "
"a corrupted list!\n");
return 1;
} else if (cmp_result > 0) {
goto exit;
}

cmp_result = cmp(NULL, cur, cur->next);
if (cmp_result > 0) {
printk(KERN_ERR "list_sort() failed to sort!\n");
return 1;
} else if (cmp_result == 0 &&
el->serial >= container_of(cur->next,
struct debug_el, list)->serial) {
goto exit;
}

el = container_of(cur, struct debug_el, list);
el1 = container_of(cur->next, struct debug_el, list);
if (cmp_result == 0 && el->serial >= el1->serial) {
printk(KERN_ERR "list_sort() failed to preserve order "
"of equivalent elements!\n");
return 1;
goto exit;
}
kfree(cur->prev);
count++;
}
kfree(cur);

if (count != TEST_LIST_LEN) {
printk(KERN_ERR "list_sort() returned list of "
"different length!\n");
return 1;
goto exit;
}

err = 0;
exit:
list_for_each_safe(cur, tmp, &head) {
list_del(cur);
kfree(container_of(cur, struct debug_el, list));
}
return 0;
return err;
}
module_init(list_sort_test);
#endif /* CONFIG_TEST_LIST_SORT */

0 comments on commit 62a28dd

Please sign in to comment.