list-test.c (28664B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * KUnit test for the Kernel Linked-list structures. 4 * 5 * Copyright (C) 2019, Google LLC. 6 * Author: David Gow <davidgow@google.com> 7 */ 8#include <kunit/test.h> 9 10#include <linux/list.h> 11 12struct list_test_struct { 13 int data; 14 struct list_head list; 15}; 16 17static void list_test_list_init(struct kunit *test) 18{ 19 /* Test the different ways of initialising a list. */ 20 struct list_head list1 = LIST_HEAD_INIT(list1); 21 struct list_head list2; 22 LIST_HEAD(list3); 23 struct list_head *list4; 24 struct list_head *list5; 25 26 INIT_LIST_HEAD(&list2); 27 28 list4 = kzalloc(sizeof(*list4), GFP_KERNEL | __GFP_NOFAIL); 29 INIT_LIST_HEAD(list4); 30 31 list5 = kmalloc(sizeof(*list5), GFP_KERNEL | __GFP_NOFAIL); 32 memset(list5, 0xFF, sizeof(*list5)); 33 INIT_LIST_HEAD(list5); 34 35 /* list_empty_careful() checks both next and prev. */ 36 KUNIT_EXPECT_TRUE(test, list_empty_careful(&list1)); 37 KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 38 KUNIT_EXPECT_TRUE(test, list_empty_careful(&list3)); 39 KUNIT_EXPECT_TRUE(test, list_empty_careful(list4)); 40 KUNIT_EXPECT_TRUE(test, list_empty_careful(list5)); 41 42 kfree(list4); 43 kfree(list5); 44} 45 46static void list_test_list_add(struct kunit *test) 47{ 48 struct list_head a, b; 49 LIST_HEAD(list); 50 51 list_add(&a, &list); 52 list_add(&b, &list); 53 54 /* should be [list] -> b -> a */ 55 KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 56 KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 57 KUNIT_EXPECT_PTR_EQ(test, b.next, &a); 58} 59 60static void list_test_list_add_tail(struct kunit *test) 61{ 62 struct list_head a, b; 63 LIST_HEAD(list); 64 65 list_add_tail(&a, &list); 66 list_add_tail(&b, &list); 67 68 /* should be [list] -> a -> b */ 69 KUNIT_EXPECT_PTR_EQ(test, list.next, &a); 70 KUNIT_EXPECT_PTR_EQ(test, a.prev, &list); 71 KUNIT_EXPECT_PTR_EQ(test, a.next, &b); 72} 73 74static void list_test_list_del(struct kunit *test) 75{ 76 struct list_head a, b; 77 LIST_HEAD(list); 78 79 list_add_tail(&a, &list); 80 list_add_tail(&b, &list); 81 82 /* before: [list] -> a -> b */ 83 list_del(&a); 84 85 /* now: [list] -> b */ 86 KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 87 KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 88} 89 90static void list_test_list_replace(struct kunit *test) 91{ 92 struct list_head a_old, a_new, b; 93 LIST_HEAD(list); 94 95 list_add_tail(&a_old, &list); 96 list_add_tail(&b, &list); 97 98 /* before: [list] -> a_old -> b */ 99 list_replace(&a_old, &a_new); 100 101 /* now: [list] -> a_new -> b */ 102 KUNIT_EXPECT_PTR_EQ(test, list.next, &a_new); 103 KUNIT_EXPECT_PTR_EQ(test, b.prev, &a_new); 104} 105 106static void list_test_list_replace_init(struct kunit *test) 107{ 108 struct list_head a_old, a_new, b; 109 LIST_HEAD(list); 110 111 list_add_tail(&a_old, &list); 112 list_add_tail(&b, &list); 113 114 /* before: [list] -> a_old -> b */ 115 list_replace_init(&a_old, &a_new); 116 117 /* now: [list] -> a_new -> b */ 118 KUNIT_EXPECT_PTR_EQ(test, list.next, &a_new); 119 KUNIT_EXPECT_PTR_EQ(test, b.prev, &a_new); 120 121 /* check a_old is empty (initialized) */ 122 KUNIT_EXPECT_TRUE(test, list_empty_careful(&a_old)); 123} 124 125static void list_test_list_swap(struct kunit *test) 126{ 127 struct list_head a, b; 128 LIST_HEAD(list); 129 130 list_add_tail(&a, &list); 131 list_add_tail(&b, &list); 132 133 /* before: [list] -> a -> b */ 134 list_swap(&a, &b); 135 136 /* after: [list] -> b -> a */ 137 KUNIT_EXPECT_PTR_EQ(test, &b, list.next); 138 KUNIT_EXPECT_PTR_EQ(test, &a, list.prev); 139 140 KUNIT_EXPECT_PTR_EQ(test, &a, b.next); 141 KUNIT_EXPECT_PTR_EQ(test, &list, b.prev); 142 143 KUNIT_EXPECT_PTR_EQ(test, &list, a.next); 144 KUNIT_EXPECT_PTR_EQ(test, &b, a.prev); 145} 146 147static void list_test_list_del_init(struct kunit *test) 148{ 149 struct list_head a, b; 150 LIST_HEAD(list); 151 152 list_add_tail(&a, &list); 153 list_add_tail(&b, &list); 154 155 /* before: [list] -> a -> b */ 156 list_del_init(&a); 157 /* after: [list] -> b, a initialised */ 158 159 KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 160 KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 161 KUNIT_EXPECT_TRUE(test, list_empty_careful(&a)); 162} 163 164static void list_test_list_del_init_careful(struct kunit *test) 165{ 166 /* NOTE: This test only checks the behaviour of this function in 167 * isolation. It does not verify memory model guarantees. 168 */ 169 struct list_head a, b; 170 LIST_HEAD(list); 171 172 list_add_tail(&a, &list); 173 list_add_tail(&b, &list); 174 175 /* before: [list] -> a -> b */ 176 list_del_init_careful(&a); 177 /* after: [list] -> b, a initialised */ 178 179 KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 180 KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 181 KUNIT_EXPECT_TRUE(test, list_empty_careful(&a)); 182} 183 184static void list_test_list_move(struct kunit *test) 185{ 186 struct list_head a, b; 187 LIST_HEAD(list1); 188 LIST_HEAD(list2); 189 190 list_add_tail(&a, &list1); 191 list_add_tail(&b, &list2); 192 193 /* before: [list1] -> a, [list2] -> b */ 194 list_move(&a, &list2); 195 /* after: [list1] empty, [list2] -> a -> b */ 196 197 KUNIT_EXPECT_TRUE(test, list_empty(&list1)); 198 199 KUNIT_EXPECT_PTR_EQ(test, &a, list2.next); 200 KUNIT_EXPECT_PTR_EQ(test, &b, a.next); 201} 202 203static void list_test_list_move_tail(struct kunit *test) 204{ 205 struct list_head a, b; 206 LIST_HEAD(list1); 207 LIST_HEAD(list2); 208 209 list_add_tail(&a, &list1); 210 list_add_tail(&b, &list2); 211 212 /* before: [list1] -> a, [list2] -> b */ 213 list_move_tail(&a, &list2); 214 /* after: [list1] empty, [list2] -> b -> a */ 215 216 KUNIT_EXPECT_TRUE(test, list_empty(&list1)); 217 218 KUNIT_EXPECT_PTR_EQ(test, &b, list2.next); 219 KUNIT_EXPECT_PTR_EQ(test, &a, b.next); 220} 221 222static void list_test_list_bulk_move_tail(struct kunit *test) 223{ 224 struct list_head a, b, c, d, x, y; 225 struct list_head *list1_values[] = { &x, &b, &c, &y }; 226 struct list_head *list2_values[] = { &a, &d }; 227 struct list_head *ptr; 228 LIST_HEAD(list1); 229 LIST_HEAD(list2); 230 int i = 0; 231 232 list_add_tail(&x, &list1); 233 list_add_tail(&y, &list1); 234 235 list_add_tail(&a, &list2); 236 list_add_tail(&b, &list2); 237 list_add_tail(&c, &list2); 238 list_add_tail(&d, &list2); 239 240 /* before: [list1] -> x -> y, [list2] -> a -> b -> c -> d */ 241 list_bulk_move_tail(&y, &b, &c); 242 /* after: [list1] -> x -> b -> c -> y, [list2] -> a -> d */ 243 244 list_for_each(ptr, &list1) { 245 KUNIT_EXPECT_PTR_EQ(test, ptr, list1_values[i]); 246 i++; 247 } 248 KUNIT_EXPECT_EQ(test, i, 4); 249 i = 0; 250 list_for_each(ptr, &list2) { 251 KUNIT_EXPECT_PTR_EQ(test, ptr, list2_values[i]); 252 i++; 253 } 254 KUNIT_EXPECT_EQ(test, i, 2); 255} 256 257static void list_test_list_is_head(struct kunit *test) 258{ 259 struct list_head a, b, c; 260 261 /* Two lists: [a] -> b, [c] */ 262 INIT_LIST_HEAD(&a); 263 INIT_LIST_HEAD(&c); 264 list_add_tail(&b, &a); 265 266 KUNIT_EXPECT_TRUE_MSG(test, list_is_head(&a, &a), 267 "Head element of same list"); 268 KUNIT_EXPECT_FALSE_MSG(test, list_is_head(&a, &b), 269 "Non-head element of same list"); 270 KUNIT_EXPECT_FALSE_MSG(test, list_is_head(&a, &c), 271 "Head element of different list"); 272} 273 274 275static void list_test_list_is_first(struct kunit *test) 276{ 277 struct list_head a, b; 278 LIST_HEAD(list); 279 280 list_add_tail(&a, &list); 281 list_add_tail(&b, &list); 282 283 KUNIT_EXPECT_TRUE(test, list_is_first(&a, &list)); 284 KUNIT_EXPECT_FALSE(test, list_is_first(&b, &list)); 285} 286 287static void list_test_list_is_last(struct kunit *test) 288{ 289 struct list_head a, b; 290 LIST_HEAD(list); 291 292 list_add_tail(&a, &list); 293 list_add_tail(&b, &list); 294 295 KUNIT_EXPECT_FALSE(test, list_is_last(&a, &list)); 296 KUNIT_EXPECT_TRUE(test, list_is_last(&b, &list)); 297} 298 299static void list_test_list_empty(struct kunit *test) 300{ 301 struct list_head a; 302 LIST_HEAD(list1); 303 LIST_HEAD(list2); 304 305 list_add_tail(&a, &list1); 306 307 KUNIT_EXPECT_FALSE(test, list_empty(&list1)); 308 KUNIT_EXPECT_TRUE(test, list_empty(&list2)); 309} 310 311static void list_test_list_empty_careful(struct kunit *test) 312{ 313 /* This test doesn't check correctness under concurrent access */ 314 struct list_head a; 315 LIST_HEAD(list1); 316 LIST_HEAD(list2); 317 318 list_add_tail(&a, &list1); 319 320 KUNIT_EXPECT_FALSE(test, list_empty_careful(&list1)); 321 KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 322} 323 324static void list_test_list_rotate_left(struct kunit *test) 325{ 326 struct list_head a, b; 327 LIST_HEAD(list); 328 329 list_add_tail(&a, &list); 330 list_add_tail(&b, &list); 331 332 /* before: [list] -> a -> b */ 333 list_rotate_left(&list); 334 /* after: [list] -> b -> a */ 335 336 KUNIT_EXPECT_PTR_EQ(test, list.next, &b); 337 KUNIT_EXPECT_PTR_EQ(test, b.prev, &list); 338 KUNIT_EXPECT_PTR_EQ(test, b.next, &a); 339} 340 341static void list_test_list_rotate_to_front(struct kunit *test) 342{ 343 struct list_head a, b, c, d; 344 struct list_head *list_values[] = { &c, &d, &a, &b }; 345 struct list_head *ptr; 346 LIST_HEAD(list); 347 int i = 0; 348 349 list_add_tail(&a, &list); 350 list_add_tail(&b, &list); 351 list_add_tail(&c, &list); 352 list_add_tail(&d, &list); 353 354 /* before: [list] -> a -> b -> c -> d */ 355 list_rotate_to_front(&c, &list); 356 /* after: [list] -> c -> d -> a -> b */ 357 358 list_for_each(ptr, &list) { 359 KUNIT_EXPECT_PTR_EQ(test, ptr, list_values[i]); 360 i++; 361 } 362 KUNIT_EXPECT_EQ(test, i, 4); 363} 364 365static void list_test_list_is_singular(struct kunit *test) 366{ 367 struct list_head a, b; 368 LIST_HEAD(list); 369 370 /* [list] empty */ 371 KUNIT_EXPECT_FALSE(test, list_is_singular(&list)); 372 373 list_add_tail(&a, &list); 374 375 /* [list] -> a */ 376 KUNIT_EXPECT_TRUE(test, list_is_singular(&list)); 377 378 list_add_tail(&b, &list); 379 380 /* [list] -> a -> b */ 381 KUNIT_EXPECT_FALSE(test, list_is_singular(&list)); 382} 383 384static void list_test_list_cut_position(struct kunit *test) 385{ 386 struct list_head entries[3], *cur; 387 LIST_HEAD(list1); 388 LIST_HEAD(list2); 389 int i = 0; 390 391 list_add_tail(&entries[0], &list1); 392 list_add_tail(&entries[1], &list1); 393 list_add_tail(&entries[2], &list1); 394 395 /* before: [list1] -> entries[0] -> entries[1] -> entries[2] */ 396 list_cut_position(&list2, &list1, &entries[1]); 397 /* after: [list2] -> entries[0] -> entries[1], [list1] -> entries[2] */ 398 399 list_for_each(cur, &list2) { 400 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 401 i++; 402 } 403 404 KUNIT_EXPECT_EQ(test, i, 2); 405 406 list_for_each(cur, &list1) { 407 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 408 i++; 409 } 410} 411 412static void list_test_list_cut_before(struct kunit *test) 413{ 414 struct list_head entries[3], *cur; 415 LIST_HEAD(list1); 416 LIST_HEAD(list2); 417 int i = 0; 418 419 list_add_tail(&entries[0], &list1); 420 list_add_tail(&entries[1], &list1); 421 list_add_tail(&entries[2], &list1); 422 423 /* before: [list1] -> entries[0] -> entries[1] -> entries[2] */ 424 list_cut_before(&list2, &list1, &entries[1]); 425 /* after: [list2] -> entries[0], [list1] -> entries[1] -> entries[2] */ 426 427 list_for_each(cur, &list2) { 428 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 429 i++; 430 } 431 432 KUNIT_EXPECT_EQ(test, i, 1); 433 434 list_for_each(cur, &list1) { 435 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 436 i++; 437 } 438} 439 440static void list_test_list_splice(struct kunit *test) 441{ 442 struct list_head entries[5], *cur; 443 LIST_HEAD(list1); 444 LIST_HEAD(list2); 445 int i = 0; 446 447 list_add_tail(&entries[0], &list1); 448 list_add_tail(&entries[1], &list1); 449 list_add_tail(&entries[2], &list2); 450 list_add_tail(&entries[3], &list2); 451 list_add_tail(&entries[4], &list1); 452 453 /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 454 list_splice(&list2, &entries[1]); 455 /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] uninit */ 456 457 list_for_each(cur, &list1) { 458 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 459 i++; 460 } 461 462 KUNIT_EXPECT_EQ(test, i, 5); 463} 464 465static void list_test_list_splice_tail(struct kunit *test) 466{ 467 struct list_head entries[5], *cur; 468 LIST_HEAD(list1); 469 LIST_HEAD(list2); 470 int i = 0; 471 472 list_add_tail(&entries[0], &list1); 473 list_add_tail(&entries[1], &list1); 474 list_add_tail(&entries[2], &list2); 475 list_add_tail(&entries[3], &list2); 476 list_add_tail(&entries[4], &list1); 477 478 /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 479 list_splice_tail(&list2, &entries[4]); 480 /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] uninit */ 481 482 list_for_each(cur, &list1) { 483 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 484 i++; 485 } 486 487 KUNIT_EXPECT_EQ(test, i, 5); 488} 489 490static void list_test_list_splice_init(struct kunit *test) 491{ 492 struct list_head entries[5], *cur; 493 LIST_HEAD(list1); 494 LIST_HEAD(list2); 495 int i = 0; 496 497 list_add_tail(&entries[0], &list1); 498 list_add_tail(&entries[1], &list1); 499 list_add_tail(&entries[2], &list2); 500 list_add_tail(&entries[3], &list2); 501 list_add_tail(&entries[4], &list1); 502 503 /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 504 list_splice_init(&list2, &entries[1]); 505 /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] empty */ 506 507 list_for_each(cur, &list1) { 508 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 509 i++; 510 } 511 512 KUNIT_EXPECT_EQ(test, i, 5); 513 514 KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 515} 516 517static void list_test_list_splice_tail_init(struct kunit *test) 518{ 519 struct list_head entries[5], *cur; 520 LIST_HEAD(list1); 521 LIST_HEAD(list2); 522 int i = 0; 523 524 list_add_tail(&entries[0], &list1); 525 list_add_tail(&entries[1], &list1); 526 list_add_tail(&entries[2], &list2); 527 list_add_tail(&entries[3], &list2); 528 list_add_tail(&entries[4], &list1); 529 530 /* before: [list1]->e[0]->e[1]->e[4], [list2]->e[2]->e[3] */ 531 list_splice_tail_init(&list2, &entries[4]); 532 /* after: [list1]->e[0]->e[1]->e[2]->e[3]->e[4], [list2] empty */ 533 534 list_for_each(cur, &list1) { 535 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 536 i++; 537 } 538 539 KUNIT_EXPECT_EQ(test, i, 5); 540 541 KUNIT_EXPECT_TRUE(test, list_empty_careful(&list2)); 542} 543 544static void list_test_list_entry(struct kunit *test) 545{ 546 struct list_test_struct test_struct; 547 548 KUNIT_EXPECT_PTR_EQ(test, &test_struct, list_entry(&(test_struct.list), 549 struct list_test_struct, list)); 550} 551 552static void list_test_list_entry_is_head(struct kunit *test) 553{ 554 struct list_test_struct test_struct1, test_struct2, test_struct3; 555 556 INIT_LIST_HEAD(&test_struct1.list); 557 INIT_LIST_HEAD(&test_struct3.list); 558 559 list_add_tail(&test_struct2.list, &test_struct1.list); 560 561 KUNIT_EXPECT_TRUE_MSG(test, 562 list_entry_is_head((&test_struct1), &test_struct1.list, list), 563 "Head element of same list"); 564 KUNIT_EXPECT_FALSE_MSG(test, 565 list_entry_is_head((&test_struct2), &test_struct1.list, list), 566 "Non-head element of same list"); 567 KUNIT_EXPECT_FALSE_MSG(test, 568 list_entry_is_head((&test_struct3), &test_struct1.list, list), 569 "Head element of different list"); 570} 571 572static void list_test_list_first_entry(struct kunit *test) 573{ 574 struct list_test_struct test_struct1, test_struct2; 575 LIST_HEAD(list); 576 577 list_add_tail(&test_struct1.list, &list); 578 list_add_tail(&test_struct2.list, &list); 579 580 581 KUNIT_EXPECT_PTR_EQ(test, &test_struct1, list_first_entry(&list, 582 struct list_test_struct, list)); 583} 584 585static void list_test_list_last_entry(struct kunit *test) 586{ 587 struct list_test_struct test_struct1, test_struct2; 588 LIST_HEAD(list); 589 590 list_add_tail(&test_struct1.list, &list); 591 list_add_tail(&test_struct2.list, &list); 592 593 594 KUNIT_EXPECT_PTR_EQ(test, &test_struct2, list_last_entry(&list, 595 struct list_test_struct, list)); 596} 597 598static void list_test_list_first_entry_or_null(struct kunit *test) 599{ 600 struct list_test_struct test_struct1, test_struct2; 601 LIST_HEAD(list); 602 603 KUNIT_EXPECT_FALSE(test, list_first_entry_or_null(&list, 604 struct list_test_struct, list)); 605 606 list_add_tail(&test_struct1.list, &list); 607 list_add_tail(&test_struct2.list, &list); 608 609 KUNIT_EXPECT_PTR_EQ(test, &test_struct1, 610 list_first_entry_or_null(&list, 611 struct list_test_struct, list)); 612} 613 614static void list_test_list_next_entry(struct kunit *test) 615{ 616 struct list_test_struct test_struct1, test_struct2; 617 LIST_HEAD(list); 618 619 list_add_tail(&test_struct1.list, &list); 620 list_add_tail(&test_struct2.list, &list); 621 622 623 KUNIT_EXPECT_PTR_EQ(test, &test_struct2, list_next_entry(&test_struct1, 624 list)); 625} 626 627static void list_test_list_prev_entry(struct kunit *test) 628{ 629 struct list_test_struct test_struct1, test_struct2; 630 LIST_HEAD(list); 631 632 list_add_tail(&test_struct1.list, &list); 633 list_add_tail(&test_struct2.list, &list); 634 635 636 KUNIT_EXPECT_PTR_EQ(test, &test_struct1, list_prev_entry(&test_struct2, 637 list)); 638} 639 640static void list_test_list_for_each(struct kunit *test) 641{ 642 struct list_head entries[3], *cur; 643 LIST_HEAD(list); 644 int i = 0; 645 646 list_add_tail(&entries[0], &list); 647 list_add_tail(&entries[1], &list); 648 list_add_tail(&entries[2], &list); 649 650 list_for_each(cur, &list) { 651 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 652 i++; 653 } 654 655 KUNIT_EXPECT_EQ(test, i, 3); 656} 657 658static void list_test_list_for_each_prev(struct kunit *test) 659{ 660 struct list_head entries[3], *cur; 661 LIST_HEAD(list); 662 int i = 2; 663 664 list_add_tail(&entries[0], &list); 665 list_add_tail(&entries[1], &list); 666 list_add_tail(&entries[2], &list); 667 668 list_for_each_prev(cur, &list) { 669 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 670 i--; 671 } 672 673 KUNIT_EXPECT_EQ(test, i, -1); 674} 675 676static void list_test_list_for_each_safe(struct kunit *test) 677{ 678 struct list_head entries[3], *cur, *n; 679 LIST_HEAD(list); 680 int i = 0; 681 682 683 list_add_tail(&entries[0], &list); 684 list_add_tail(&entries[1], &list); 685 list_add_tail(&entries[2], &list); 686 687 list_for_each_safe(cur, n, &list) { 688 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 689 list_del(&entries[i]); 690 i++; 691 } 692 693 KUNIT_EXPECT_EQ(test, i, 3); 694 KUNIT_EXPECT_TRUE(test, list_empty(&list)); 695} 696 697static void list_test_list_for_each_prev_safe(struct kunit *test) 698{ 699 struct list_head entries[3], *cur, *n; 700 LIST_HEAD(list); 701 int i = 2; 702 703 list_add_tail(&entries[0], &list); 704 list_add_tail(&entries[1], &list); 705 list_add_tail(&entries[2], &list); 706 707 list_for_each_prev_safe(cur, n, &list) { 708 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 709 list_del(&entries[i]); 710 i--; 711 } 712 713 KUNIT_EXPECT_EQ(test, i, -1); 714 KUNIT_EXPECT_TRUE(test, list_empty(&list)); 715} 716 717static void list_test_list_for_each_entry(struct kunit *test) 718{ 719 struct list_test_struct entries[5], *cur; 720 LIST_HEAD(list); 721 int i = 0; 722 723 for (i = 0; i < 5; ++i) { 724 entries[i].data = i; 725 list_add_tail(&entries[i].list, &list); 726 } 727 728 i = 0; 729 730 list_for_each_entry(cur, &list, list) { 731 KUNIT_EXPECT_EQ(test, cur->data, i); 732 i++; 733 } 734 735 KUNIT_EXPECT_EQ(test, i, 5); 736} 737 738static void list_test_list_for_each_entry_reverse(struct kunit *test) 739{ 740 struct list_test_struct entries[5], *cur; 741 LIST_HEAD(list); 742 int i = 0; 743 744 for (i = 0; i < 5; ++i) { 745 entries[i].data = i; 746 list_add_tail(&entries[i].list, &list); 747 } 748 749 i = 4; 750 751 list_for_each_entry_reverse(cur, &list, list) { 752 KUNIT_EXPECT_EQ(test, cur->data, i); 753 i--; 754 } 755 756 KUNIT_EXPECT_EQ(test, i, -1); 757} 758 759static struct kunit_case list_test_cases[] = { 760 KUNIT_CASE(list_test_list_init), 761 KUNIT_CASE(list_test_list_add), 762 KUNIT_CASE(list_test_list_add_tail), 763 KUNIT_CASE(list_test_list_del), 764 KUNIT_CASE(list_test_list_replace), 765 KUNIT_CASE(list_test_list_replace_init), 766 KUNIT_CASE(list_test_list_swap), 767 KUNIT_CASE(list_test_list_del_init), 768 KUNIT_CASE(list_test_list_del_init_careful), 769 KUNIT_CASE(list_test_list_move), 770 KUNIT_CASE(list_test_list_move_tail), 771 KUNIT_CASE(list_test_list_bulk_move_tail), 772 KUNIT_CASE(list_test_list_is_head), 773 KUNIT_CASE(list_test_list_is_first), 774 KUNIT_CASE(list_test_list_is_last), 775 KUNIT_CASE(list_test_list_empty), 776 KUNIT_CASE(list_test_list_empty_careful), 777 KUNIT_CASE(list_test_list_rotate_left), 778 KUNIT_CASE(list_test_list_rotate_to_front), 779 KUNIT_CASE(list_test_list_is_singular), 780 KUNIT_CASE(list_test_list_cut_position), 781 KUNIT_CASE(list_test_list_cut_before), 782 KUNIT_CASE(list_test_list_splice), 783 KUNIT_CASE(list_test_list_splice_tail), 784 KUNIT_CASE(list_test_list_splice_init), 785 KUNIT_CASE(list_test_list_splice_tail_init), 786 KUNIT_CASE(list_test_list_entry), 787 KUNIT_CASE(list_test_list_entry_is_head), 788 KUNIT_CASE(list_test_list_first_entry), 789 KUNIT_CASE(list_test_list_last_entry), 790 KUNIT_CASE(list_test_list_first_entry_or_null), 791 KUNIT_CASE(list_test_list_next_entry), 792 KUNIT_CASE(list_test_list_prev_entry), 793 KUNIT_CASE(list_test_list_for_each), 794 KUNIT_CASE(list_test_list_for_each_prev), 795 KUNIT_CASE(list_test_list_for_each_safe), 796 KUNIT_CASE(list_test_list_for_each_prev_safe), 797 KUNIT_CASE(list_test_list_for_each_entry), 798 KUNIT_CASE(list_test_list_for_each_entry_reverse), 799 {}, 800}; 801 802static struct kunit_suite list_test_module = { 803 .name = "list-kunit-test", 804 .test_cases = list_test_cases, 805}; 806 807struct hlist_test_struct { 808 int data; 809 struct hlist_node list; 810}; 811 812static void hlist_test_init(struct kunit *test) 813{ 814 /* Test the different ways of initialising a list. */ 815 struct hlist_head list1 = HLIST_HEAD_INIT; 816 struct hlist_head list2; 817 HLIST_HEAD(list3); 818 struct hlist_head *list4; 819 struct hlist_head *list5; 820 821 INIT_HLIST_HEAD(&list2); 822 823 list4 = kzalloc(sizeof(*list4), GFP_KERNEL | __GFP_NOFAIL); 824 INIT_HLIST_HEAD(list4); 825 826 list5 = kmalloc(sizeof(*list5), GFP_KERNEL | __GFP_NOFAIL); 827 memset(list5, 0xFF, sizeof(*list5)); 828 INIT_HLIST_HEAD(list5); 829 830 KUNIT_EXPECT_TRUE(test, hlist_empty(&list1)); 831 KUNIT_EXPECT_TRUE(test, hlist_empty(&list2)); 832 KUNIT_EXPECT_TRUE(test, hlist_empty(&list3)); 833 KUNIT_EXPECT_TRUE(test, hlist_empty(list4)); 834 KUNIT_EXPECT_TRUE(test, hlist_empty(list5)); 835 836 kfree(list4); 837 kfree(list5); 838} 839 840static void hlist_test_unhashed(struct kunit *test) 841{ 842 struct hlist_node a; 843 HLIST_HEAD(list); 844 845 INIT_HLIST_NODE(&a); 846 847 /* is unhashed by default */ 848 KUNIT_EXPECT_TRUE(test, hlist_unhashed(&a)); 849 850 hlist_add_head(&a, &list); 851 852 /* is hashed once added to list */ 853 KUNIT_EXPECT_FALSE(test, hlist_unhashed(&a)); 854 855 hlist_del_init(&a); 856 857 /* is again unhashed after del_init */ 858 KUNIT_EXPECT_TRUE(test, hlist_unhashed(&a)); 859} 860 861/* Doesn't test concurrency guarantees */ 862static void hlist_test_unhashed_lockless(struct kunit *test) 863{ 864 struct hlist_node a; 865 HLIST_HEAD(list); 866 867 INIT_HLIST_NODE(&a); 868 869 /* is unhashed by default */ 870 KUNIT_EXPECT_TRUE(test, hlist_unhashed_lockless(&a)); 871 872 hlist_add_head(&a, &list); 873 874 /* is hashed once added to list */ 875 KUNIT_EXPECT_FALSE(test, hlist_unhashed_lockless(&a)); 876 877 hlist_del_init(&a); 878 879 /* is again unhashed after del_init */ 880 KUNIT_EXPECT_TRUE(test, hlist_unhashed_lockless(&a)); 881} 882 883static void hlist_test_del(struct kunit *test) 884{ 885 struct hlist_node a, b; 886 HLIST_HEAD(list); 887 888 hlist_add_head(&a, &list); 889 hlist_add_behind(&b, &a); 890 891 /* before: [list] -> a -> b */ 892 hlist_del(&a); 893 894 /* now: [list] -> b */ 895 KUNIT_EXPECT_PTR_EQ(test, list.first, &b); 896 KUNIT_EXPECT_PTR_EQ(test, b.pprev, &list.first); 897} 898 899static void hlist_test_del_init(struct kunit *test) 900{ 901 struct hlist_node a, b; 902 HLIST_HEAD(list); 903 904 hlist_add_head(&a, &list); 905 hlist_add_behind(&b, &a); 906 907 /* before: [list] -> a -> b */ 908 hlist_del_init(&a); 909 910 /* now: [list] -> b */ 911 KUNIT_EXPECT_PTR_EQ(test, list.first, &b); 912 KUNIT_EXPECT_PTR_EQ(test, b.pprev, &list.first); 913 914 /* a is now initialised */ 915 KUNIT_EXPECT_PTR_EQ(test, a.next, NULL); 916 KUNIT_EXPECT_PTR_EQ(test, a.pprev, NULL); 917} 918 919/* Tests all three hlist_add_* functions */ 920static void hlist_test_add(struct kunit *test) 921{ 922 struct hlist_node a, b, c, d; 923 HLIST_HEAD(list); 924 925 hlist_add_head(&a, &list); 926 hlist_add_head(&b, &list); 927 hlist_add_before(&c, &a); 928 hlist_add_behind(&d, &a); 929 930 /* should be [list] -> b -> c -> a -> d */ 931 KUNIT_EXPECT_PTR_EQ(test, list.first, &b); 932 933 KUNIT_EXPECT_PTR_EQ(test, c.pprev, &(b.next)); 934 KUNIT_EXPECT_PTR_EQ(test, b.next, &c); 935 936 KUNIT_EXPECT_PTR_EQ(test, a.pprev, &(c.next)); 937 KUNIT_EXPECT_PTR_EQ(test, c.next, &a); 938 939 KUNIT_EXPECT_PTR_EQ(test, d.pprev, &(a.next)); 940 KUNIT_EXPECT_PTR_EQ(test, a.next, &d); 941} 942 943/* Tests both hlist_fake() and hlist_add_fake() */ 944static void hlist_test_fake(struct kunit *test) 945{ 946 struct hlist_node a; 947 948 INIT_HLIST_NODE(&a); 949 950 /* not fake after init */ 951 KUNIT_EXPECT_FALSE(test, hlist_fake(&a)); 952 953 hlist_add_fake(&a); 954 955 /* is now fake */ 956 KUNIT_EXPECT_TRUE(test, hlist_fake(&a)); 957} 958 959static void hlist_test_is_singular_node(struct kunit *test) 960{ 961 struct hlist_node a, b; 962 HLIST_HEAD(list); 963 964 INIT_HLIST_NODE(&a); 965 KUNIT_EXPECT_FALSE(test, hlist_is_singular_node(&a, &list)); 966 967 hlist_add_head(&a, &list); 968 KUNIT_EXPECT_TRUE(test, hlist_is_singular_node(&a, &list)); 969 970 hlist_add_head(&b, &list); 971 KUNIT_EXPECT_FALSE(test, hlist_is_singular_node(&a, &list)); 972 KUNIT_EXPECT_FALSE(test, hlist_is_singular_node(&b, &list)); 973} 974 975static void hlist_test_empty(struct kunit *test) 976{ 977 struct hlist_node a; 978 HLIST_HEAD(list); 979 980 /* list starts off empty */ 981 KUNIT_EXPECT_TRUE(test, hlist_empty(&list)); 982 983 hlist_add_head(&a, &list); 984 985 /* list is no longer empty */ 986 KUNIT_EXPECT_FALSE(test, hlist_empty(&list)); 987} 988 989static void hlist_test_move_list(struct kunit *test) 990{ 991 struct hlist_node a; 992 HLIST_HEAD(list1); 993 HLIST_HEAD(list2); 994 995 hlist_add_head(&a, &list1); 996 997 KUNIT_EXPECT_FALSE(test, hlist_empty(&list1)); 998 KUNIT_EXPECT_TRUE(test, hlist_empty(&list2)); 999 hlist_move_list(&list1, &list2); 1000 KUNIT_EXPECT_TRUE(test, hlist_empty(&list1)); 1001 KUNIT_EXPECT_FALSE(test, hlist_empty(&list2)); 1002 1003} 1004 1005static void hlist_test_entry(struct kunit *test) 1006{ 1007 struct hlist_test_struct test_struct; 1008 1009 KUNIT_EXPECT_PTR_EQ(test, &test_struct, 1010 hlist_entry(&(test_struct.list), 1011 struct hlist_test_struct, list)); 1012} 1013 1014static void hlist_test_entry_safe(struct kunit *test) 1015{ 1016 struct hlist_test_struct test_struct; 1017 1018 KUNIT_EXPECT_PTR_EQ(test, &test_struct, 1019 hlist_entry_safe(&(test_struct.list), 1020 struct hlist_test_struct, list)); 1021 1022 KUNIT_EXPECT_PTR_EQ(test, NULL, 1023 hlist_entry_safe((struct hlist_node *)NULL, 1024 struct hlist_test_struct, list)); 1025} 1026 1027static void hlist_test_for_each(struct kunit *test) 1028{ 1029 struct hlist_node entries[3], *cur; 1030 HLIST_HEAD(list); 1031 int i = 0; 1032 1033 hlist_add_head(&entries[0], &list); 1034 hlist_add_behind(&entries[1], &entries[0]); 1035 hlist_add_behind(&entries[2], &entries[1]); 1036 1037 hlist_for_each(cur, &list) { 1038 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 1039 i++; 1040 } 1041 1042 KUNIT_EXPECT_EQ(test, i, 3); 1043} 1044 1045 1046static void hlist_test_for_each_safe(struct kunit *test) 1047{ 1048 struct hlist_node entries[3], *cur, *n; 1049 HLIST_HEAD(list); 1050 int i = 0; 1051 1052 hlist_add_head(&entries[0], &list); 1053 hlist_add_behind(&entries[1], &entries[0]); 1054 hlist_add_behind(&entries[2], &entries[1]); 1055 1056 hlist_for_each_safe(cur, n, &list) { 1057 KUNIT_EXPECT_PTR_EQ(test, cur, &entries[i]); 1058 hlist_del(&entries[i]); 1059 i++; 1060 } 1061 1062 KUNIT_EXPECT_EQ(test, i, 3); 1063 KUNIT_EXPECT_TRUE(test, hlist_empty(&list)); 1064} 1065 1066static void hlist_test_for_each_entry(struct kunit *test) 1067{ 1068 struct hlist_test_struct entries[5], *cur; 1069 HLIST_HEAD(list); 1070 int i = 0; 1071 1072 entries[0].data = 0; 1073 hlist_add_head(&entries[0].list, &list); 1074 for (i = 1; i < 5; ++i) { 1075 entries[i].data = i; 1076 hlist_add_behind(&entries[i].list, &entries[i-1].list); 1077 } 1078 1079 i = 0; 1080 1081 hlist_for_each_entry(cur, &list, list) { 1082 KUNIT_EXPECT_EQ(test, cur->data, i); 1083 i++; 1084 } 1085 1086 KUNIT_EXPECT_EQ(test, i, 5); 1087} 1088 1089static void hlist_test_for_each_entry_continue(struct kunit *test) 1090{ 1091 struct hlist_test_struct entries[5], *cur; 1092 HLIST_HEAD(list); 1093 int i = 0; 1094 1095 entries[0].data = 0; 1096 hlist_add_head(&entries[0].list, &list); 1097 for (i = 1; i < 5; ++i) { 1098 entries[i].data = i; 1099 hlist_add_behind(&entries[i].list, &entries[i-1].list); 1100 } 1101 1102 /* We skip the first (zero-th) entry. */ 1103 i = 1; 1104 1105 cur = &entries[0]; 1106 hlist_for_each_entry_continue(cur, list) { 1107 KUNIT_EXPECT_EQ(test, cur->data, i); 1108 /* Stamp over the entry. */ 1109 cur->data = 42; 1110 i++; 1111 } 1112 1113 KUNIT_EXPECT_EQ(test, i, 5); 1114 /* The first entry was not visited. */ 1115 KUNIT_EXPECT_EQ(test, entries[0].data, 0); 1116 /* The second (and presumably others), were. */ 1117 KUNIT_EXPECT_EQ(test, entries[1].data, 42); 1118} 1119 1120static void hlist_test_for_each_entry_from(struct kunit *test) 1121{ 1122 struct hlist_test_struct entries[5], *cur; 1123 HLIST_HEAD(list); 1124 int i = 0; 1125 1126 entries[0].data = 0; 1127 hlist_add_head(&entries[0].list, &list); 1128 for (i = 1; i < 5; ++i) { 1129 entries[i].data = i; 1130 hlist_add_behind(&entries[i].list, &entries[i-1].list); 1131 } 1132 1133 i = 0; 1134 1135 cur = &entries[0]; 1136 hlist_for_each_entry_from(cur, list) { 1137 KUNIT_EXPECT_EQ(test, cur->data, i); 1138 /* Stamp over the entry. */ 1139 cur->data = 42; 1140 i++; 1141 } 1142 1143 KUNIT_EXPECT_EQ(test, i, 5); 1144 /* The first entry was visited. */ 1145 KUNIT_EXPECT_EQ(test, entries[0].data, 42); 1146} 1147 1148static void hlist_test_for_each_entry_safe(struct kunit *test) 1149{ 1150 struct hlist_test_struct entries[5], *cur; 1151 struct hlist_node *tmp_node; 1152 HLIST_HEAD(list); 1153 int i = 0; 1154 1155 entries[0].data = 0; 1156 hlist_add_head(&entries[0].list, &list); 1157 for (i = 1; i < 5; ++i) { 1158 entries[i].data = i; 1159 hlist_add_behind(&entries[i].list, &entries[i-1].list); 1160 } 1161 1162 i = 0; 1163 1164 hlist_for_each_entry_safe(cur, tmp_node, &list, list) { 1165 KUNIT_EXPECT_EQ(test, cur->data, i); 1166 hlist_del(&cur->list); 1167 i++; 1168 } 1169 1170 KUNIT_EXPECT_EQ(test, i, 5); 1171 KUNIT_EXPECT_TRUE(test, hlist_empty(&list)); 1172} 1173 1174 1175static struct kunit_case hlist_test_cases[] = { 1176 KUNIT_CASE(hlist_test_init), 1177 KUNIT_CASE(hlist_test_unhashed), 1178 KUNIT_CASE(hlist_test_unhashed_lockless), 1179 KUNIT_CASE(hlist_test_del), 1180 KUNIT_CASE(hlist_test_del_init), 1181 KUNIT_CASE(hlist_test_add), 1182 KUNIT_CASE(hlist_test_fake), 1183 KUNIT_CASE(hlist_test_is_singular_node), 1184 KUNIT_CASE(hlist_test_empty), 1185 KUNIT_CASE(hlist_test_move_list), 1186 KUNIT_CASE(hlist_test_entry), 1187 KUNIT_CASE(hlist_test_entry_safe), 1188 KUNIT_CASE(hlist_test_for_each), 1189 KUNIT_CASE(hlist_test_for_each_safe), 1190 KUNIT_CASE(hlist_test_for_each_entry), 1191 KUNIT_CASE(hlist_test_for_each_entry_continue), 1192 KUNIT_CASE(hlist_test_for_each_entry_from), 1193 KUNIT_CASE(hlist_test_for_each_entry_safe), 1194 {}, 1195}; 1196 1197static struct kunit_suite hlist_test_module = { 1198 .name = "hlist", 1199 .test_cases = hlist_test_cases, 1200}; 1201 1202kunit_test_suites(&list_test_module, &hlist_test_module); 1203 1204MODULE_LICENSE("GPL v2");