list-test.c 28 KB

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