cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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");