test_maple_tree.c 105 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * test_maple_tree.c: Test the maple tree API
  4. * Copyright (c) 2018-2022 Oracle Corporation
  5. * Author: Liam R. Howlett <Liam.Howlett@Oracle.com>
  6. *
  7. * Any tests that only require the interface of the tree.
  8. */
  9. #include <linux/maple_tree.h>
  10. #include <linux/module.h>
  11. #include <linux/rwsem.h>
  12. #define MTREE_ALLOC_MAX 0x2000000000000Ul
  13. #define CONFIG_MAPLE_SEARCH
  14. #define MAPLE_32BIT (MAPLE_NODE_SLOTS > 31)
  15. #ifndef CONFIG_DEBUG_MAPLE_TREE
  16. #define mt_dump(mt, fmt) do {} while (0)
  17. #define mt_validate(mt) do {} while (0)
  18. #define mt_cache_shrink() do {} while (0)
  19. #define mas_dump(mas) do {} while (0)
  20. #define mas_wr_dump(mas) do {} while (0)
  21. atomic_t maple_tree_tests_run;
  22. atomic_t maple_tree_tests_passed;
  23. #undef MT_BUG_ON
  24. #define MT_BUG_ON(__tree, __x) do { \
  25. atomic_inc(&maple_tree_tests_run); \
  26. if (__x) { \
  27. pr_info("BUG at %s:%d (%u)\n", \
  28. __func__, __LINE__, __x); \
  29. pr_info("Pass: %u Run:%u\n", \
  30. atomic_read(&maple_tree_tests_passed), \
  31. atomic_read(&maple_tree_tests_run)); \
  32. } else { \
  33. atomic_inc(&maple_tree_tests_passed); \
  34. } \
  35. } while (0)
  36. #endif
  37. /* #define BENCH_SLOT_STORE */
  38. /* #define BENCH_NODE_STORE */
  39. /* #define BENCH_AWALK */
  40. /* #define BENCH_WALK */
  41. /* #define BENCH_LOAD */
  42. /* #define BENCH_MT_FOR_EACH */
  43. /* #define BENCH_FORK */
  44. /* #define BENCH_MAS_FOR_EACH */
  45. /* #define BENCH_MAS_PREV */
  46. #ifdef __KERNEL__
  47. #define mt_set_non_kernel(x) do {} while (0)
  48. #define mt_zero_nr_tallocated(x) do {} while (0)
  49. #else
  50. #define cond_resched() do {} while (0)
  51. #endif
  52. #define mas_is_none(x) ((x)->status == ma_none)
  53. #define mas_is_overflow(x) ((x)->status == ma_overflow)
  54. #define mas_is_underflow(x) ((x)->status == ma_underflow)
  55. static int __init mtree_insert_index(struct maple_tree *mt,
  56. unsigned long index, gfp_t gfp)
  57. {
  58. return mtree_insert(mt, index, xa_mk_value(index & LONG_MAX), gfp);
  59. }
  60. static void __init mtree_erase_index(struct maple_tree *mt, unsigned long index)
  61. {
  62. MT_BUG_ON(mt, mtree_erase(mt, index) != xa_mk_value(index & LONG_MAX));
  63. MT_BUG_ON(mt, mtree_load(mt, index) != NULL);
  64. }
  65. static int __init mtree_test_insert(struct maple_tree *mt, unsigned long index,
  66. void *ptr)
  67. {
  68. return mtree_insert(mt, index, ptr, GFP_KERNEL);
  69. }
  70. static int __init mtree_test_store_range(struct maple_tree *mt,
  71. unsigned long start, unsigned long end, void *ptr)
  72. {
  73. return mtree_store_range(mt, start, end, ptr, GFP_KERNEL);
  74. }
  75. static int __init mtree_test_store(struct maple_tree *mt, unsigned long start,
  76. void *ptr)
  77. {
  78. return mtree_test_store_range(mt, start, start, ptr);
  79. }
  80. static int __init mtree_test_insert_range(struct maple_tree *mt,
  81. unsigned long start, unsigned long end, void *ptr)
  82. {
  83. return mtree_insert_range(mt, start, end, ptr, GFP_KERNEL);
  84. }
  85. static void __init *mtree_test_load(struct maple_tree *mt, unsigned long index)
  86. {
  87. return mtree_load(mt, index);
  88. }
  89. static void __init *mtree_test_erase(struct maple_tree *mt, unsigned long index)
  90. {
  91. return mtree_erase(mt, index);
  92. }
  93. #if defined(CONFIG_64BIT)
  94. static noinline void __init check_mtree_alloc_range(struct maple_tree *mt,
  95. unsigned long start, unsigned long end, unsigned long size,
  96. unsigned long expected, int eret, void *ptr)
  97. {
  98. unsigned long result = expected + 1;
  99. int ret;
  100. ret = mtree_alloc_range(mt, &result, ptr, size, start, end,
  101. GFP_KERNEL);
  102. MT_BUG_ON(mt, ret != eret);
  103. if (ret)
  104. return;
  105. MT_BUG_ON(mt, result != expected);
  106. }
  107. static noinline void __init check_mtree_alloc_rrange(struct maple_tree *mt,
  108. unsigned long start, unsigned long end, unsigned long size,
  109. unsigned long expected, int eret, void *ptr)
  110. {
  111. unsigned long result = expected + 1;
  112. int ret;
  113. ret = mtree_alloc_rrange(mt, &result, ptr, size, start, end,
  114. GFP_KERNEL);
  115. MT_BUG_ON(mt, ret != eret);
  116. if (ret)
  117. return;
  118. MT_BUG_ON(mt, result != expected);
  119. }
  120. #endif
  121. static noinline void __init check_load(struct maple_tree *mt,
  122. unsigned long index, void *ptr)
  123. {
  124. void *ret = mtree_test_load(mt, index);
  125. if (ret != ptr)
  126. pr_err("Load %lu returned %p expect %p\n", index, ret, ptr);
  127. MT_BUG_ON(mt, ret != ptr);
  128. }
  129. static noinline void __init check_store_range(struct maple_tree *mt,
  130. unsigned long start, unsigned long end, void *ptr, int expected)
  131. {
  132. int ret = -EINVAL;
  133. unsigned long i;
  134. ret = mtree_test_store_range(mt, start, end, ptr);
  135. MT_BUG_ON(mt, ret != expected);
  136. if (ret)
  137. return;
  138. for (i = start; i <= end; i++)
  139. check_load(mt, i, ptr);
  140. }
  141. static noinline void __init check_insert_range(struct maple_tree *mt,
  142. unsigned long start, unsigned long end, void *ptr, int expected)
  143. {
  144. int ret = -EINVAL;
  145. unsigned long i;
  146. ret = mtree_test_insert_range(mt, start, end, ptr);
  147. MT_BUG_ON(mt, ret != expected);
  148. if (ret)
  149. return;
  150. for (i = start; i <= end; i++)
  151. check_load(mt, i, ptr);
  152. }
  153. static noinline void __init check_insert(struct maple_tree *mt,
  154. unsigned long index, void *ptr)
  155. {
  156. int ret = -EINVAL;
  157. ret = mtree_test_insert(mt, index, ptr);
  158. MT_BUG_ON(mt, ret != 0);
  159. }
  160. static noinline void __init check_dup_insert(struct maple_tree *mt,
  161. unsigned long index, void *ptr)
  162. {
  163. int ret = -EINVAL;
  164. ret = mtree_test_insert(mt, index, ptr);
  165. MT_BUG_ON(mt, ret != -EEXIST);
  166. }
  167. static noinline void __init check_index_load(struct maple_tree *mt,
  168. unsigned long index)
  169. {
  170. return check_load(mt, index, xa_mk_value(index & LONG_MAX));
  171. }
  172. static inline __init int not_empty(struct maple_node *node)
  173. {
  174. int i;
  175. if (node->parent)
  176. return 1;
  177. for (i = 0; i < ARRAY_SIZE(node->slot); i++)
  178. if (node->slot[i])
  179. return 1;
  180. return 0;
  181. }
  182. static noinline void __init check_rev_seq(struct maple_tree *mt,
  183. unsigned long max, bool verbose)
  184. {
  185. unsigned long i = max, j;
  186. MT_BUG_ON(mt, !mtree_empty(mt));
  187. mt_zero_nr_tallocated();
  188. while (i) {
  189. MT_BUG_ON(mt, mtree_insert_index(mt, i, GFP_KERNEL));
  190. for (j = i; j <= max; j++)
  191. check_index_load(mt, j);
  192. check_load(mt, i - 1, NULL);
  193. mt_set_in_rcu(mt);
  194. MT_BUG_ON(mt, !mt_height(mt));
  195. mt_clear_in_rcu(mt);
  196. MT_BUG_ON(mt, !mt_height(mt));
  197. i--;
  198. }
  199. check_load(mt, max + 1, NULL);
  200. #ifndef __KERNEL__
  201. if (verbose) {
  202. rcu_barrier();
  203. mt_dump(mt, mt_dump_dec);
  204. pr_info(" %s test of 0-%lu %luK in %d active (%d total)\n",
  205. __func__, max, mt_get_alloc_size()/1024, mt_nr_allocated(),
  206. mt_nr_tallocated());
  207. }
  208. #endif
  209. }
  210. static noinline void __init check_seq(struct maple_tree *mt, unsigned long max,
  211. bool verbose)
  212. {
  213. unsigned long i, j;
  214. MT_BUG_ON(mt, !mtree_empty(mt));
  215. mt_zero_nr_tallocated();
  216. for (i = 0; i <= max; i++) {
  217. MT_BUG_ON(mt, mtree_insert_index(mt, i, GFP_KERNEL));
  218. for (j = 0; j <= i; j++)
  219. check_index_load(mt, j);
  220. if (i)
  221. MT_BUG_ON(mt, !mt_height(mt));
  222. check_load(mt, i + 1, NULL);
  223. }
  224. #ifndef __KERNEL__
  225. if (verbose) {
  226. rcu_barrier();
  227. mt_dump(mt, mt_dump_dec);
  228. pr_info(" seq test of 0-%lu %luK in %d active (%d total)\n",
  229. max, mt_get_alloc_size()/1024, mt_nr_allocated(),
  230. mt_nr_tallocated());
  231. }
  232. #endif
  233. }
  234. static noinline void __init check_lb_not_empty(struct maple_tree *mt)
  235. {
  236. unsigned long i, j;
  237. unsigned long huge = 4000UL * 1000 * 1000;
  238. i = huge;
  239. while (i > 4096) {
  240. check_insert(mt, i, (void *) i);
  241. for (j = huge; j >= i; j /= 2) {
  242. check_load(mt, j-1, NULL);
  243. check_load(mt, j, (void *) j);
  244. check_load(mt, j+1, NULL);
  245. }
  246. i /= 2;
  247. }
  248. mtree_destroy(mt);
  249. }
  250. static noinline void __init check_lower_bound_split(struct maple_tree *mt)
  251. {
  252. MT_BUG_ON(mt, !mtree_empty(mt));
  253. check_lb_not_empty(mt);
  254. }
  255. static noinline void __init check_upper_bound_split(struct maple_tree *mt)
  256. {
  257. unsigned long i, j;
  258. unsigned long huge;
  259. MT_BUG_ON(mt, !mtree_empty(mt));
  260. if (MAPLE_32BIT)
  261. huge = 2147483647UL;
  262. else
  263. huge = 4000UL * 1000 * 1000;
  264. i = 4096;
  265. while (i < huge) {
  266. check_insert(mt, i, (void *) i);
  267. for (j = i; j >= huge; j *= 2) {
  268. check_load(mt, j-1, NULL);
  269. check_load(mt, j, (void *) j);
  270. check_load(mt, j+1, NULL);
  271. }
  272. i *= 2;
  273. }
  274. mtree_destroy(mt);
  275. }
  276. static noinline void __init check_mid_split(struct maple_tree *mt)
  277. {
  278. unsigned long huge = 8000UL * 1000 * 1000;
  279. check_insert(mt, huge, (void *) huge);
  280. check_insert(mt, 0, xa_mk_value(0));
  281. check_lb_not_empty(mt);
  282. }
  283. static noinline void __init check_rev_find(struct maple_tree *mt)
  284. {
  285. int i, nr_entries = 200;
  286. void *val;
  287. MA_STATE(mas, mt, 0, 0);
  288. for (i = 0; i <= nr_entries; i++)
  289. mtree_store_range(mt, i*10, i*10 + 5,
  290. xa_mk_value(i), GFP_KERNEL);
  291. rcu_read_lock();
  292. mas_set(&mas, 1000);
  293. val = mas_find_rev(&mas, 1000);
  294. MT_BUG_ON(mt, val != xa_mk_value(100));
  295. val = mas_find_rev(&mas, 1000);
  296. MT_BUG_ON(mt, val != NULL);
  297. mas_set(&mas, 999);
  298. val = mas_find_rev(&mas, 997);
  299. MT_BUG_ON(mt, val != NULL);
  300. mas_set(&mas, 1000);
  301. val = mas_find_rev(&mas, 900);
  302. MT_BUG_ON(mt, val != xa_mk_value(100));
  303. val = mas_find_rev(&mas, 900);
  304. MT_BUG_ON(mt, val != xa_mk_value(99));
  305. mas_set(&mas, 20);
  306. val = mas_find_rev(&mas, 0);
  307. MT_BUG_ON(mt, val != xa_mk_value(2));
  308. val = mas_find_rev(&mas, 0);
  309. MT_BUG_ON(mt, val != xa_mk_value(1));
  310. val = mas_find_rev(&mas, 0);
  311. MT_BUG_ON(mt, val != xa_mk_value(0));
  312. val = mas_find_rev(&mas, 0);
  313. MT_BUG_ON(mt, val != NULL);
  314. rcu_read_unlock();
  315. }
  316. static noinline void __init check_find(struct maple_tree *mt)
  317. {
  318. unsigned long val = 0;
  319. unsigned long count;
  320. unsigned long max;
  321. unsigned long top;
  322. unsigned long last = 0, index = 0;
  323. void *entry, *entry2;
  324. MA_STATE(mas, mt, 0, 0);
  325. /* Insert 0. */
  326. MT_BUG_ON(mt, mtree_insert_index(mt, val++, GFP_KERNEL));
  327. #if defined(CONFIG_64BIT)
  328. top = 4398046511104UL;
  329. #else
  330. top = ULONG_MAX;
  331. #endif
  332. if (MAPLE_32BIT) {
  333. count = 15;
  334. } else {
  335. count = 20;
  336. }
  337. for (int i = 0; i <= count; i++) {
  338. if (val != 64)
  339. MT_BUG_ON(mt, mtree_insert_index(mt, val, GFP_KERNEL));
  340. else
  341. MT_BUG_ON(mt, mtree_insert(mt, val,
  342. XA_ZERO_ENTRY, GFP_KERNEL));
  343. val <<= 2;
  344. }
  345. val = 0;
  346. mas_set(&mas, val);
  347. mas_lock(&mas);
  348. while ((entry = mas_find(&mas, 268435456)) != NULL) {
  349. if (val != 64)
  350. MT_BUG_ON(mt, xa_mk_value(val) != entry);
  351. else
  352. MT_BUG_ON(mt, entry != XA_ZERO_ENTRY);
  353. val <<= 2;
  354. /* For zero check. */
  355. if (!val)
  356. val = 1;
  357. }
  358. mas_unlock(&mas);
  359. val = 0;
  360. mas_set(&mas, val);
  361. mas_lock(&mas);
  362. mas_for_each(&mas, entry, ULONG_MAX) {
  363. if (val != 64)
  364. MT_BUG_ON(mt, xa_mk_value(val) != entry);
  365. else
  366. MT_BUG_ON(mt, entry != XA_ZERO_ENTRY);
  367. val <<= 2;
  368. /* For zero check. */
  369. if (!val)
  370. val = 1;
  371. }
  372. mas_unlock(&mas);
  373. /* Test mas_pause */
  374. val = 0;
  375. mas_set(&mas, val);
  376. mas_lock(&mas);
  377. mas_for_each(&mas, entry, ULONG_MAX) {
  378. if (val != 64)
  379. MT_BUG_ON(mt, xa_mk_value(val) != entry);
  380. else
  381. MT_BUG_ON(mt, entry != XA_ZERO_ENTRY);
  382. val <<= 2;
  383. /* For zero check. */
  384. if (!val)
  385. val = 1;
  386. mas_pause(&mas);
  387. mas_unlock(&mas);
  388. mas_lock(&mas);
  389. }
  390. mas_unlock(&mas);
  391. val = 0;
  392. max = 300; /* A value big enough to include XA_ZERO_ENTRY at 64. */
  393. mt_for_each(mt, entry, index, max) {
  394. MT_BUG_ON(mt, xa_mk_value(val) != entry);
  395. val <<= 2;
  396. if (val == 64) /* Skip zero entry. */
  397. val <<= 2;
  398. /* For zero check. */
  399. if (!val)
  400. val = 1;
  401. }
  402. val = 0;
  403. max = 0;
  404. index = 0;
  405. MT_BUG_ON(mt, mtree_insert_index(mt, ULONG_MAX, GFP_KERNEL));
  406. mt_for_each(mt, entry, index, ULONG_MAX) {
  407. if (val == top)
  408. MT_BUG_ON(mt, entry != xa_mk_value(LONG_MAX));
  409. else
  410. MT_BUG_ON(mt, xa_mk_value(val) != entry);
  411. /* Workaround for 32bit */
  412. if ((val << 2) < val)
  413. val = ULONG_MAX;
  414. else
  415. val <<= 2;
  416. if (val == 64) /* Skip zero entry. */
  417. val <<= 2;
  418. /* For zero check. */
  419. if (!val)
  420. val = 1;
  421. max++;
  422. MT_BUG_ON(mt, max > 25);
  423. }
  424. mtree_erase_index(mt, ULONG_MAX);
  425. mas_reset(&mas);
  426. index = 17;
  427. entry = mt_find(mt, &index, 512);
  428. MT_BUG_ON(mt, xa_mk_value(256) != entry);
  429. mas_reset(&mas);
  430. index = 17;
  431. entry = mt_find(mt, &index, 20);
  432. MT_BUG_ON(mt, entry != NULL);
  433. /* Range check.. */
  434. /* Insert ULONG_MAX */
  435. MT_BUG_ON(mt, mtree_insert_index(mt, ULONG_MAX, GFP_KERNEL));
  436. val = 0;
  437. mas_set(&mas, 0);
  438. mas_lock(&mas);
  439. mas_for_each(&mas, entry, ULONG_MAX) {
  440. if (val == 64)
  441. MT_BUG_ON(mt, entry != XA_ZERO_ENTRY);
  442. else if (val == top)
  443. MT_BUG_ON(mt, entry != xa_mk_value(LONG_MAX));
  444. else
  445. MT_BUG_ON(mt, xa_mk_value(val) != entry);
  446. /* Workaround for 32bit */
  447. if ((val << 2) < val)
  448. val = ULONG_MAX;
  449. else
  450. val <<= 2;
  451. /* For zero check. */
  452. if (!val)
  453. val = 1;
  454. mas_pause(&mas);
  455. mas_unlock(&mas);
  456. mas_lock(&mas);
  457. }
  458. mas_unlock(&mas);
  459. mas_set(&mas, 1048576);
  460. mas_lock(&mas);
  461. entry = mas_find(&mas, 1048576);
  462. mas_unlock(&mas);
  463. MT_BUG_ON(mas.tree, entry == NULL);
  464. /*
  465. * Find last value.
  466. * 1. get the expected value, leveraging the existence of an end entry
  467. * 2. delete end entry
  468. * 3. find the last value but searching for ULONG_MAX and then using
  469. * prev
  470. */
  471. /* First, get the expected result. */
  472. mas_lock(&mas);
  473. mas_reset(&mas);
  474. mas.index = ULONG_MAX; /* start at max.. */
  475. entry = mas_find(&mas, ULONG_MAX);
  476. entry = mas_prev(&mas, 0);
  477. index = mas.index;
  478. last = mas.last;
  479. /* Erase the last entry. */
  480. mas_reset(&mas);
  481. mas.index = ULONG_MAX;
  482. mas.last = ULONG_MAX;
  483. mas_erase(&mas);
  484. /* Get the previous value from MAS_START */
  485. mas_reset(&mas);
  486. entry2 = mas_prev(&mas, 0);
  487. /* Check results. */
  488. MT_BUG_ON(mt, entry != entry2);
  489. MT_BUG_ON(mt, index != mas.index);
  490. MT_BUG_ON(mt, last != mas.last);
  491. mas.status = ma_none;
  492. mas.index = ULONG_MAX;
  493. mas.last = ULONG_MAX;
  494. entry2 = mas_prev(&mas, 0);
  495. MT_BUG_ON(mt, entry != entry2);
  496. mas_set(&mas, 0);
  497. MT_BUG_ON(mt, mas_prev(&mas, 0) != NULL);
  498. mas_unlock(&mas);
  499. mtree_destroy(mt);
  500. }
  501. static noinline void __init check_find_2(struct maple_tree *mt)
  502. {
  503. unsigned long i, j;
  504. void *entry;
  505. MA_STATE(mas, mt, 0, 0);
  506. rcu_read_lock();
  507. mas_for_each(&mas, entry, ULONG_MAX)
  508. MT_BUG_ON(mt, true);
  509. rcu_read_unlock();
  510. for (i = 0; i < 256; i++) {
  511. mtree_insert_index(mt, i, GFP_KERNEL);
  512. j = 0;
  513. mas_set(&mas, 0);
  514. rcu_read_lock();
  515. mas_for_each(&mas, entry, ULONG_MAX) {
  516. MT_BUG_ON(mt, entry != xa_mk_value(j));
  517. j++;
  518. }
  519. rcu_read_unlock();
  520. MT_BUG_ON(mt, j != i + 1);
  521. }
  522. for (i = 0; i < 256; i++) {
  523. mtree_erase_index(mt, i);
  524. j = i + 1;
  525. mas_set(&mas, 0);
  526. rcu_read_lock();
  527. mas_for_each(&mas, entry, ULONG_MAX) {
  528. if (xa_is_zero(entry))
  529. continue;
  530. MT_BUG_ON(mt, entry != xa_mk_value(j));
  531. j++;
  532. }
  533. rcu_read_unlock();
  534. MT_BUG_ON(mt, j != 256);
  535. }
  536. /*MT_BUG_ON(mt, !mtree_empty(mt)); */
  537. }
  538. #if defined(CONFIG_64BIT)
  539. static noinline void __init check_alloc_rev_range(struct maple_tree *mt)
  540. {
  541. /*
  542. * Generated by:
  543. * cat /proc/self/maps | awk '{print $1}'|
  544. * awk -F "-" '{printf "0x%s, 0x%s, ", $1, $2}'
  545. */
  546. static const unsigned long range[] = {
  547. /* Inclusive , Exclusive. */
  548. 0x565234af2000, 0x565234af4000,
  549. 0x565234af4000, 0x565234af9000,
  550. 0x565234af9000, 0x565234afb000,
  551. 0x565234afc000, 0x565234afd000,
  552. 0x565234afd000, 0x565234afe000,
  553. 0x565235def000, 0x565235e10000,
  554. 0x7f36d4bfd000, 0x7f36d4ee2000,
  555. 0x7f36d4ee2000, 0x7f36d4f04000,
  556. 0x7f36d4f04000, 0x7f36d504c000,
  557. 0x7f36d504c000, 0x7f36d5098000,
  558. 0x7f36d5098000, 0x7f36d5099000,
  559. 0x7f36d5099000, 0x7f36d509d000,
  560. 0x7f36d509d000, 0x7f36d509f000,
  561. 0x7f36d509f000, 0x7f36d50a5000,
  562. 0x7f36d50b9000, 0x7f36d50db000,
  563. 0x7f36d50db000, 0x7f36d50dc000,
  564. 0x7f36d50dc000, 0x7f36d50fa000,
  565. 0x7f36d50fa000, 0x7f36d5102000,
  566. 0x7f36d5102000, 0x7f36d5103000,
  567. 0x7f36d5103000, 0x7f36d5104000,
  568. 0x7f36d5104000, 0x7f36d5105000,
  569. 0x7fff5876b000, 0x7fff5878d000,
  570. 0x7fff5878e000, 0x7fff58791000,
  571. 0x7fff58791000, 0x7fff58793000,
  572. };
  573. static const unsigned long holes[] = {
  574. /*
  575. * Note: start of hole is INCLUSIVE
  576. * end of hole is EXCLUSIVE
  577. * (opposite of the above table.)
  578. * Start of hole, end of hole, size of hole (+1)
  579. */
  580. 0x565234afb000, 0x565234afc000, 0x1000,
  581. 0x565234afe000, 0x565235def000, 0x12F1000,
  582. 0x565235e10000, 0x7f36d4bfd000, 0x28E49EDED000,
  583. };
  584. /*
  585. * req_range consists of 4 values.
  586. * 1. min index
  587. * 2. max index
  588. * 3. size
  589. * 4. number that should be returned.
  590. * 5. return value
  591. */
  592. static const unsigned long req_range[] = {
  593. 0x565234af9000, /* Min */
  594. 0x7fff58791000, /* Max */
  595. 0x1000, /* Size */
  596. 0x7fff5878d << 12, /* First rev hole of size 0x1000 */
  597. 0, /* Return value success. */
  598. 0x0, /* Min */
  599. 0x565234AF0 << 12, /* Max */
  600. 0x3000, /* Size */
  601. 0x565234AEE << 12, /* max - 3. */
  602. 0, /* Return value success. */
  603. 0x0, /* Min */
  604. -1, /* Max */
  605. 0x1000, /* Size */
  606. 562949953421311 << 12,/* First rev hole of size 0x1000 */
  607. 0, /* Return value success. */
  608. 0x0, /* Min */
  609. 0x7F36D5109 << 12, /* Max */
  610. 0x4000, /* Size */
  611. 0x7F36D5106 << 12, /* First rev hole of size 0x4000 */
  612. 0, /* Return value success. */
  613. /* Ascend test. */
  614. 0x0,
  615. 34148798628 << 12,
  616. 19 << 12,
  617. 34148797418 << 12,
  618. 0x0,
  619. /* Too big test. */
  620. 0x0,
  621. 18446744073709551615UL,
  622. 562915594369134UL << 12,
  623. 0x0,
  624. -EBUSY,
  625. /* Single space test. */
  626. 34148798725 << 12,
  627. 34148798725 << 12,
  628. 1 << 12,
  629. 34148798725 << 12,
  630. 0,
  631. };
  632. int i, range_count = ARRAY_SIZE(range);
  633. int req_range_count = ARRAY_SIZE(req_range);
  634. unsigned long min = 0;
  635. MA_STATE(mas, mt, 0, 0);
  636. mtree_store_range(mt, MTREE_ALLOC_MAX, ULONG_MAX, XA_ZERO_ENTRY,
  637. GFP_KERNEL);
  638. #define DEBUG_REV_RANGE 0
  639. for (i = 0; i < range_count; i += 2) {
  640. /* Inclusive, Inclusive (with the -1) */
  641. #if DEBUG_REV_RANGE
  642. pr_debug("\t%s: Insert %lu-%lu\n", __func__, range[i] >> 12,
  643. (range[i + 1] >> 12) - 1);
  644. #endif
  645. check_insert_range(mt, range[i] >> 12, (range[i + 1] >> 12) - 1,
  646. xa_mk_value(range[i] >> 12), 0);
  647. mt_validate(mt);
  648. }
  649. mas_lock(&mas);
  650. for (i = 0; i < ARRAY_SIZE(holes); i += 3) {
  651. #if DEBUG_REV_RANGE
  652. pr_debug("Search from %lu-%lu for gap %lu should be at %lu\n",
  653. min, holes[i+1]>>12, holes[i+2]>>12,
  654. holes[i] >> 12);
  655. #endif
  656. MT_BUG_ON(mt, mas_empty_area_rev(&mas, min,
  657. holes[i+1] >> 12,
  658. holes[i+2] >> 12));
  659. #if DEBUG_REV_RANGE
  660. pr_debug("Found %lu %lu\n", mas.index, mas.last);
  661. pr_debug("gap %lu %lu\n", (holes[i] >> 12),
  662. (holes[i+1] >> 12));
  663. #endif
  664. MT_BUG_ON(mt, mas.last + 1 != (holes[i+1] >> 12));
  665. MT_BUG_ON(mt, mas.index != (holes[i+1] >> 12) - (holes[i+2] >> 12));
  666. min = holes[i+1] >> 12;
  667. mas_reset(&mas);
  668. }
  669. mas_unlock(&mas);
  670. for (i = 0; i < req_range_count; i += 5) {
  671. #if DEBUG_REV_RANGE
  672. pr_debug("\tReverse request %d between %lu-%lu size %lu, should get %lu\n",
  673. i, req_range[i] >> 12,
  674. (req_range[i + 1] >> 12),
  675. req_range[i+2] >> 12,
  676. req_range[i+3] >> 12);
  677. #endif
  678. check_mtree_alloc_rrange(mt,
  679. req_range[i] >> 12, /* start */
  680. req_range[i+1] >> 12, /* end */
  681. req_range[i+2] >> 12, /* size */
  682. req_range[i+3] >> 12, /* expected address */
  683. req_range[i+4], /* expected return */
  684. xa_mk_value(req_range[i] >> 12)); /* pointer */
  685. mt_validate(mt);
  686. }
  687. mt_set_non_kernel(1);
  688. mtree_erase(mt, 34148798727); /* create a deleted range. */
  689. mtree_erase(mt, 34148798725);
  690. check_mtree_alloc_rrange(mt, 0, 34359052173, 210253414,
  691. 34148798725, 0, mt);
  692. mtree_destroy(mt);
  693. }
  694. static noinline void __init check_alloc_range(struct maple_tree *mt)
  695. {
  696. /*
  697. * Generated by:
  698. * cat /proc/self/maps|awk '{print $1}'|
  699. * awk -F "-" '{printf "0x%s, 0x%s, ", $1, $2}'
  700. */
  701. static const unsigned long range[] = {
  702. /* Inclusive , Exclusive. */
  703. 0x565234af2000, 0x565234af4000,
  704. 0x565234af4000, 0x565234af9000,
  705. 0x565234af9000, 0x565234afb000,
  706. 0x565234afc000, 0x565234afd000,
  707. 0x565234afd000, 0x565234afe000,
  708. 0x565235def000, 0x565235e10000,
  709. 0x7f36d4bfd000, 0x7f36d4ee2000,
  710. 0x7f36d4ee2000, 0x7f36d4f04000,
  711. 0x7f36d4f04000, 0x7f36d504c000,
  712. 0x7f36d504c000, 0x7f36d5098000,
  713. 0x7f36d5098000, 0x7f36d5099000,
  714. 0x7f36d5099000, 0x7f36d509d000,
  715. 0x7f36d509d000, 0x7f36d509f000,
  716. 0x7f36d509f000, 0x7f36d50a5000,
  717. 0x7f36d50b9000, 0x7f36d50db000,
  718. 0x7f36d50db000, 0x7f36d50dc000,
  719. 0x7f36d50dc000, 0x7f36d50fa000,
  720. 0x7f36d50fa000, 0x7f36d5102000,
  721. 0x7f36d5102000, 0x7f36d5103000,
  722. 0x7f36d5103000, 0x7f36d5104000,
  723. 0x7f36d5104000, 0x7f36d5105000,
  724. 0x7fff5876b000, 0x7fff5878d000,
  725. 0x7fff5878e000, 0x7fff58791000,
  726. 0x7fff58791000, 0x7fff58793000,
  727. };
  728. static const unsigned long holes[] = {
  729. /* Start of hole, end of hole, size of hole (+1) */
  730. 0x565234afb000, 0x565234afc000, 0x1000,
  731. 0x565234afe000, 0x565235def000, 0x12F1000,
  732. 0x565235e10000, 0x7f36d4bfd000, 0x28E49EDED000,
  733. };
  734. /*
  735. * req_range consists of 4 values.
  736. * 1. min index
  737. * 2. max index
  738. * 3. size
  739. * 4. number that should be returned.
  740. * 5. return value
  741. */
  742. static const unsigned long req_range[] = {
  743. 0x565234af9000, /* Min */
  744. 0x7fff58791000, /* Max */
  745. 0x1000, /* Size */
  746. 0x565234afb000, /* First hole in our data of size 1000. */
  747. 0, /* Return value success. */
  748. 0x0, /* Min */
  749. 0x7fff58791000, /* Max */
  750. 0x1F00, /* Size */
  751. 0x0, /* First hole in our data of size 2000. */
  752. 0, /* Return value success. */
  753. /* Test ascend. */
  754. 34148797436 << 12, /* Min */
  755. 0x7fff587AF000, /* Max */
  756. 0x3000, /* Size */
  757. 34148798629 << 12, /* Expected location */
  758. 0, /* Return value success. */
  759. /* Test failing. */
  760. 34148798623 << 12, /* Min */
  761. 34148798683 << 12, /* Max */
  762. 0x15000, /* Size */
  763. 0, /* Expected location */
  764. -EBUSY, /* Return value failed. */
  765. /* Test filling entire gap. */
  766. 34148798623 << 12, /* Min */
  767. 0x7fff587AF000, /* Max */
  768. 0x10000, /* Size */
  769. 34148798632 << 12, /* Expected location */
  770. 0, /* Return value success. */
  771. /* Test walking off the end of root. */
  772. 0, /* Min */
  773. -1, /* Max */
  774. -1, /* Size */
  775. 0, /* Expected location */
  776. -EBUSY, /* Return value failure. */
  777. /* Test looking for too large a hole across entire range. */
  778. 0, /* Min */
  779. -1, /* Max */
  780. 4503599618982063UL << 12, /* Size */
  781. 34359052178 << 12, /* Expected location */
  782. -EBUSY, /* Return failure. */
  783. /* Test a single entry */
  784. 34148798648 << 12, /* Min */
  785. 34148798648 << 12, /* Max */
  786. 4096, /* Size of 1 */
  787. 34148798648 << 12, /* Location is the same as min/max */
  788. 0, /* Success */
  789. };
  790. int i, range_count = ARRAY_SIZE(range);
  791. int req_range_count = ARRAY_SIZE(req_range);
  792. unsigned long min = 0x565234af2000;
  793. MA_STATE(mas, mt, 0, 0);
  794. mtree_store_range(mt, MTREE_ALLOC_MAX, ULONG_MAX, XA_ZERO_ENTRY,
  795. GFP_KERNEL);
  796. for (i = 0; i < range_count; i += 2) {
  797. #define DEBUG_ALLOC_RANGE 0
  798. #if DEBUG_ALLOC_RANGE
  799. pr_debug("\tInsert %lu-%lu\n", range[i] >> 12,
  800. (range[i + 1] >> 12) - 1);
  801. mt_dump(mt, mt_dump_hex);
  802. #endif
  803. check_insert_range(mt, range[i] >> 12, (range[i + 1] >> 12) - 1,
  804. xa_mk_value(range[i] >> 12), 0);
  805. mt_validate(mt);
  806. }
  807. mas_lock(&mas);
  808. for (i = 0; i < ARRAY_SIZE(holes); i += 3) {
  809. #if DEBUG_ALLOC_RANGE
  810. pr_debug("\tGet empty %lu-%lu size %lu (%lx-%lx)\n", min >> 12,
  811. holes[i+1] >> 12, holes[i+2] >> 12,
  812. min, holes[i+1]);
  813. #endif
  814. MT_BUG_ON(mt, mas_empty_area(&mas, min >> 12,
  815. holes[i+1] >> 12,
  816. holes[i+2] >> 12));
  817. MT_BUG_ON(mt, mas.index != holes[i] >> 12);
  818. min = holes[i+1];
  819. mas_reset(&mas);
  820. }
  821. mas_unlock(&mas);
  822. for (i = 0; i < req_range_count; i += 5) {
  823. #if DEBUG_ALLOC_RANGE
  824. pr_debug("\tTest %d: %lu-%lu size %lu expected %lu (%lu-%lu)\n",
  825. i/5, req_range[i] >> 12, req_range[i + 1] >> 12,
  826. req_range[i + 2] >> 12, req_range[i + 3] >> 12,
  827. req_range[i], req_range[i+1]);
  828. #endif
  829. check_mtree_alloc_range(mt,
  830. req_range[i] >> 12, /* start */
  831. req_range[i+1] >> 12, /* end */
  832. req_range[i+2] >> 12, /* size */
  833. req_range[i+3] >> 12, /* expected address */
  834. req_range[i+4], /* expected return */
  835. xa_mk_value(req_range[i] >> 12)); /* pointer */
  836. mt_validate(mt);
  837. #if DEBUG_ALLOC_RANGE
  838. mt_dump(mt, mt_dump_hex);
  839. #endif
  840. }
  841. mtree_destroy(mt);
  842. }
  843. #endif
  844. static noinline void __init check_ranges(struct maple_tree *mt)
  845. {
  846. int i, val, val2;
  847. static const unsigned long r[] = {
  848. 10, 15,
  849. 20, 25,
  850. 17, 22, /* Overlaps previous range. */
  851. 9, 1000, /* Huge. */
  852. 100, 200,
  853. 45, 168,
  854. 118, 128,
  855. };
  856. MT_BUG_ON(mt, !mtree_empty(mt));
  857. check_insert_range(mt, r[0], r[1], xa_mk_value(r[0]), 0);
  858. check_insert_range(mt, r[2], r[3], xa_mk_value(r[2]), 0);
  859. check_insert_range(mt, r[4], r[5], xa_mk_value(r[4]), -EEXIST);
  860. MT_BUG_ON(mt, !mt_height(mt));
  861. /* Store */
  862. check_store_range(mt, r[4], r[5], xa_mk_value(r[4]), 0);
  863. check_store_range(mt, r[6], r[7], xa_mk_value(r[6]), 0);
  864. check_store_range(mt, r[8], r[9], xa_mk_value(r[8]), 0);
  865. MT_BUG_ON(mt, !mt_height(mt));
  866. mtree_destroy(mt);
  867. MT_BUG_ON(mt, mt_height(mt));
  868. check_seq(mt, 50, false);
  869. mt_set_non_kernel(4);
  870. check_store_range(mt, 5, 47, xa_mk_value(47), 0);
  871. MT_BUG_ON(mt, !mt_height(mt));
  872. mtree_destroy(mt);
  873. /* Create tree of 1-100 */
  874. check_seq(mt, 100, false);
  875. /* Store 45-168 */
  876. mt_set_non_kernel(10);
  877. check_store_range(mt, r[10], r[11], xa_mk_value(r[10]), 0);
  878. MT_BUG_ON(mt, !mt_height(mt));
  879. mtree_destroy(mt);
  880. /* Create tree of 1-200 */
  881. check_seq(mt, 200, false);
  882. /* Store 45-168 */
  883. check_store_range(mt, r[10], r[11], xa_mk_value(r[10]), 0);
  884. MT_BUG_ON(mt, !mt_height(mt));
  885. mtree_destroy(mt);
  886. check_seq(mt, 30, false);
  887. check_store_range(mt, 6, 18, xa_mk_value(6), 0);
  888. MT_BUG_ON(mt, !mt_height(mt));
  889. mtree_destroy(mt);
  890. /* Overwrite across multiple levels. */
  891. /* Create tree of 1-400 */
  892. check_seq(mt, 400, false);
  893. mt_set_non_kernel(50);
  894. /* Store 118-128 */
  895. check_store_range(mt, r[12], r[13], xa_mk_value(r[12]), 0);
  896. mt_set_non_kernel(50);
  897. mtree_test_erase(mt, 140);
  898. mtree_test_erase(mt, 141);
  899. mtree_test_erase(mt, 142);
  900. mtree_test_erase(mt, 143);
  901. mtree_test_erase(mt, 130);
  902. mtree_test_erase(mt, 131);
  903. mtree_test_erase(mt, 132);
  904. mtree_test_erase(mt, 133);
  905. mtree_test_erase(mt, 134);
  906. mtree_test_erase(mt, 135);
  907. check_load(mt, r[12], xa_mk_value(r[12]));
  908. check_load(mt, r[13], xa_mk_value(r[12]));
  909. check_load(mt, r[13] - 1, xa_mk_value(r[12]));
  910. check_load(mt, r[13] + 1, xa_mk_value(r[13] + 1));
  911. check_load(mt, 135, NULL);
  912. check_load(mt, 140, NULL);
  913. mt_set_non_kernel(0);
  914. MT_BUG_ON(mt, !mt_height(mt));
  915. mtree_destroy(mt);
  916. /* Overwrite multiple levels at the end of the tree (slot 7) */
  917. mt_set_non_kernel(50);
  918. check_seq(mt, 400, false);
  919. check_store_range(mt, 353, 361, xa_mk_value(353), 0);
  920. check_store_range(mt, 347, 352, xa_mk_value(347), 0);
  921. check_load(mt, 346, xa_mk_value(346));
  922. for (i = 347; i <= 352; i++)
  923. check_load(mt, i, xa_mk_value(347));
  924. for (i = 353; i <= 361; i++)
  925. check_load(mt, i, xa_mk_value(353));
  926. check_load(mt, 362, xa_mk_value(362));
  927. mt_set_non_kernel(0);
  928. MT_BUG_ON(mt, !mt_height(mt));
  929. mtree_destroy(mt);
  930. mt_set_non_kernel(50);
  931. check_seq(mt, 400, false);
  932. check_store_range(mt, 352, 364, NULL, 0);
  933. check_store_range(mt, 351, 363, xa_mk_value(352), 0);
  934. check_load(mt, 350, xa_mk_value(350));
  935. check_load(mt, 351, xa_mk_value(352));
  936. for (i = 352; i <= 363; i++)
  937. check_load(mt, i, xa_mk_value(352));
  938. check_load(mt, 364, NULL);
  939. check_load(mt, 365, xa_mk_value(365));
  940. mt_set_non_kernel(0);
  941. MT_BUG_ON(mt, !mt_height(mt));
  942. mtree_destroy(mt);
  943. mt_set_non_kernel(5);
  944. check_seq(mt, 400, false);
  945. check_store_range(mt, 352, 364, NULL, 0);
  946. check_store_range(mt, 351, 364, xa_mk_value(352), 0);
  947. check_load(mt, 350, xa_mk_value(350));
  948. check_load(mt, 351, xa_mk_value(352));
  949. for (i = 352; i <= 364; i++)
  950. check_load(mt, i, xa_mk_value(352));
  951. check_load(mt, 365, xa_mk_value(365));
  952. mt_set_non_kernel(0);
  953. MT_BUG_ON(mt, !mt_height(mt));
  954. mtree_destroy(mt);
  955. mt_set_non_kernel(50);
  956. check_seq(mt, 400, false);
  957. check_store_range(mt, 362, 367, xa_mk_value(362), 0);
  958. check_store_range(mt, 353, 361, xa_mk_value(353), 0);
  959. mt_set_non_kernel(0);
  960. mt_validate(mt);
  961. MT_BUG_ON(mt, !mt_height(mt));
  962. mtree_destroy(mt);
  963. /*
  964. * Interesting cases:
  965. * 1. Overwrite the end of a node and end in the first entry of the next
  966. * node.
  967. * 2. Split a single range
  968. * 3. Overwrite the start of a range
  969. * 4. Overwrite the end of a range
  970. * 5. Overwrite the entire range
  971. * 6. Overwrite a range that causes multiple parent nodes to be
  972. * combined
  973. * 7. Overwrite a range that causes multiple parent nodes and part of
  974. * root to be combined
  975. * 8. Overwrite the whole tree
  976. * 9. Try to overwrite the zero entry of an alloc tree.
  977. * 10. Write a range larger than a nodes current pivot
  978. */
  979. mt_set_non_kernel(50);
  980. for (i = 0; i <= 500; i++) {
  981. val = i*5;
  982. val2 = (i+1)*5;
  983. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  984. }
  985. check_store_range(mt, 2400, 2400, xa_mk_value(2400), 0);
  986. check_store_range(mt, 2411, 2411, xa_mk_value(2411), 0);
  987. check_store_range(mt, 2412, 2412, xa_mk_value(2412), 0);
  988. check_store_range(mt, 2396, 2400, xa_mk_value(4052020), 0);
  989. check_store_range(mt, 2402, 2402, xa_mk_value(2402), 0);
  990. mtree_destroy(mt);
  991. mt_set_non_kernel(0);
  992. mt_set_non_kernel(50);
  993. for (i = 0; i <= 500; i++) {
  994. val = i*5;
  995. val2 = (i+1)*5;
  996. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  997. }
  998. check_store_range(mt, 2422, 2422, xa_mk_value(2422), 0);
  999. check_store_range(mt, 2424, 2424, xa_mk_value(2424), 0);
  1000. check_store_range(mt, 2425, 2425, xa_mk_value(2), 0);
  1001. check_store_range(mt, 2460, 2470, NULL, 0);
  1002. check_store_range(mt, 2435, 2460, xa_mk_value(2435), 0);
  1003. check_store_range(mt, 2461, 2470, xa_mk_value(2461), 0);
  1004. mt_set_non_kernel(0);
  1005. MT_BUG_ON(mt, !mt_height(mt));
  1006. mtree_destroy(mt);
  1007. /* Check in-place modifications */
  1008. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1009. /* Append to the start of last range */
  1010. mt_set_non_kernel(50);
  1011. for (i = 0; i <= 500; i++) {
  1012. val = i * 5 + 1;
  1013. val2 = val + 4;
  1014. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1015. }
  1016. /* Append to the last range without touching any boundaries */
  1017. for (i = 0; i < 10; i++) {
  1018. val = val2 + 5;
  1019. val2 = val + 4;
  1020. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1021. }
  1022. /* Append to the end of last range */
  1023. val = val2;
  1024. for (i = 0; i < 10; i++) {
  1025. val += 5;
  1026. MT_BUG_ON(mt, mtree_test_store_range(mt, val, ULONG_MAX,
  1027. xa_mk_value(val)) != 0);
  1028. }
  1029. /* Overwriting the range and over a part of the next range */
  1030. for (i = 10; i < 30; i += 2) {
  1031. val = i * 5 + 1;
  1032. val2 = val + 5;
  1033. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1034. }
  1035. /* Overwriting a part of the range and over the next range */
  1036. for (i = 50; i < 70; i += 2) {
  1037. val2 = i * 5;
  1038. val = val2 - 5;
  1039. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1040. }
  1041. /*
  1042. * Expand the range, only partially overwriting the previous and
  1043. * next ranges
  1044. */
  1045. for (i = 100; i < 130; i += 3) {
  1046. val = i * 5 - 5;
  1047. val2 = i * 5 + 1;
  1048. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1049. }
  1050. /*
  1051. * Expand the range, only partially overwriting the previous and
  1052. * next ranges, in RCU mode
  1053. */
  1054. mt_set_in_rcu(mt);
  1055. for (i = 150; i < 180; i += 3) {
  1056. val = i * 5 - 5;
  1057. val2 = i * 5 + 1;
  1058. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1059. }
  1060. MT_BUG_ON(mt, !mt_height(mt));
  1061. mt_validate(mt);
  1062. mt_set_non_kernel(0);
  1063. mtree_destroy(mt);
  1064. /* Test rebalance gaps */
  1065. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1066. mt_set_non_kernel(50);
  1067. for (i = 0; i <= 50; i++) {
  1068. val = i*10;
  1069. val2 = (i+1)*10;
  1070. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1071. }
  1072. check_store_range(mt, 161, 161, xa_mk_value(161), 0);
  1073. check_store_range(mt, 162, 162, xa_mk_value(162), 0);
  1074. check_store_range(mt, 163, 163, xa_mk_value(163), 0);
  1075. check_store_range(mt, 240, 249, NULL, 0);
  1076. mtree_erase(mt, 200);
  1077. mtree_erase(mt, 210);
  1078. mtree_erase(mt, 220);
  1079. mtree_erase(mt, 230);
  1080. mt_set_non_kernel(0);
  1081. MT_BUG_ON(mt, !mt_height(mt));
  1082. mtree_destroy(mt);
  1083. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1084. for (i = 0; i <= 500; i++) {
  1085. val = i*10;
  1086. val2 = (i+1)*10;
  1087. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1088. }
  1089. check_store_range(mt, 4600, 4959, xa_mk_value(1), 0);
  1090. mt_validate(mt);
  1091. MT_BUG_ON(mt, !mt_height(mt));
  1092. mtree_destroy(mt);
  1093. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1094. for (i = 0; i <= 500; i++) {
  1095. val = i*10;
  1096. val2 = (i+1)*10;
  1097. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1098. }
  1099. check_store_range(mt, 4811, 4811, xa_mk_value(4811), 0);
  1100. check_store_range(mt, 4812, 4812, xa_mk_value(4812), 0);
  1101. check_store_range(mt, 4861, 4861, xa_mk_value(4861), 0);
  1102. check_store_range(mt, 4862, 4862, xa_mk_value(4862), 0);
  1103. check_store_range(mt, 4842, 4849, NULL, 0);
  1104. mt_validate(mt);
  1105. MT_BUG_ON(mt, !mt_height(mt));
  1106. mtree_destroy(mt);
  1107. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1108. for (i = 0; i <= 1300; i++) {
  1109. val = i*10;
  1110. val2 = (i+1)*10;
  1111. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1112. MT_BUG_ON(mt, mt_height(mt) >= 4);
  1113. }
  1114. /* Cause a 3 child split all the way up the tree. */
  1115. for (i = 5; i < 215; i += 10)
  1116. check_store_range(mt, 11450 + i, 11450 + i + 1, NULL, 0);
  1117. for (i = 5; i < 65; i += 10)
  1118. check_store_range(mt, 11770 + i, 11770 + i + 1, NULL, 0);
  1119. MT_BUG_ON(mt, mt_height(mt) >= 4);
  1120. for (i = 5; i < 45; i += 10)
  1121. check_store_range(mt, 11700 + i, 11700 + i + 1, NULL, 0);
  1122. if (!MAPLE_32BIT)
  1123. MT_BUG_ON(mt, mt_height(mt) < 4);
  1124. mtree_destroy(mt);
  1125. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1126. for (i = 0; i <= 1200; i++) {
  1127. val = i*10;
  1128. val2 = (i+1)*10;
  1129. check_store_range(mt, val, val2, xa_mk_value(val), 0);
  1130. MT_BUG_ON(mt, mt_height(mt) >= 4);
  1131. }
  1132. /* Fill parents and leaves before split. */
  1133. for (i = 5; i < 455; i += 10)
  1134. check_store_range(mt, 7800 + i, 7800 + i + 1, NULL, 0);
  1135. for (i = 1; i < 16; i++)
  1136. check_store_range(mt, 8185 + i, 8185 + i + 1,
  1137. xa_mk_value(8185+i), 0);
  1138. MT_BUG_ON(mt, mt_height(mt) >= 4);
  1139. /* triple split across multiple levels. */
  1140. check_store_range(mt, 8184, 8184, xa_mk_value(8184), 0);
  1141. if (!MAPLE_32BIT)
  1142. MT_BUG_ON(mt, mt_height(mt) != 4);
  1143. }
  1144. static noinline void __init check_next_entry(struct maple_tree *mt)
  1145. {
  1146. void *entry = NULL;
  1147. unsigned long limit = 30, i = 0;
  1148. MA_STATE(mas, mt, i, i);
  1149. MT_BUG_ON(mt, !mtree_empty(mt));
  1150. check_seq(mt, limit, false);
  1151. rcu_read_lock();
  1152. /* Check the first one and get ma_state in the correct state. */
  1153. MT_BUG_ON(mt, mas_walk(&mas) != xa_mk_value(i++));
  1154. for ( ; i <= limit + 1; i++) {
  1155. entry = mas_next(&mas, limit);
  1156. if (i > limit)
  1157. MT_BUG_ON(mt, entry != NULL);
  1158. else
  1159. MT_BUG_ON(mt, xa_mk_value(i) != entry);
  1160. }
  1161. rcu_read_unlock();
  1162. mtree_destroy(mt);
  1163. }
  1164. static noinline void __init check_prev_entry(struct maple_tree *mt)
  1165. {
  1166. unsigned long index = 16;
  1167. void *value;
  1168. int i;
  1169. MA_STATE(mas, mt, index, index);
  1170. MT_BUG_ON(mt, !mtree_empty(mt));
  1171. check_seq(mt, 30, false);
  1172. rcu_read_lock();
  1173. value = mas_find(&mas, ULONG_MAX);
  1174. MT_BUG_ON(mt, value != xa_mk_value(index));
  1175. value = mas_prev(&mas, 0);
  1176. MT_BUG_ON(mt, value != xa_mk_value(index - 1));
  1177. rcu_read_unlock();
  1178. mtree_destroy(mt);
  1179. /* Check limits on prev */
  1180. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1181. mas_lock(&mas);
  1182. for (i = 0; i <= index; i++) {
  1183. mas_set_range(&mas, i*10, i*10+5);
  1184. mas_store_gfp(&mas, xa_mk_value(i), GFP_KERNEL);
  1185. }
  1186. mas_set(&mas, 20);
  1187. value = mas_walk(&mas);
  1188. MT_BUG_ON(mt, value != xa_mk_value(2));
  1189. value = mas_prev(&mas, 19);
  1190. MT_BUG_ON(mt, value != NULL);
  1191. mas_set(&mas, 80);
  1192. value = mas_walk(&mas);
  1193. MT_BUG_ON(mt, value != xa_mk_value(8));
  1194. value = mas_prev(&mas, 76);
  1195. MT_BUG_ON(mt, value != NULL);
  1196. mas_unlock(&mas);
  1197. }
  1198. static noinline void __init check_store_null(struct maple_tree *mt)
  1199. {
  1200. MA_STATE(mas, mt, 0, ULONG_MAX);
  1201. /*
  1202. * Store NULL at range [0, ULONG_MAX] to an empty tree should result
  1203. * in an empty tree
  1204. */
  1205. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1206. mas_lock(&mas);
  1207. mas_store_gfp(&mas, NULL, GFP_KERNEL);
  1208. MT_BUG_ON(mt, !mtree_empty(mt));
  1209. mas_unlock(&mas);
  1210. mtree_destroy(mt);
  1211. /*
  1212. * Store NULL at any range to an empty tree should result in an empty
  1213. * tree
  1214. */
  1215. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1216. mas_lock(&mas);
  1217. mas_set_range(&mas, 3, 10);
  1218. mas_store_gfp(&mas, NULL, GFP_KERNEL);
  1219. MT_BUG_ON(mt, !mtree_empty(mt));
  1220. mas_unlock(&mas);
  1221. mtree_destroy(mt);
  1222. /*
  1223. * Store NULL at range [0, ULONG_MAX] to a single entry tree should
  1224. * result in an empty tree
  1225. */
  1226. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1227. mas_lock(&mas);
  1228. mas_set(&mas, 0);
  1229. mas_store_gfp(&mas, &mas, GFP_KERNEL);
  1230. mas_set_range(&mas, 0, ULONG_MAX);
  1231. mas_store_gfp(&mas, NULL, GFP_KERNEL);
  1232. MT_BUG_ON(mt, !mtree_empty(mt));
  1233. mas_unlock(&mas);
  1234. mtree_destroy(mt);
  1235. /*
  1236. * Store NULL at range [0, n] to a single entry tree should
  1237. * result in an empty tree
  1238. */
  1239. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1240. mas_lock(&mas);
  1241. mas_set(&mas, 0);
  1242. mas_store_gfp(&mas, &mas, GFP_KERNEL);
  1243. mas_set_range(&mas, 0, 5);
  1244. mas_store_gfp(&mas, NULL, GFP_KERNEL);
  1245. MT_BUG_ON(mt, !mtree_empty(mt));
  1246. mas_unlock(&mas);
  1247. mtree_destroy(mt);
  1248. /*
  1249. * Store NULL at range [m, n] where m > 0 to a single entry tree
  1250. * should still be a single entry tree
  1251. */
  1252. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1253. mas_lock(&mas);
  1254. mas_set(&mas, 0);
  1255. mas_store_gfp(&mas, &mas, GFP_KERNEL);
  1256. mas_set_range(&mas, 2, 5);
  1257. mas_store_gfp(&mas, NULL, GFP_KERNEL);
  1258. MT_BUG_ON(mt, mtree_empty(mt));
  1259. // MT_BUG_ON(mt, xa_is_node(mas_root(&mas)));
  1260. mas_unlock(&mas);
  1261. mtree_destroy(mt);
  1262. /*
  1263. * Store NULL at range [0, ULONG_MAX] to a tree with node should
  1264. * result in an empty tree
  1265. */
  1266. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1267. mas_lock(&mas);
  1268. mas_set_range(&mas, 1, 3);
  1269. mas_store_gfp(&mas, &mas, GFP_KERNEL);
  1270. // MT_BUG_ON(mt, !xa_is_node(mas_root(&mas)));
  1271. mas_set_range(&mas, 0, ULONG_MAX);
  1272. mas_store_gfp(&mas, NULL, GFP_KERNEL);
  1273. MT_BUG_ON(mt, !mtree_empty(mt));
  1274. mas_unlock(&mas);
  1275. mtree_destroy(mt);
  1276. }
  1277. static noinline void __init check_root_expand(struct maple_tree *mt)
  1278. {
  1279. MA_STATE(mas, mt, 0, 0);
  1280. void *ptr;
  1281. mas_lock(&mas);
  1282. mas_set(&mas, 3);
  1283. ptr = mas_walk(&mas);
  1284. MT_BUG_ON(mt, mas.index != 0);
  1285. MT_BUG_ON(mt, ptr != NULL);
  1286. MT_BUG_ON(mt, mas.index != 0);
  1287. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  1288. ptr = &check_prev_entry;
  1289. mas_set(&mas, 1);
  1290. mas_store_gfp(&mas, ptr, GFP_KERNEL);
  1291. mas_set(&mas, 0);
  1292. ptr = mas_walk(&mas);
  1293. MT_BUG_ON(mt, ptr != NULL);
  1294. mas_set(&mas, 1);
  1295. ptr = mas_walk(&mas);
  1296. MT_BUG_ON(mt, ptr != &check_prev_entry);
  1297. mas_set(&mas, 2);
  1298. ptr = mas_walk(&mas);
  1299. MT_BUG_ON(mt, ptr != NULL);
  1300. mas_unlock(&mas);
  1301. mtree_destroy(mt);
  1302. mt_init_flags(mt, 0);
  1303. mas_lock(&mas);
  1304. mas_set(&mas, 0);
  1305. ptr = &check_prev_entry;
  1306. mas_store_gfp(&mas, ptr, GFP_KERNEL);
  1307. mas_set(&mas, 5);
  1308. ptr = mas_walk(&mas);
  1309. MT_BUG_ON(mt, ptr != NULL);
  1310. MT_BUG_ON(mt, mas.index != 1);
  1311. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  1312. mas_set_range(&mas, 0, 100);
  1313. ptr = mas_walk(&mas);
  1314. MT_BUG_ON(mt, ptr != &check_prev_entry);
  1315. MT_BUG_ON(mt, mas.last != 0);
  1316. mas_unlock(&mas);
  1317. mtree_destroy(mt);
  1318. mt_init_flags(mt, 0);
  1319. mas_lock(&mas);
  1320. mas_set(&mas, 0);
  1321. ptr = (void *)((unsigned long) check_prev_entry | 1UL);
  1322. mas_store_gfp(&mas, ptr, GFP_KERNEL);
  1323. ptr = mas_next(&mas, ULONG_MAX);
  1324. MT_BUG_ON(mt, ptr != NULL);
  1325. MT_BUG_ON(mt, (mas.index != 1) && (mas.last != ULONG_MAX));
  1326. mas_set(&mas, 1);
  1327. ptr = mas_prev(&mas, 0);
  1328. MT_BUG_ON(mt, (mas.index != 0) && (mas.last != 0));
  1329. MT_BUG_ON(mt, ptr != (void *)((unsigned long) check_prev_entry | 1UL));
  1330. mas_unlock(&mas);
  1331. mtree_destroy(mt);
  1332. mt_init_flags(mt, 0);
  1333. mas_lock(&mas);
  1334. mas_set(&mas, 0);
  1335. ptr = (void *)((unsigned long) check_prev_entry | 2UL);
  1336. mas_store_gfp(&mas, ptr, GFP_KERNEL);
  1337. ptr = mas_next(&mas, ULONG_MAX);
  1338. MT_BUG_ON(mt, ptr != NULL);
  1339. MT_BUG_ON(mt, (mas.index != ULONG_MAX) && (mas.last != ULONG_MAX));
  1340. mas_set(&mas, 1);
  1341. ptr = mas_prev(&mas, 0);
  1342. MT_BUG_ON(mt, (mas.index != 0) && (mas.last != 0));
  1343. MT_BUG_ON(mt, ptr != (void *)((unsigned long) check_prev_entry | 2UL));
  1344. mas_unlock(&mas);
  1345. }
  1346. static noinline void __init check_deficient_node(struct maple_tree *mt)
  1347. {
  1348. MA_STATE(mas, mt, 0, 0);
  1349. int count;
  1350. mas_lock(&mas);
  1351. for (count = 0; count < 10; count++) {
  1352. mas_set(&mas, count);
  1353. mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL);
  1354. }
  1355. for (count = 20; count < 39; count++) {
  1356. mas_set(&mas, count);
  1357. mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL);
  1358. }
  1359. for (count = 10; count < 12; count++) {
  1360. mas_set(&mas, count);
  1361. mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL);
  1362. }
  1363. mas_unlock(&mas);
  1364. mt_validate(mt);
  1365. }
  1366. static noinline void __init check_gap_combining(struct maple_tree *mt)
  1367. {
  1368. struct maple_enode *mn1, *mn2;
  1369. void *entry;
  1370. unsigned long singletons = 100;
  1371. static const unsigned long *seq100;
  1372. static const unsigned long seq100_64[] = {
  1373. /* 0-5 */
  1374. 74, 75, 76,
  1375. 50, 100, 2,
  1376. /* 6-12 */
  1377. 44, 45, 46, 43,
  1378. 20, 50, 3,
  1379. /* 13-20*/
  1380. 80, 81, 82,
  1381. 76, 2, 79, 85, 4,
  1382. };
  1383. static const unsigned long seq100_32[] = {
  1384. /* 0-5 */
  1385. 61, 62, 63,
  1386. 50, 100, 2,
  1387. /* 6-12 */
  1388. 31, 32, 33, 30,
  1389. 20, 50, 3,
  1390. /* 13-20*/
  1391. 80, 81, 82,
  1392. 76, 2, 79, 85, 4,
  1393. };
  1394. static const unsigned long seq2000[] = {
  1395. 1152, 1151,
  1396. 1100, 1200, 2,
  1397. };
  1398. static const unsigned long seq400[] = {
  1399. 286, 318,
  1400. 256, 260, 266, 270, 275, 280, 290, 398,
  1401. 286, 310,
  1402. };
  1403. unsigned long index;
  1404. MA_STATE(mas, mt, 0, 0);
  1405. if (MAPLE_32BIT)
  1406. seq100 = seq100_32;
  1407. else
  1408. seq100 = seq100_64;
  1409. index = seq100[0];
  1410. mas_set(&mas, index);
  1411. MT_BUG_ON(mt, !mtree_empty(mt));
  1412. check_seq(mt, singletons, false); /* create 100 singletons. */
  1413. mt_set_non_kernel(1);
  1414. mtree_test_erase(mt, seq100[2]);
  1415. check_load(mt, seq100[2], NULL);
  1416. mtree_test_erase(mt, seq100[1]);
  1417. check_load(mt, seq100[1], NULL);
  1418. rcu_read_lock();
  1419. entry = mas_find(&mas, ULONG_MAX);
  1420. MT_BUG_ON(mt, entry != xa_mk_value(index));
  1421. mn1 = mas.node;
  1422. mas_next(&mas, ULONG_MAX);
  1423. entry = mas_next(&mas, ULONG_MAX);
  1424. MT_BUG_ON(mt, entry != xa_mk_value(index + 4));
  1425. mn2 = mas.node;
  1426. MT_BUG_ON(mt, mn1 == mn2); /* test the test. */
  1427. /*
  1428. * At this point, there is a gap of 2 at index + 1 between seq100[3] and
  1429. * seq100[4]. Search for the gap.
  1430. */
  1431. mt_set_non_kernel(1);
  1432. mas_reset(&mas);
  1433. MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[3], seq100[4],
  1434. seq100[5]));
  1435. MT_BUG_ON(mt, mas.index != index + 1);
  1436. rcu_read_unlock();
  1437. mtree_test_erase(mt, seq100[6]);
  1438. check_load(mt, seq100[6], NULL);
  1439. mtree_test_erase(mt, seq100[7]);
  1440. check_load(mt, seq100[7], NULL);
  1441. mtree_test_erase(mt, seq100[8]);
  1442. index = seq100[9];
  1443. rcu_read_lock();
  1444. mas.index = index;
  1445. mas.last = index;
  1446. mas_reset(&mas);
  1447. entry = mas_find(&mas, ULONG_MAX);
  1448. MT_BUG_ON(mt, entry != xa_mk_value(index));
  1449. mn1 = mas.node;
  1450. entry = mas_next(&mas, ULONG_MAX);
  1451. MT_BUG_ON(mt, entry != xa_mk_value(index + 4));
  1452. mas_next(&mas, ULONG_MAX); /* go to the next entry. */
  1453. mn2 = mas.node;
  1454. MT_BUG_ON(mt, mn1 == mn2); /* test the next entry is in the next node. */
  1455. /*
  1456. * At this point, there is a gap of 3 at seq100[6]. Find it by
  1457. * searching 20 - 50 for size 3.
  1458. */
  1459. mas_reset(&mas);
  1460. MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[10], seq100[11],
  1461. seq100[12]));
  1462. MT_BUG_ON(mt, mas.index != seq100[6]);
  1463. rcu_read_unlock();
  1464. mt_set_non_kernel(1);
  1465. mtree_store(mt, seq100[13], NULL, GFP_KERNEL);
  1466. check_load(mt, seq100[13], NULL);
  1467. check_load(mt, seq100[14], xa_mk_value(seq100[14]));
  1468. mtree_store(mt, seq100[14], NULL, GFP_KERNEL);
  1469. check_load(mt, seq100[13], NULL);
  1470. check_load(mt, seq100[14], NULL);
  1471. mas_reset(&mas);
  1472. rcu_read_lock();
  1473. MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[16], seq100[15],
  1474. seq100[17]));
  1475. MT_BUG_ON(mt, mas.index != seq100[13]);
  1476. mt_validate(mt);
  1477. rcu_read_unlock();
  1478. /*
  1479. * *DEPRECATED: no retries anymore* Test retry entry in the start of a
  1480. * gap.
  1481. */
  1482. mt_set_non_kernel(2);
  1483. mtree_test_store_range(mt, seq100[18], seq100[14], NULL);
  1484. mtree_test_erase(mt, seq100[15]);
  1485. mas_reset(&mas);
  1486. rcu_read_lock();
  1487. MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq100[16], seq100[19],
  1488. seq100[20]));
  1489. rcu_read_unlock();
  1490. MT_BUG_ON(mt, mas.index != seq100[18]);
  1491. mt_validate(mt);
  1492. mtree_destroy(mt);
  1493. /* seq 2000 tests are for multi-level tree gaps */
  1494. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1495. check_seq(mt, 2000, false);
  1496. mt_set_non_kernel(1);
  1497. mtree_test_erase(mt, seq2000[0]);
  1498. mtree_test_erase(mt, seq2000[1]);
  1499. mt_set_non_kernel(2);
  1500. mas_reset(&mas);
  1501. rcu_read_lock();
  1502. MT_BUG_ON(mt, mas_empty_area_rev(&mas, seq2000[2], seq2000[3],
  1503. seq2000[4]));
  1504. MT_BUG_ON(mt, mas.index != seq2000[1]);
  1505. rcu_read_unlock();
  1506. mt_validate(mt);
  1507. mtree_destroy(mt);
  1508. /* seq 400 tests rebalancing over two levels. */
  1509. mt_set_non_kernel(99);
  1510. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1511. check_seq(mt, 400, false);
  1512. mtree_test_store_range(mt, seq400[0], seq400[1], NULL);
  1513. mt_set_non_kernel(0);
  1514. mtree_destroy(mt);
  1515. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  1516. check_seq(mt, 400, false);
  1517. mt_set_non_kernel(50);
  1518. mtree_test_store_range(mt, seq400[2], seq400[9],
  1519. xa_mk_value(seq400[2]));
  1520. mtree_test_store_range(mt, seq400[3], seq400[9],
  1521. xa_mk_value(seq400[3]));
  1522. mtree_test_store_range(mt, seq400[4], seq400[9],
  1523. xa_mk_value(seq400[4]));
  1524. mtree_test_store_range(mt, seq400[5], seq400[9],
  1525. xa_mk_value(seq400[5]));
  1526. mtree_test_store_range(mt, seq400[0], seq400[9],
  1527. xa_mk_value(seq400[0]));
  1528. mtree_test_store_range(mt, seq400[6], seq400[9],
  1529. xa_mk_value(seq400[6]));
  1530. mtree_test_store_range(mt, seq400[7], seq400[9],
  1531. xa_mk_value(seq400[7]));
  1532. mtree_test_store_range(mt, seq400[8], seq400[9],
  1533. xa_mk_value(seq400[8]));
  1534. mtree_test_store_range(mt, seq400[10], seq400[11],
  1535. xa_mk_value(seq400[10]));
  1536. mt_validate(mt);
  1537. mt_set_non_kernel(0);
  1538. mtree_destroy(mt);
  1539. }
  1540. static noinline void __init check_node_overwrite(struct maple_tree *mt)
  1541. {
  1542. int i, max = 4000;
  1543. for (i = 0; i < max; i++)
  1544. mtree_test_store_range(mt, i*100, i*100 + 50, xa_mk_value(i*100));
  1545. mtree_test_store_range(mt, 319951, 367950, NULL);
  1546. /*mt_dump(mt, mt_dump_dec); */
  1547. mt_validate(mt);
  1548. }
  1549. #if defined(BENCH_SLOT_STORE)
  1550. static noinline void __init bench_slot_store(struct maple_tree *mt)
  1551. {
  1552. int i, brk = 105, max = 1040, brk_start = 100, count = 20000000;
  1553. for (i = 0; i < max; i += 10)
  1554. mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL);
  1555. for (i = 0; i < count; i++) {
  1556. mtree_store_range(mt, brk, brk, NULL, GFP_KERNEL);
  1557. mtree_store_range(mt, brk_start, brk, xa_mk_value(brk),
  1558. GFP_KERNEL);
  1559. }
  1560. }
  1561. #endif
  1562. #if defined(BENCH_NODE_STORE)
  1563. static noinline void __init bench_node_store(struct maple_tree *mt)
  1564. {
  1565. int i, overwrite = 76, max = 240, count = 20000000;
  1566. for (i = 0; i < max; i += 10)
  1567. mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL);
  1568. for (i = 0; i < count; i++) {
  1569. mtree_store_range(mt, overwrite, overwrite + 15,
  1570. xa_mk_value(overwrite), GFP_KERNEL);
  1571. overwrite += 5;
  1572. if (overwrite >= 135)
  1573. overwrite = 76;
  1574. }
  1575. }
  1576. #endif
  1577. #if defined(BENCH_AWALK)
  1578. static noinline void __init bench_awalk(struct maple_tree *mt)
  1579. {
  1580. int i, max = 2500, count = 50000000;
  1581. MA_STATE(mas, mt, 1470, 1470);
  1582. for (i = 0; i < max; i += 10)
  1583. mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL);
  1584. mtree_store_range(mt, 1470, 1475, NULL, GFP_KERNEL);
  1585. for (i = 0; i < count; i++) {
  1586. mas_empty_area_rev(&mas, 0, 2000, 10);
  1587. mas_reset(&mas);
  1588. }
  1589. }
  1590. #endif
  1591. #if defined(BENCH_WALK)
  1592. static noinline void __init bench_walk(struct maple_tree *mt)
  1593. {
  1594. int i, max = 2500, count = 550000000;
  1595. MA_STATE(mas, mt, 1470, 1470);
  1596. for (i = 0; i < max; i += 10)
  1597. mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL);
  1598. for (i = 0; i < count; i++) {
  1599. mas_walk(&mas);
  1600. mas_reset(&mas);
  1601. }
  1602. }
  1603. #endif
  1604. #if defined(BENCH_LOAD)
  1605. static noinline void __init bench_load(struct maple_tree *mt)
  1606. {
  1607. int i, max = 2500, count = 550000000;
  1608. for (i = 0; i < max; i += 10)
  1609. mtree_store_range(mt, i, i + 5, xa_mk_value(i), GFP_KERNEL);
  1610. for (i = 0; i < count; i++)
  1611. mtree_load(mt, 1470);
  1612. }
  1613. #endif
  1614. #if defined(BENCH_MT_FOR_EACH)
  1615. static noinline void __init bench_mt_for_each(struct maple_tree *mt)
  1616. {
  1617. int i, count = 1000000;
  1618. unsigned long max = 2500, index = 0;
  1619. void *entry;
  1620. for (i = 0; i < max; i += 5)
  1621. mtree_store_range(mt, i, i + 4, xa_mk_value(i), GFP_KERNEL);
  1622. for (i = 0; i < count; i++) {
  1623. unsigned long j = 0;
  1624. mt_for_each(mt, entry, index, max) {
  1625. MT_BUG_ON(mt, entry != xa_mk_value(j));
  1626. j += 5;
  1627. }
  1628. index = 0;
  1629. }
  1630. }
  1631. #endif
  1632. #if defined(BENCH_MAS_FOR_EACH)
  1633. static noinline void __init bench_mas_for_each(struct maple_tree *mt)
  1634. {
  1635. int i, count = 1000000;
  1636. unsigned long max = 2500;
  1637. void *entry;
  1638. MA_STATE(mas, mt, 0, 0);
  1639. for (i = 0; i < max; i += 5) {
  1640. int gap = 4;
  1641. if (i % 30 == 0)
  1642. gap = 3;
  1643. mtree_store_range(mt, i, i + gap, xa_mk_value(i), GFP_KERNEL);
  1644. }
  1645. rcu_read_lock();
  1646. for (i = 0; i < count; i++) {
  1647. unsigned long j = 0;
  1648. mas_for_each(&mas, entry, max) {
  1649. MT_BUG_ON(mt, entry != xa_mk_value(j));
  1650. j += 5;
  1651. }
  1652. mas_set(&mas, 0);
  1653. }
  1654. rcu_read_unlock();
  1655. }
  1656. #endif
  1657. #if defined(BENCH_MAS_PREV)
  1658. static noinline void __init bench_mas_prev(struct maple_tree *mt)
  1659. {
  1660. int i, count = 1000000;
  1661. unsigned long max = 2500;
  1662. void *entry;
  1663. MA_STATE(mas, mt, 0, 0);
  1664. for (i = 0; i < max; i += 5) {
  1665. int gap = 4;
  1666. if (i % 30 == 0)
  1667. gap = 3;
  1668. mtree_store_range(mt, i, i + gap, xa_mk_value(i), GFP_KERNEL);
  1669. }
  1670. rcu_read_lock();
  1671. for (i = 0; i < count; i++) {
  1672. unsigned long j = 2495;
  1673. mas_set(&mas, ULONG_MAX);
  1674. while ((entry = mas_prev(&mas, 0)) != NULL) {
  1675. MT_BUG_ON(mt, entry != xa_mk_value(j));
  1676. j -= 5;
  1677. }
  1678. }
  1679. rcu_read_unlock();
  1680. }
  1681. #endif
  1682. /* check_forking - simulate the kernel forking sequence with the tree. */
  1683. static noinline void __init check_forking(void)
  1684. {
  1685. struct maple_tree mt, newmt;
  1686. int i, nr_entries = 134, ret;
  1687. void *val;
  1688. MA_STATE(mas, &mt, 0, 0);
  1689. MA_STATE(newmas, &newmt, 0, 0);
  1690. struct rw_semaphore mt_lock, newmt_lock;
  1691. init_rwsem(&mt_lock);
  1692. init_rwsem(&newmt_lock);
  1693. mt_init_flags(&mt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN);
  1694. mt_set_external_lock(&mt, &mt_lock);
  1695. mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN);
  1696. mt_set_external_lock(&newmt, &newmt_lock);
  1697. down_write(&mt_lock);
  1698. for (i = 0; i <= nr_entries; i++) {
  1699. mas_set_range(&mas, i*10, i*10 + 5);
  1700. mas_store_gfp(&mas, xa_mk_value(i), GFP_KERNEL);
  1701. }
  1702. down_write_nested(&newmt_lock, SINGLE_DEPTH_NESTING);
  1703. ret = __mt_dup(&mt, &newmt, GFP_KERNEL);
  1704. if (ret) {
  1705. pr_err("OOM!");
  1706. BUG_ON(1);
  1707. }
  1708. mas_set(&newmas, 0);
  1709. mas_for_each(&newmas, val, ULONG_MAX)
  1710. mas_store(&newmas, val);
  1711. mas_destroy(&newmas);
  1712. mas_destroy(&mas);
  1713. mt_validate(&newmt);
  1714. __mt_destroy(&newmt);
  1715. __mt_destroy(&mt);
  1716. up_write(&newmt_lock);
  1717. up_write(&mt_lock);
  1718. }
  1719. static noinline void __init check_iteration(struct maple_tree *mt)
  1720. {
  1721. int i, nr_entries = 125;
  1722. void *val;
  1723. MA_STATE(mas, mt, 0, 0);
  1724. for (i = 0; i <= nr_entries; i++)
  1725. mtree_store_range(mt, i * 10, i * 10 + 9,
  1726. xa_mk_value(i), GFP_KERNEL);
  1727. mt_set_non_kernel(99999);
  1728. i = 0;
  1729. mas_lock(&mas);
  1730. mas_for_each(&mas, val, 925) {
  1731. MT_BUG_ON(mt, mas.index != i * 10);
  1732. MT_BUG_ON(mt, mas.last != i * 10 + 9);
  1733. /* Overwrite end of entry 92 */
  1734. if (i == 92) {
  1735. mas.index = 925;
  1736. mas.last = 929;
  1737. mas_store(&mas, val);
  1738. }
  1739. i++;
  1740. }
  1741. /* Ensure mas_find() gets the next value */
  1742. val = mas_find(&mas, ULONG_MAX);
  1743. MT_BUG_ON(mt, val != xa_mk_value(i));
  1744. mas_set(&mas, 0);
  1745. i = 0;
  1746. mas_for_each(&mas, val, 785) {
  1747. MT_BUG_ON(mt, mas.index != i * 10);
  1748. MT_BUG_ON(mt, mas.last != i * 10 + 9);
  1749. /* Overwrite start of entry 78 */
  1750. if (i == 78) {
  1751. mas.index = 780;
  1752. mas.last = 785;
  1753. mas_store(&mas, val);
  1754. } else {
  1755. i++;
  1756. }
  1757. }
  1758. val = mas_find(&mas, ULONG_MAX);
  1759. MT_BUG_ON(mt, val != xa_mk_value(i));
  1760. mas_set(&mas, 0);
  1761. i = 0;
  1762. mas_for_each(&mas, val, 765) {
  1763. MT_BUG_ON(mt, mas.index != i * 10);
  1764. MT_BUG_ON(mt, mas.last != i * 10 + 9);
  1765. /* Overwrite end of entry 76 and advance to the end */
  1766. if (i == 76) {
  1767. mas.index = 760;
  1768. mas.last = 765;
  1769. mas_store(&mas, val);
  1770. }
  1771. i++;
  1772. }
  1773. /* Make sure the next find returns the one after 765, 766-769 */
  1774. val = mas_find(&mas, ULONG_MAX);
  1775. MT_BUG_ON(mt, val != xa_mk_value(76));
  1776. mas_unlock(&mas);
  1777. mas_destroy(&mas);
  1778. mt_set_non_kernel(0);
  1779. }
  1780. static noinline void __init check_mas_store_gfp(struct maple_tree *mt)
  1781. {
  1782. struct maple_tree newmt;
  1783. int i, nr_entries = 135;
  1784. void *val;
  1785. MA_STATE(mas, mt, 0, 0);
  1786. MA_STATE(newmas, mt, 0, 0);
  1787. for (i = 0; i <= nr_entries; i++)
  1788. mtree_store_range(mt, i*10, i*10 + 5,
  1789. xa_mk_value(i), GFP_KERNEL);
  1790. mt_set_non_kernel(99999);
  1791. mt_init_flags(&newmt, MT_FLAGS_ALLOC_RANGE);
  1792. newmas.tree = &newmt;
  1793. rcu_read_lock();
  1794. mas_lock(&newmas);
  1795. mas_reset(&newmas);
  1796. mas_set(&mas, 0);
  1797. mas_for_each(&mas, val, ULONG_MAX) {
  1798. newmas.index = mas.index;
  1799. newmas.last = mas.last;
  1800. mas_store_gfp(&newmas, val, GFP_KERNEL);
  1801. }
  1802. mas_unlock(&newmas);
  1803. rcu_read_unlock();
  1804. mt_validate(&newmt);
  1805. mt_set_non_kernel(0);
  1806. mtree_destroy(&newmt);
  1807. }
  1808. #if defined(BENCH_FORK)
  1809. static noinline void __init bench_forking(void)
  1810. {
  1811. struct maple_tree mt, newmt;
  1812. int i, nr_entries = 134, nr_fork = 80000, ret;
  1813. void *val;
  1814. MA_STATE(mas, &mt, 0, 0);
  1815. MA_STATE(newmas, &newmt, 0, 0);
  1816. struct rw_semaphore mt_lock, newmt_lock;
  1817. init_rwsem(&mt_lock);
  1818. init_rwsem(&newmt_lock);
  1819. mt_init_flags(&mt, MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN);
  1820. mt_set_external_lock(&mt, &mt_lock);
  1821. down_write(&mt_lock);
  1822. for (i = 0; i <= nr_entries; i++) {
  1823. mas_set_range(&mas, i*10, i*10 + 5);
  1824. mas_store_gfp(&mas, xa_mk_value(i), GFP_KERNEL);
  1825. }
  1826. for (i = 0; i < nr_fork; i++) {
  1827. mt_init_flags(&newmt,
  1828. MT_FLAGS_ALLOC_RANGE | MT_FLAGS_LOCK_EXTERN);
  1829. mt_set_external_lock(&newmt, &newmt_lock);
  1830. down_write_nested(&newmt_lock, SINGLE_DEPTH_NESTING);
  1831. ret = __mt_dup(&mt, &newmt, GFP_KERNEL);
  1832. if (ret) {
  1833. pr_err("OOM!");
  1834. BUG_ON(1);
  1835. }
  1836. mas_set(&newmas, 0);
  1837. mas_for_each(&newmas, val, ULONG_MAX)
  1838. mas_store(&newmas, val);
  1839. mas_destroy(&newmas);
  1840. mt_validate(&newmt);
  1841. __mt_destroy(&newmt);
  1842. up_write(&newmt_lock);
  1843. }
  1844. mas_destroy(&mas);
  1845. __mt_destroy(&mt);
  1846. up_write(&mt_lock);
  1847. }
  1848. #endif
  1849. static noinline void __init next_prev_test(struct maple_tree *mt)
  1850. {
  1851. int i, nr_entries;
  1852. void *val;
  1853. MA_STATE(mas, mt, 0, 0);
  1854. struct maple_enode *mn;
  1855. static const unsigned long *level2;
  1856. static const unsigned long level2_64[] = { 707, 1000, 710, 715, 720,
  1857. 725};
  1858. static const unsigned long level2_32[] = { 1747, 2000, 1750, 1755,
  1859. 1760, 1765};
  1860. unsigned long last_index;
  1861. if (MAPLE_32BIT) {
  1862. nr_entries = 500;
  1863. level2 = level2_32;
  1864. last_index = 0x138e;
  1865. } else {
  1866. nr_entries = 200;
  1867. level2 = level2_64;
  1868. last_index = 0x7d6;
  1869. }
  1870. for (i = 0; i <= nr_entries; i++)
  1871. mtree_store_range(mt, i*10, i*10 + 5,
  1872. xa_mk_value(i), GFP_KERNEL);
  1873. mas_lock(&mas);
  1874. for (i = 0; i <= nr_entries / 2; i++) {
  1875. mas_next(&mas, 1000);
  1876. if (mas_is_none(&mas))
  1877. break;
  1878. }
  1879. mas_reset(&mas);
  1880. mas_set(&mas, 0);
  1881. i = 0;
  1882. mas_for_each(&mas, val, 1000) {
  1883. i++;
  1884. }
  1885. mas_reset(&mas);
  1886. mas_set(&mas, 0);
  1887. i = 0;
  1888. mas_for_each(&mas, val, 1000) {
  1889. mas_pause(&mas);
  1890. i++;
  1891. }
  1892. /*
  1893. * 680 - 685 = 0x61a00001930c
  1894. * 686 - 689 = NULL;
  1895. * 690 - 695 = 0x61a00001930c
  1896. * Check simple next/prev
  1897. */
  1898. mas_set(&mas, 686);
  1899. val = mas_walk(&mas);
  1900. MT_BUG_ON(mt, val != NULL);
  1901. val = mas_next(&mas, 1000);
  1902. MT_BUG_ON(mt, val != xa_mk_value(690 / 10));
  1903. MT_BUG_ON(mt, mas.index != 690);
  1904. MT_BUG_ON(mt, mas.last != 695);
  1905. val = mas_prev(&mas, 0);
  1906. MT_BUG_ON(mt, val != xa_mk_value(680 / 10));
  1907. MT_BUG_ON(mt, mas.index != 680);
  1908. MT_BUG_ON(mt, mas.last != 685);
  1909. val = mas_next(&mas, 1000);
  1910. MT_BUG_ON(mt, val != xa_mk_value(690 / 10));
  1911. MT_BUG_ON(mt, mas.index != 690);
  1912. MT_BUG_ON(mt, mas.last != 695);
  1913. val = mas_next(&mas, 1000);
  1914. MT_BUG_ON(mt, val != xa_mk_value(700 / 10));
  1915. MT_BUG_ON(mt, mas.index != 700);
  1916. MT_BUG_ON(mt, mas.last != 705);
  1917. /* Check across node boundaries of the tree */
  1918. mas_set(&mas, 70);
  1919. val = mas_walk(&mas);
  1920. MT_BUG_ON(mt, val != xa_mk_value(70 / 10));
  1921. MT_BUG_ON(mt, mas.index != 70);
  1922. MT_BUG_ON(mt, mas.last != 75);
  1923. val = mas_next(&mas, 1000);
  1924. MT_BUG_ON(mt, val != xa_mk_value(80 / 10));
  1925. MT_BUG_ON(mt, mas.index != 80);
  1926. MT_BUG_ON(mt, mas.last != 85);
  1927. val = mas_prev(&mas, 70);
  1928. MT_BUG_ON(mt, val != xa_mk_value(70 / 10));
  1929. MT_BUG_ON(mt, mas.index != 70);
  1930. MT_BUG_ON(mt, mas.last != 75);
  1931. /* Check across two levels of the tree */
  1932. mas_reset(&mas);
  1933. mas_set(&mas, level2[0]);
  1934. val = mas_walk(&mas);
  1935. MT_BUG_ON(mt, val != NULL);
  1936. val = mas_next(&mas, level2[1]);
  1937. MT_BUG_ON(mt, val != xa_mk_value(level2[2] / 10));
  1938. MT_BUG_ON(mt, mas.index != level2[2]);
  1939. MT_BUG_ON(mt, mas.last != level2[3]);
  1940. mn = mas.node;
  1941. val = mas_next(&mas, level2[1]);
  1942. MT_BUG_ON(mt, val != xa_mk_value(level2[4] / 10));
  1943. MT_BUG_ON(mt, mas.index != level2[4]);
  1944. MT_BUG_ON(mt, mas.last != level2[5]);
  1945. MT_BUG_ON(mt, mn == mas.node);
  1946. val = mas_prev(&mas, 0);
  1947. MT_BUG_ON(mt, val != xa_mk_value(level2[2] / 10));
  1948. MT_BUG_ON(mt, mas.index != level2[2]);
  1949. MT_BUG_ON(mt, mas.last != level2[3]);
  1950. /* Check running off the end and back on */
  1951. mas_set(&mas, nr_entries * 10);
  1952. val = mas_walk(&mas);
  1953. MT_BUG_ON(mt, val != xa_mk_value(nr_entries));
  1954. MT_BUG_ON(mt, mas.index != (nr_entries * 10));
  1955. MT_BUG_ON(mt, mas.last != (nr_entries * 10 + 5));
  1956. val = mas_next(&mas, ULONG_MAX);
  1957. MT_BUG_ON(mt, val != NULL);
  1958. MT_BUG_ON(mt, mas.index != last_index);
  1959. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  1960. val = mas_prev(&mas, 0);
  1961. MT_BUG_ON(mt, val != xa_mk_value(nr_entries));
  1962. MT_BUG_ON(mt, mas.index != (nr_entries * 10));
  1963. MT_BUG_ON(mt, mas.last != (nr_entries * 10 + 5));
  1964. /* Check running off the start and back on */
  1965. mas_reset(&mas);
  1966. mas_set(&mas, 10);
  1967. val = mas_walk(&mas);
  1968. MT_BUG_ON(mt, val != xa_mk_value(1));
  1969. MT_BUG_ON(mt, mas.index != 10);
  1970. MT_BUG_ON(mt, mas.last != 15);
  1971. val = mas_prev(&mas, 0);
  1972. MT_BUG_ON(mt, val != xa_mk_value(0));
  1973. MT_BUG_ON(mt, mas.index != 0);
  1974. MT_BUG_ON(mt, mas.last != 5);
  1975. val = mas_prev(&mas, 0);
  1976. MT_BUG_ON(mt, val != NULL);
  1977. MT_BUG_ON(mt, mas.index != 0);
  1978. MT_BUG_ON(mt, mas.last != 5);
  1979. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  1980. mas.index = 0;
  1981. mas.last = 5;
  1982. mas_store(&mas, NULL);
  1983. mas_reset(&mas);
  1984. mas_set(&mas, 10);
  1985. mas_walk(&mas);
  1986. val = mas_prev(&mas, 0);
  1987. MT_BUG_ON(mt, val != NULL);
  1988. MT_BUG_ON(mt, mas.index != 0);
  1989. MT_BUG_ON(mt, mas.last != 9);
  1990. mas_unlock(&mas);
  1991. mtree_destroy(mt);
  1992. mt_init(mt);
  1993. mtree_store_range(mt, 0, 0, xa_mk_value(0), GFP_KERNEL);
  1994. mtree_store_range(mt, 5, 5, xa_mk_value(5), GFP_KERNEL);
  1995. rcu_read_lock();
  1996. mas_set(&mas, 5);
  1997. val = mas_prev(&mas, 4);
  1998. MT_BUG_ON(mt, val != NULL);
  1999. rcu_read_unlock();
  2000. }
  2001. /* Test spanning writes that require balancing right sibling or right cousin */
  2002. static noinline void __init check_spanning_relatives(struct maple_tree *mt)
  2003. {
  2004. unsigned long i, nr_entries = 1000;
  2005. for (i = 0; i <= nr_entries; i++)
  2006. mtree_store_range(mt, i*10, i*10 + 5,
  2007. xa_mk_value(i), GFP_KERNEL);
  2008. mtree_store_range(mt, 9365, 9955, NULL, GFP_KERNEL);
  2009. }
  2010. static noinline void __init check_fuzzer(struct maple_tree *mt)
  2011. {
  2012. /*
  2013. * 1. Causes a spanning rebalance of a single root node.
  2014. * Fixed by setting the correct limit in mast_cp_to_nodes() when the
  2015. * entire right side is consumed.
  2016. */
  2017. mtree_test_insert(mt, 88, (void *)0xb1);
  2018. mtree_test_insert(mt, 84, (void *)0xa9);
  2019. mtree_test_insert(mt, 2, (void *)0x5);
  2020. mtree_test_insert(mt, 4, (void *)0x9);
  2021. mtree_test_insert(mt, 14, (void *)0x1d);
  2022. mtree_test_insert(mt, 7, (void *)0xf);
  2023. mtree_test_insert(mt, 12, (void *)0x19);
  2024. mtree_test_insert(mt, 18, (void *)0x25);
  2025. mtree_test_store_range(mt, 8, 18, (void *)0x11);
  2026. mtree_destroy(mt);
  2027. /*
  2028. * 2. Cause a spanning rebalance of two nodes in root.
  2029. * Fixed by setting mast->r->max correctly.
  2030. */
  2031. mt_init_flags(mt, 0);
  2032. mtree_test_store(mt, 87, (void *)0xaf);
  2033. mtree_test_store(mt, 0, (void *)0x1);
  2034. mtree_test_load(mt, 4);
  2035. mtree_test_insert(mt, 4, (void *)0x9);
  2036. mtree_test_store(mt, 8, (void *)0x11);
  2037. mtree_test_store(mt, 44, (void *)0x59);
  2038. mtree_test_store(mt, 68, (void *)0x89);
  2039. mtree_test_store(mt, 2, (void *)0x5);
  2040. mtree_test_insert(mt, 43, (void *)0x57);
  2041. mtree_test_insert(mt, 24, (void *)0x31);
  2042. mtree_test_insert(mt, 844, (void *)0x699);
  2043. mtree_test_store(mt, 84, (void *)0xa9);
  2044. mtree_test_store(mt, 4, (void *)0x9);
  2045. mtree_test_erase(mt, 4);
  2046. mtree_test_load(mt, 5);
  2047. mtree_test_erase(mt, 0);
  2048. mtree_destroy(mt);
  2049. /*
  2050. * 3. Cause a node overflow on copy
  2051. * Fixed by using the correct check for node size in mas_wr_modify()
  2052. * Also discovered issue with metadata setting.
  2053. */
  2054. mt_init_flags(mt, 0);
  2055. mtree_test_store_range(mt, 0, ULONG_MAX, (void *)0x1);
  2056. mtree_test_store(mt, 4, (void *)0x9);
  2057. mtree_test_erase(mt, 5);
  2058. mtree_test_erase(mt, 0);
  2059. mtree_test_erase(mt, 4);
  2060. mtree_test_store(mt, 5, (void *)0xb);
  2061. mtree_test_erase(mt, 5);
  2062. mtree_test_store(mt, 5, (void *)0xb);
  2063. mtree_test_erase(mt, 5);
  2064. mtree_test_erase(mt, 4);
  2065. mtree_test_store(mt, 4, (void *)0x9);
  2066. mtree_test_store(mt, 444, (void *)0x379);
  2067. mtree_test_store(mt, 0, (void *)0x1);
  2068. mtree_test_load(mt, 0);
  2069. mtree_test_store(mt, 5, (void *)0xb);
  2070. mtree_test_erase(mt, 0);
  2071. mtree_destroy(mt);
  2072. /*
  2073. * 4. spanning store failure due to writing incorrect pivot value at
  2074. * last slot.
  2075. * Fixed by setting mast->r->max correctly in mast_cp_to_nodes()
  2076. *
  2077. */
  2078. mt_init_flags(mt, 0);
  2079. mtree_test_insert(mt, 261, (void *)0x20b);
  2080. mtree_test_store(mt, 516, (void *)0x409);
  2081. mtree_test_store(mt, 6, (void *)0xd);
  2082. mtree_test_insert(mt, 5, (void *)0xb);
  2083. mtree_test_insert(mt, 1256, (void *)0x9d1);
  2084. mtree_test_store(mt, 4, (void *)0x9);
  2085. mtree_test_erase(mt, 1);
  2086. mtree_test_store(mt, 56, (void *)0x71);
  2087. mtree_test_insert(mt, 1, (void *)0x3);
  2088. mtree_test_store(mt, 24, (void *)0x31);
  2089. mtree_test_erase(mt, 1);
  2090. mtree_test_insert(mt, 2263, (void *)0x11af);
  2091. mtree_test_insert(mt, 446, (void *)0x37d);
  2092. mtree_test_store_range(mt, 6, 45, (void *)0xd);
  2093. mtree_test_store_range(mt, 3, 446, (void *)0x7);
  2094. mtree_destroy(mt);
  2095. /*
  2096. * 5. mas_wr_extend_null() may overflow slots.
  2097. * Fix by checking against wr_mas->node_end.
  2098. */
  2099. mt_init_flags(mt, 0);
  2100. mtree_test_store(mt, 48, (void *)0x61);
  2101. mtree_test_store(mt, 3, (void *)0x7);
  2102. mtree_test_load(mt, 0);
  2103. mtree_test_store(mt, 88, (void *)0xb1);
  2104. mtree_test_store(mt, 81, (void *)0xa3);
  2105. mtree_test_insert(mt, 0, (void *)0x1);
  2106. mtree_test_insert(mt, 8, (void *)0x11);
  2107. mtree_test_insert(mt, 4, (void *)0x9);
  2108. mtree_test_insert(mt, 2480, (void *)0x1361);
  2109. mtree_test_insert(mt, ULONG_MAX,
  2110. (void *)0xffffffffffffffff);
  2111. mtree_test_erase(mt, ULONG_MAX);
  2112. mtree_destroy(mt);
  2113. /*
  2114. * 6. When reusing a node with an implied pivot and the node is
  2115. * shrinking, old data would be left in the implied slot
  2116. * Fixed by checking the last pivot for the mas->max and clear
  2117. * accordingly. This only affected the left-most node as that node is
  2118. * the only one allowed to end in NULL.
  2119. */
  2120. mt_init_flags(mt, 0);
  2121. mtree_test_erase(mt, 3);
  2122. mtree_test_insert(mt, 22, (void *)0x2d);
  2123. mtree_test_insert(mt, 15, (void *)0x1f);
  2124. mtree_test_load(mt, 2);
  2125. mtree_test_insert(mt, 1, (void *)0x3);
  2126. mtree_test_insert(mt, 1, (void *)0x3);
  2127. mtree_test_insert(mt, 5, (void *)0xb);
  2128. mtree_test_erase(mt, 1);
  2129. mtree_test_insert(mt, 1, (void *)0x3);
  2130. mtree_test_insert(mt, 4, (void *)0x9);
  2131. mtree_test_insert(mt, 1, (void *)0x3);
  2132. mtree_test_erase(mt, 1);
  2133. mtree_test_insert(mt, 2, (void *)0x5);
  2134. mtree_test_insert(mt, 1, (void *)0x3);
  2135. mtree_test_erase(mt, 3);
  2136. mtree_test_insert(mt, 22, (void *)0x2d);
  2137. mtree_test_insert(mt, 15, (void *)0x1f);
  2138. mtree_test_insert(mt, 2, (void *)0x5);
  2139. mtree_test_insert(mt, 1, (void *)0x3);
  2140. mtree_test_insert(mt, 8, (void *)0x11);
  2141. mtree_test_load(mt, 2);
  2142. mtree_test_insert(mt, 1, (void *)0x3);
  2143. mtree_test_insert(mt, 1, (void *)0x3);
  2144. mtree_test_store(mt, 1, (void *)0x3);
  2145. mtree_test_insert(mt, 5, (void *)0xb);
  2146. mtree_test_erase(mt, 1);
  2147. mtree_test_insert(mt, 1, (void *)0x3);
  2148. mtree_test_insert(mt, 4, (void *)0x9);
  2149. mtree_test_insert(mt, 1, (void *)0x3);
  2150. mtree_test_erase(mt, 1);
  2151. mtree_test_insert(mt, 2, (void *)0x5);
  2152. mtree_test_insert(mt, 1, (void *)0x3);
  2153. mtree_test_erase(mt, 3);
  2154. mtree_test_insert(mt, 22, (void *)0x2d);
  2155. mtree_test_insert(mt, 15, (void *)0x1f);
  2156. mtree_test_insert(mt, 2, (void *)0x5);
  2157. mtree_test_insert(mt, 1, (void *)0x3);
  2158. mtree_test_insert(mt, 8, (void *)0x11);
  2159. mtree_test_insert(mt, 12, (void *)0x19);
  2160. mtree_test_erase(mt, 1);
  2161. mtree_test_store_range(mt, 4, 62, (void *)0x9);
  2162. mtree_test_erase(mt, 62);
  2163. mtree_test_store_range(mt, 1, 0, (void *)0x3);
  2164. mtree_test_insert(mt, 11, (void *)0x17);
  2165. mtree_test_insert(mt, 3, (void *)0x7);
  2166. mtree_test_insert(mt, 3, (void *)0x7);
  2167. mtree_test_store(mt, 62, (void *)0x7d);
  2168. mtree_test_erase(mt, 62);
  2169. mtree_test_store_range(mt, 1, 15, (void *)0x3);
  2170. mtree_test_erase(mt, 1);
  2171. mtree_test_insert(mt, 22, (void *)0x2d);
  2172. mtree_test_insert(mt, 12, (void *)0x19);
  2173. mtree_test_erase(mt, 1);
  2174. mtree_test_insert(mt, 3, (void *)0x7);
  2175. mtree_test_store(mt, 62, (void *)0x7d);
  2176. mtree_test_erase(mt, 62);
  2177. mtree_test_insert(mt, 122, (void *)0xf5);
  2178. mtree_test_store(mt, 3, (void *)0x7);
  2179. mtree_test_insert(mt, 0, (void *)0x1);
  2180. mtree_test_store_range(mt, 0, 1, (void *)0x1);
  2181. mtree_test_insert(mt, 85, (void *)0xab);
  2182. mtree_test_insert(mt, 72, (void *)0x91);
  2183. mtree_test_insert(mt, 81, (void *)0xa3);
  2184. mtree_test_insert(mt, 726, (void *)0x5ad);
  2185. mtree_test_insert(mt, 0, (void *)0x1);
  2186. mtree_test_insert(mt, 1, (void *)0x3);
  2187. mtree_test_store(mt, 51, (void *)0x67);
  2188. mtree_test_insert(mt, 611, (void *)0x4c7);
  2189. mtree_test_insert(mt, 485, (void *)0x3cb);
  2190. mtree_test_insert(mt, 1, (void *)0x3);
  2191. mtree_test_erase(mt, 1);
  2192. mtree_test_insert(mt, 0, (void *)0x1);
  2193. mtree_test_insert(mt, 1, (void *)0x3);
  2194. mtree_test_insert_range(mt, 26, 1, (void *)0x35);
  2195. mtree_test_load(mt, 1);
  2196. mtree_test_store_range(mt, 1, 22, (void *)0x3);
  2197. mtree_test_insert(mt, 1, (void *)0x3);
  2198. mtree_test_erase(mt, 1);
  2199. mtree_test_load(mt, 53);
  2200. mtree_test_load(mt, 1);
  2201. mtree_test_store_range(mt, 1, 1, (void *)0x3);
  2202. mtree_test_insert(mt, 222, (void *)0x1bd);
  2203. mtree_test_insert(mt, 485, (void *)0x3cb);
  2204. mtree_test_insert(mt, 1, (void *)0x3);
  2205. mtree_test_erase(mt, 1);
  2206. mtree_test_load(mt, 0);
  2207. mtree_test_insert(mt, 21, (void *)0x2b);
  2208. mtree_test_insert(mt, 3, (void *)0x7);
  2209. mtree_test_store(mt, 621, (void *)0x4db);
  2210. mtree_test_insert(mt, 0, (void *)0x1);
  2211. mtree_test_erase(mt, 5);
  2212. mtree_test_insert(mt, 1, (void *)0x3);
  2213. mtree_test_store(mt, 62, (void *)0x7d);
  2214. mtree_test_erase(mt, 62);
  2215. mtree_test_store_range(mt, 1, 0, (void *)0x3);
  2216. mtree_test_insert(mt, 22, (void *)0x2d);
  2217. mtree_test_insert(mt, 12, (void *)0x19);
  2218. mtree_test_erase(mt, 1);
  2219. mtree_test_insert(mt, 1, (void *)0x3);
  2220. mtree_test_store_range(mt, 4, 62, (void *)0x9);
  2221. mtree_test_erase(mt, 62);
  2222. mtree_test_erase(mt, 1);
  2223. mtree_test_load(mt, 1);
  2224. mtree_test_store_range(mt, 1, 22, (void *)0x3);
  2225. mtree_test_insert(mt, 1, (void *)0x3);
  2226. mtree_test_erase(mt, 1);
  2227. mtree_test_load(mt, 53);
  2228. mtree_test_load(mt, 1);
  2229. mtree_test_store_range(mt, 1, 1, (void *)0x3);
  2230. mtree_test_insert(mt, 222, (void *)0x1bd);
  2231. mtree_test_insert(mt, 485, (void *)0x3cb);
  2232. mtree_test_insert(mt, 1, (void *)0x3);
  2233. mtree_test_erase(mt, 1);
  2234. mtree_test_insert(mt, 1, (void *)0x3);
  2235. mtree_test_load(mt, 0);
  2236. mtree_test_load(mt, 0);
  2237. mtree_destroy(mt);
  2238. /*
  2239. * 7. Previous fix was incomplete, fix mas_resuse_node() clearing of old
  2240. * data by overwriting it first - that way metadata is of no concern.
  2241. */
  2242. mt_init_flags(mt, 0);
  2243. mtree_test_load(mt, 1);
  2244. mtree_test_insert(mt, 102, (void *)0xcd);
  2245. mtree_test_erase(mt, 2);
  2246. mtree_test_erase(mt, 0);
  2247. mtree_test_load(mt, 0);
  2248. mtree_test_insert(mt, 4, (void *)0x9);
  2249. mtree_test_insert(mt, 2, (void *)0x5);
  2250. mtree_test_insert(mt, 110, (void *)0xdd);
  2251. mtree_test_insert(mt, 1, (void *)0x3);
  2252. mtree_test_insert_range(mt, 5, 0, (void *)0xb);
  2253. mtree_test_erase(mt, 2);
  2254. mtree_test_store(mt, 0, (void *)0x1);
  2255. mtree_test_store(mt, 112, (void *)0xe1);
  2256. mtree_test_insert(mt, 21, (void *)0x2b);
  2257. mtree_test_store(mt, 1, (void *)0x3);
  2258. mtree_test_insert_range(mt, 110, 2, (void *)0xdd);
  2259. mtree_test_store(mt, 2, (void *)0x5);
  2260. mtree_test_load(mt, 22);
  2261. mtree_test_erase(mt, 2);
  2262. mtree_test_store(mt, 210, (void *)0x1a5);
  2263. mtree_test_store_range(mt, 0, 2, (void *)0x1);
  2264. mtree_test_store(mt, 2, (void *)0x5);
  2265. mtree_test_erase(mt, 2);
  2266. mtree_test_erase(mt, 22);
  2267. mtree_test_erase(mt, 1);
  2268. mtree_test_erase(mt, 2);
  2269. mtree_test_store(mt, 0, (void *)0x1);
  2270. mtree_test_load(mt, 112);
  2271. mtree_test_insert(mt, 2, (void *)0x5);
  2272. mtree_test_erase(mt, 2);
  2273. mtree_test_store(mt, 1, (void *)0x3);
  2274. mtree_test_insert_range(mt, 1, 2, (void *)0x3);
  2275. mtree_test_erase(mt, 0);
  2276. mtree_test_erase(mt, 2);
  2277. mtree_test_store(mt, 2, (void *)0x5);
  2278. mtree_test_erase(mt, 0);
  2279. mtree_test_erase(mt, 2);
  2280. mtree_test_store(mt, 0, (void *)0x1);
  2281. mtree_test_store(mt, 0, (void *)0x1);
  2282. mtree_test_erase(mt, 2);
  2283. mtree_test_store(mt, 2, (void *)0x5);
  2284. mtree_test_erase(mt, 2);
  2285. mtree_test_insert(mt, 2, (void *)0x5);
  2286. mtree_test_insert_range(mt, 1, 2, (void *)0x3);
  2287. mtree_test_erase(mt, 0);
  2288. mtree_test_erase(mt, 2);
  2289. mtree_test_store(mt, 0, (void *)0x1);
  2290. mtree_test_load(mt, 112);
  2291. mtree_test_store_range(mt, 110, 12, (void *)0xdd);
  2292. mtree_test_store(mt, 2, (void *)0x5);
  2293. mtree_test_load(mt, 110);
  2294. mtree_test_insert_range(mt, 4, 71, (void *)0x9);
  2295. mtree_test_load(mt, 2);
  2296. mtree_test_store(mt, 2, (void *)0x5);
  2297. mtree_test_insert_range(mt, 11, 22, (void *)0x17);
  2298. mtree_test_erase(mt, 12);
  2299. mtree_test_store(mt, 2, (void *)0x5);
  2300. mtree_test_load(mt, 22);
  2301. mtree_destroy(mt);
  2302. /*
  2303. * 8. When rebalancing or spanning_rebalance(), the max of the new node
  2304. * may be set incorrectly to the final pivot and not the right max.
  2305. * Fix by setting the left max to orig right max if the entire node is
  2306. * consumed.
  2307. */
  2308. mt_init_flags(mt, 0);
  2309. mtree_test_store(mt, 6, (void *)0xd);
  2310. mtree_test_store(mt, 67, (void *)0x87);
  2311. mtree_test_insert(mt, 15, (void *)0x1f);
  2312. mtree_test_insert(mt, 6716, (void *)0x3479);
  2313. mtree_test_store(mt, 61, (void *)0x7b);
  2314. mtree_test_insert(mt, 13, (void *)0x1b);
  2315. mtree_test_store(mt, 8, (void *)0x11);
  2316. mtree_test_insert(mt, 1, (void *)0x3);
  2317. mtree_test_load(mt, 0);
  2318. mtree_test_erase(mt, 67167);
  2319. mtree_test_insert_range(mt, 6, 7167, (void *)0xd);
  2320. mtree_test_insert(mt, 6, (void *)0xd);
  2321. mtree_test_erase(mt, 67);
  2322. mtree_test_insert(mt, 1, (void *)0x3);
  2323. mtree_test_erase(mt, 667167);
  2324. mtree_test_insert(mt, 6, (void *)0xd);
  2325. mtree_test_store(mt, 67, (void *)0x87);
  2326. mtree_test_insert(mt, 5, (void *)0xb);
  2327. mtree_test_erase(mt, 1);
  2328. mtree_test_insert(mt, 6, (void *)0xd);
  2329. mtree_test_erase(mt, 67);
  2330. mtree_test_insert(mt, 15, (void *)0x1f);
  2331. mtree_test_insert(mt, 67167, (void *)0x20cbf);
  2332. mtree_test_insert(mt, 1, (void *)0x3);
  2333. mtree_test_load(mt, 7);
  2334. mtree_test_insert(mt, 16, (void *)0x21);
  2335. mtree_test_insert(mt, 36, (void *)0x49);
  2336. mtree_test_store(mt, 67, (void *)0x87);
  2337. mtree_test_store(mt, 6, (void *)0xd);
  2338. mtree_test_insert(mt, 367, (void *)0x2df);
  2339. mtree_test_insert(mt, 115, (void *)0xe7);
  2340. mtree_test_store(mt, 0, (void *)0x1);
  2341. mtree_test_store_range(mt, 1, 3, (void *)0x3);
  2342. mtree_test_store(mt, 1, (void *)0x3);
  2343. mtree_test_erase(mt, 67167);
  2344. mtree_test_insert_range(mt, 6, 47, (void *)0xd);
  2345. mtree_test_store(mt, 1, (void *)0x3);
  2346. mtree_test_insert_range(mt, 1, 67, (void *)0x3);
  2347. mtree_test_load(mt, 67);
  2348. mtree_test_insert(mt, 1, (void *)0x3);
  2349. mtree_test_erase(mt, 67167);
  2350. mtree_destroy(mt);
  2351. /*
  2352. * 9. spanning store to the end of data caused an invalid metadata
  2353. * length which resulted in a crash eventually.
  2354. * Fix by checking if there is a value in pivot before incrementing the
  2355. * metadata end in mab_mas_cp(). To ensure this doesn't happen again,
  2356. * abstract the two locations this happens into a function called
  2357. * mas_leaf_set_meta().
  2358. */
  2359. mt_init_flags(mt, 0);
  2360. mtree_test_insert(mt, 21, (void *)0x2b);
  2361. mtree_test_insert(mt, 12, (void *)0x19);
  2362. mtree_test_insert(mt, 6, (void *)0xd);
  2363. mtree_test_insert(mt, 8, (void *)0x11);
  2364. mtree_test_insert(mt, 2, (void *)0x5);
  2365. mtree_test_insert(mt, 91, (void *)0xb7);
  2366. mtree_test_insert(mt, 18, (void *)0x25);
  2367. mtree_test_insert(mt, 81, (void *)0xa3);
  2368. mtree_test_store_range(mt, 0, 128, (void *)0x1);
  2369. mtree_test_store(mt, 1, (void *)0x3);
  2370. mtree_test_erase(mt, 8);
  2371. mtree_test_insert(mt, 11, (void *)0x17);
  2372. mtree_test_insert(mt, 8, (void *)0x11);
  2373. mtree_test_insert(mt, 21, (void *)0x2b);
  2374. mtree_test_insert(mt, 2, (void *)0x5);
  2375. mtree_test_insert(mt, ULONG_MAX - 10, (void *)0xffffffffffffffeb);
  2376. mtree_test_erase(mt, ULONG_MAX - 10);
  2377. mtree_test_store_range(mt, 0, 281, (void *)0x1);
  2378. mtree_test_erase(mt, 2);
  2379. mtree_test_insert(mt, 1211, (void *)0x977);
  2380. mtree_test_insert(mt, 111, (void *)0xdf);
  2381. mtree_test_insert(mt, 13, (void *)0x1b);
  2382. mtree_test_insert(mt, 211, (void *)0x1a7);
  2383. mtree_test_insert(mt, 11, (void *)0x17);
  2384. mtree_test_insert(mt, 5, (void *)0xb);
  2385. mtree_test_insert(mt, 1218, (void *)0x985);
  2386. mtree_test_insert(mt, 61, (void *)0x7b);
  2387. mtree_test_store(mt, 1, (void *)0x3);
  2388. mtree_test_insert(mt, 121, (void *)0xf3);
  2389. mtree_test_insert(mt, 8, (void *)0x11);
  2390. mtree_test_insert(mt, 21, (void *)0x2b);
  2391. mtree_test_insert(mt, 2, (void *)0x5);
  2392. mtree_test_insert(mt, ULONG_MAX - 10, (void *)0xffffffffffffffeb);
  2393. mtree_test_erase(mt, ULONG_MAX - 10);
  2394. }
  2395. static noinline void __init check_bnode_min_spanning(struct maple_tree *mt)
  2396. {
  2397. int i = 50;
  2398. MA_STATE(mas, mt, 0, 0);
  2399. mt_set_non_kernel(9999);
  2400. mas_lock(&mas);
  2401. do {
  2402. mas_set_range(&mas, i*10, i*10+9);
  2403. mas_store(&mas, check_bnode_min_spanning);
  2404. } while (i--);
  2405. mas_set_range(&mas, 240, 509);
  2406. mas_store(&mas, NULL);
  2407. mas_unlock(&mas);
  2408. mas_destroy(&mas);
  2409. mt_set_non_kernel(0);
  2410. }
  2411. static noinline void __init check_empty_area_window(struct maple_tree *mt)
  2412. {
  2413. unsigned long i, nr_entries = 20;
  2414. MA_STATE(mas, mt, 0, 0);
  2415. for (i = 1; i <= nr_entries; i++)
  2416. mtree_store_range(mt, i*10, i*10 + 9,
  2417. xa_mk_value(i), GFP_KERNEL);
  2418. /* Create another hole besides the one at 0 */
  2419. mtree_store_range(mt, 160, 169, NULL, GFP_KERNEL);
  2420. /* Check lower bounds that don't fit */
  2421. rcu_read_lock();
  2422. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 10) != -EBUSY);
  2423. mas_reset(&mas);
  2424. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 6, 90, 5) != -EBUSY);
  2425. /* Check lower bound that does fit */
  2426. mas_reset(&mas);
  2427. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 90, 5) != 0);
  2428. MT_BUG_ON(mt, mas.index != 5);
  2429. MT_BUG_ON(mt, mas.last != 9);
  2430. rcu_read_unlock();
  2431. /* Check one gap that doesn't fit and one that does */
  2432. rcu_read_lock();
  2433. mas_reset(&mas);
  2434. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 5, 217, 9) != 0);
  2435. MT_BUG_ON(mt, mas.index != 161);
  2436. MT_BUG_ON(mt, mas.last != 169);
  2437. /* Check one gap that does fit above the min */
  2438. mas_reset(&mas);
  2439. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 3) != 0);
  2440. MT_BUG_ON(mt, mas.index != 216);
  2441. MT_BUG_ON(mt, mas.last != 218);
  2442. /* Check size that doesn't fit any gap */
  2443. mas_reset(&mas);
  2444. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 218, 16) != -EBUSY);
  2445. /*
  2446. * Check size that doesn't fit the lower end of the window but
  2447. * does fit the gap
  2448. */
  2449. mas_reset(&mas);
  2450. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 167, 200, 4) != -EBUSY);
  2451. /*
  2452. * Check size that doesn't fit the upper end of the window but
  2453. * does fit the gap
  2454. */
  2455. mas_reset(&mas);
  2456. MT_BUG_ON(mt, mas_empty_area_rev(&mas, 100, 162, 4) != -EBUSY);
  2457. /* Check mas_empty_area forward */
  2458. mas_reset(&mas);
  2459. MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 9) != 0);
  2460. MT_BUG_ON(mt, mas.index != 0);
  2461. MT_BUG_ON(mt, mas.last != 8);
  2462. mas_reset(&mas);
  2463. MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 4) != 0);
  2464. MT_BUG_ON(mt, mas.index != 0);
  2465. MT_BUG_ON(mt, mas.last != 3);
  2466. mas_reset(&mas);
  2467. MT_BUG_ON(mt, mas_empty_area(&mas, 0, 100, 11) != -EBUSY);
  2468. mas_reset(&mas);
  2469. MT_BUG_ON(mt, mas_empty_area(&mas, 5, 100, 6) != -EBUSY);
  2470. mas_reset(&mas);
  2471. MT_BUG_ON(mt, mas_empty_area(&mas, 0, 8, 10) != -EINVAL);
  2472. mas_reset(&mas);
  2473. mas_empty_area(&mas, 100, 165, 3);
  2474. mas_reset(&mas);
  2475. MT_BUG_ON(mt, mas_empty_area(&mas, 100, 163, 6) != -EBUSY);
  2476. rcu_read_unlock();
  2477. }
  2478. static noinline void __init check_empty_area_fill(struct maple_tree *mt)
  2479. {
  2480. const unsigned long max = 0x25D78000;
  2481. unsigned long size;
  2482. int loop, shift;
  2483. MA_STATE(mas, mt, 0, 0);
  2484. mt_set_non_kernel(99999);
  2485. for (shift = 12; shift <= 16; shift++) {
  2486. loop = 5000;
  2487. size = 1 << shift;
  2488. while (loop--) {
  2489. mas_set(&mas, 0);
  2490. mas_lock(&mas);
  2491. MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != 0);
  2492. MT_BUG_ON(mt, mas.last != mas.index + size - 1);
  2493. mas_store_gfp(&mas, (void *)size, GFP_KERNEL);
  2494. mas_unlock(&mas);
  2495. mas_reset(&mas);
  2496. }
  2497. }
  2498. /* No space left. */
  2499. size = 0x1000;
  2500. rcu_read_lock();
  2501. MT_BUG_ON(mt, mas_empty_area(&mas, 0, max, size) != -EBUSY);
  2502. rcu_read_unlock();
  2503. /* Fill a depth 3 node to the maximum */
  2504. for (unsigned long i = 629440511; i <= 629440800; i += 6)
  2505. mtree_store_range(mt, i, i + 5, (void *)i, GFP_KERNEL);
  2506. /* Make space in the second-last depth 4 node */
  2507. mtree_erase(mt, 631668735);
  2508. /* Make space in the last depth 4 node */
  2509. mtree_erase(mt, 629506047);
  2510. mas_reset(&mas);
  2511. /* Search from just after the gap in the second-last depth 4 */
  2512. rcu_read_lock();
  2513. MT_BUG_ON(mt, mas_empty_area(&mas, 629506048, 690000000, 0x5000) != 0);
  2514. rcu_read_unlock();
  2515. mt_set_non_kernel(0);
  2516. }
  2517. /*
  2518. * Check MAS_START, MAS_PAUSE, active (implied), and MAS_NONE transitions.
  2519. *
  2520. * The table below shows the single entry tree (0-0 pointer) and normal tree
  2521. * with nodes.
  2522. *
  2523. * Function ENTRY Start Result index & last
  2524. * ┬ ┬ ┬ ┬ ┬
  2525. * │ │ │ │ └─ the final range
  2526. * │ │ │ └─ The node value after execution
  2527. * │ │ └─ The node value before execution
  2528. * │ └─ If the entry exists or does not exists (DNE)
  2529. * └─ The function name
  2530. *
  2531. * Function ENTRY Start Result index & last
  2532. * mas_next()
  2533. * - after last
  2534. * Single entry tree at 0-0
  2535. * ------------------------
  2536. * DNE MAS_START MAS_NONE 1 - oo
  2537. * DNE MAS_PAUSE MAS_NONE 1 - oo
  2538. * DNE MAS_ROOT MAS_NONE 1 - oo
  2539. * when index = 0
  2540. * DNE MAS_NONE MAS_ROOT 0
  2541. * when index > 0
  2542. * DNE MAS_NONE MAS_NONE 1 - oo
  2543. *
  2544. * Normal tree
  2545. * -----------
  2546. * exists MAS_START active range
  2547. * DNE MAS_START active set to last range
  2548. * exists MAS_PAUSE active range
  2549. * DNE MAS_PAUSE active set to last range
  2550. * exists MAS_NONE active range
  2551. * exists active active range
  2552. * DNE active active set to last range
  2553. * ERANGE active MAS_OVERFLOW last range
  2554. *
  2555. * Function ENTRY Start Result index & last
  2556. * mas_prev()
  2557. * - before index
  2558. * Single entry tree at 0-0
  2559. * ------------------------
  2560. * if index > 0
  2561. * exists MAS_START MAS_ROOT 0
  2562. * exists MAS_PAUSE MAS_ROOT 0
  2563. * exists MAS_NONE MAS_ROOT 0
  2564. *
  2565. * if index == 0
  2566. * DNE MAS_START MAS_NONE 0
  2567. * DNE MAS_PAUSE MAS_NONE 0
  2568. * DNE MAS_NONE MAS_NONE 0
  2569. * DNE MAS_ROOT MAS_NONE 0
  2570. *
  2571. * Normal tree
  2572. * -----------
  2573. * exists MAS_START active range
  2574. * DNE MAS_START active set to min
  2575. * exists MAS_PAUSE active range
  2576. * DNE MAS_PAUSE active set to min
  2577. * exists MAS_NONE active range
  2578. * DNE MAS_NONE MAS_NONE set to min
  2579. * any MAS_ROOT MAS_NONE 0
  2580. * exists active active range
  2581. * DNE active active last range
  2582. * ERANGE active MAS_UNDERFLOW last range
  2583. *
  2584. * Function ENTRY Start Result index & last
  2585. * mas_find()
  2586. * - at index or next
  2587. * Single entry tree at 0-0
  2588. * ------------------------
  2589. * if index > 0
  2590. * DNE MAS_START MAS_NONE 0
  2591. * DNE MAS_PAUSE MAS_NONE 0
  2592. * DNE MAS_ROOT MAS_NONE 0
  2593. * DNE MAS_NONE MAS_NONE 1
  2594. * if index == 0
  2595. * exists MAS_START MAS_ROOT 0
  2596. * exists MAS_PAUSE MAS_ROOT 0
  2597. * exists MAS_NONE MAS_ROOT 0
  2598. *
  2599. * Normal tree
  2600. * -----------
  2601. * exists MAS_START active range
  2602. * DNE MAS_START active set to max
  2603. * exists MAS_PAUSE active range
  2604. * DNE MAS_PAUSE active set to max
  2605. * exists MAS_NONE active range (start at last)
  2606. * exists active active range
  2607. * DNE active active last range (max < last)
  2608. *
  2609. * Function ENTRY Start Result index & last
  2610. * mas_find_rev()
  2611. * - at index or before
  2612. * Single entry tree at 0-0
  2613. * ------------------------
  2614. * if index > 0
  2615. * exists MAS_START MAS_ROOT 0
  2616. * exists MAS_PAUSE MAS_ROOT 0
  2617. * exists MAS_NONE MAS_ROOT 0
  2618. * if index == 0
  2619. * DNE MAS_START MAS_NONE 0
  2620. * DNE MAS_PAUSE MAS_NONE 0
  2621. * DNE MAS_NONE MAS_NONE 0
  2622. * DNE MAS_ROOT MAS_NONE 0
  2623. *
  2624. * Normal tree
  2625. * -----------
  2626. * exists MAS_START active range
  2627. * DNE MAS_START active set to min
  2628. * exists MAS_PAUSE active range
  2629. * DNE MAS_PAUSE active set to min
  2630. * exists MAS_NONE active range (start at index)
  2631. * exists active active range
  2632. * DNE active active last range (min > index)
  2633. *
  2634. * Function ENTRY Start Result index & last
  2635. * mas_walk()
  2636. * - Look up index
  2637. * Single entry tree at 0-0
  2638. * ------------------------
  2639. * if index > 0
  2640. * DNE MAS_START MAS_ROOT 1 - oo
  2641. * DNE MAS_PAUSE MAS_ROOT 1 - oo
  2642. * DNE MAS_NONE MAS_ROOT 1 - oo
  2643. * DNE MAS_ROOT MAS_ROOT 1 - oo
  2644. * if index == 0
  2645. * exists MAS_START MAS_ROOT 0
  2646. * exists MAS_PAUSE MAS_ROOT 0
  2647. * exists MAS_NONE MAS_ROOT 0
  2648. * exists MAS_ROOT MAS_ROOT 0
  2649. *
  2650. * Normal tree
  2651. * -----------
  2652. * exists MAS_START active range
  2653. * DNE MAS_START active range of NULL
  2654. * exists MAS_PAUSE active range
  2655. * DNE MAS_PAUSE active range of NULL
  2656. * exists MAS_NONE active range
  2657. * DNE MAS_NONE active range of NULL
  2658. * exists active active range
  2659. * DNE active active range of NULL
  2660. */
  2661. static noinline void __init check_state_handling(struct maple_tree *mt)
  2662. {
  2663. MA_STATE(mas, mt, 0, 0);
  2664. void *entry, *ptr = (void *) 0x1234500;
  2665. void *ptr2 = &ptr;
  2666. void *ptr3 = &ptr2;
  2667. unsigned long index;
  2668. /* Check MAS_ROOT First */
  2669. mtree_store_range(mt, 0, 0, ptr, GFP_KERNEL);
  2670. mas_lock(&mas);
  2671. /* prev: Start -> underflow*/
  2672. entry = mas_prev(&mas, 0);
  2673. MT_BUG_ON(mt, entry != NULL);
  2674. MT_BUG_ON(mt, mas.status != ma_underflow);
  2675. /* prev: Start -> root */
  2676. mas_set(&mas, 10);
  2677. entry = mas_prev(&mas, 0);
  2678. MT_BUG_ON(mt, entry != ptr);
  2679. MT_BUG_ON(mt, mas.index != 0);
  2680. MT_BUG_ON(mt, mas.last != 0);
  2681. MT_BUG_ON(mt, mas.status != ma_root);
  2682. /* prev: pause -> root */
  2683. mas_set(&mas, 10);
  2684. mas_pause(&mas);
  2685. entry = mas_prev(&mas, 0);
  2686. MT_BUG_ON(mt, entry != ptr);
  2687. MT_BUG_ON(mt, mas.index != 0);
  2688. MT_BUG_ON(mt, mas.last != 0);
  2689. MT_BUG_ON(mt, mas.status != ma_root);
  2690. /* next: start -> none */
  2691. mas_set(&mas, 0);
  2692. entry = mas_next(&mas, ULONG_MAX);
  2693. MT_BUG_ON(mt, mas.index != 1);
  2694. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2695. MT_BUG_ON(mt, entry != NULL);
  2696. MT_BUG_ON(mt, mas.status != ma_none);
  2697. /* next: start -> none*/
  2698. mas_set(&mas, 10);
  2699. entry = mas_next(&mas, ULONG_MAX);
  2700. MT_BUG_ON(mt, mas.index != 1);
  2701. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2702. MT_BUG_ON(mt, entry != NULL);
  2703. MT_BUG_ON(mt, mas.status != ma_none);
  2704. /* find: start -> root */
  2705. mas_set(&mas, 0);
  2706. entry = mas_find(&mas, ULONG_MAX);
  2707. MT_BUG_ON(mt, entry != ptr);
  2708. MT_BUG_ON(mt, mas.index != 0);
  2709. MT_BUG_ON(mt, mas.last != 0);
  2710. MT_BUG_ON(mt, mas.status != ma_root);
  2711. /* find: root -> none */
  2712. entry = mas_find(&mas, ULONG_MAX);
  2713. MT_BUG_ON(mt, entry != NULL);
  2714. MT_BUG_ON(mt, mas.index != 1);
  2715. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2716. MT_BUG_ON(mt, mas.status != ma_none);
  2717. /* find: none -> none */
  2718. entry = mas_find(&mas, ULONG_MAX);
  2719. MT_BUG_ON(mt, entry != NULL);
  2720. MT_BUG_ON(mt, mas.index != 1);
  2721. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2722. MT_BUG_ON(mt, mas.status != ma_none);
  2723. /* find: start -> none */
  2724. mas_set(&mas, 10);
  2725. entry = mas_find(&mas, ULONG_MAX);
  2726. MT_BUG_ON(mt, entry != NULL);
  2727. MT_BUG_ON(mt, mas.index != 1);
  2728. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2729. MT_BUG_ON(mt, mas.status != ma_none);
  2730. /* find_rev: none -> root */
  2731. entry = mas_find_rev(&mas, 0);
  2732. MT_BUG_ON(mt, entry != ptr);
  2733. MT_BUG_ON(mt, mas.index != 0);
  2734. MT_BUG_ON(mt, mas.last != 0);
  2735. MT_BUG_ON(mt, mas.status != ma_root);
  2736. /* find_rev: start -> root */
  2737. mas_set(&mas, 0);
  2738. entry = mas_find_rev(&mas, 0);
  2739. MT_BUG_ON(mt, entry != ptr);
  2740. MT_BUG_ON(mt, mas.index != 0);
  2741. MT_BUG_ON(mt, mas.last != 0);
  2742. MT_BUG_ON(mt, mas.status != ma_root);
  2743. /* find_rev: root -> none */
  2744. entry = mas_find_rev(&mas, 0);
  2745. MT_BUG_ON(mt, entry != NULL);
  2746. MT_BUG_ON(mt, mas.index != 0);
  2747. MT_BUG_ON(mt, mas.last != 0);
  2748. MT_BUG_ON(mt, mas.status != ma_none);
  2749. /* find_rev: none -> none */
  2750. entry = mas_find_rev(&mas, 0);
  2751. MT_BUG_ON(mt, entry != NULL);
  2752. MT_BUG_ON(mt, mas.index != 0);
  2753. MT_BUG_ON(mt, mas.last != 0);
  2754. MT_BUG_ON(mt, mas.status != ma_none);
  2755. /* find_rev: start -> root */
  2756. mas_set(&mas, 10);
  2757. entry = mas_find_rev(&mas, 0);
  2758. MT_BUG_ON(mt, entry != ptr);
  2759. MT_BUG_ON(mt, mas.index != 0);
  2760. MT_BUG_ON(mt, mas.last != 0);
  2761. MT_BUG_ON(mt, mas.status != ma_root);
  2762. /* walk: start -> none */
  2763. mas_set(&mas, 10);
  2764. entry = mas_walk(&mas);
  2765. MT_BUG_ON(mt, entry != NULL);
  2766. MT_BUG_ON(mt, mas.index != 1);
  2767. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2768. MT_BUG_ON(mt, mas.status != ma_none);
  2769. /* walk: pause -> none*/
  2770. mas_set(&mas, 10);
  2771. mas_pause(&mas);
  2772. entry = mas_walk(&mas);
  2773. MT_BUG_ON(mt, entry != NULL);
  2774. MT_BUG_ON(mt, mas.index != 1);
  2775. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2776. MT_BUG_ON(mt, mas.status != ma_none);
  2777. /* walk: none -> none */
  2778. mas.index = mas.last = 10;
  2779. entry = mas_walk(&mas);
  2780. MT_BUG_ON(mt, entry != NULL);
  2781. MT_BUG_ON(mt, mas.index != 1);
  2782. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2783. MT_BUG_ON(mt, mas.status != ma_none);
  2784. /* walk: none -> none */
  2785. entry = mas_walk(&mas);
  2786. MT_BUG_ON(mt, entry != NULL);
  2787. MT_BUG_ON(mt, mas.index != 1);
  2788. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2789. MT_BUG_ON(mt, mas.status != ma_none);
  2790. /* walk: start -> root */
  2791. mas_set(&mas, 0);
  2792. entry = mas_walk(&mas);
  2793. MT_BUG_ON(mt, entry != ptr);
  2794. MT_BUG_ON(mt, mas.index != 0);
  2795. MT_BUG_ON(mt, mas.last != 0);
  2796. MT_BUG_ON(mt, mas.status != ma_root);
  2797. /* walk: pause -> root */
  2798. mas_set(&mas, 0);
  2799. mas_pause(&mas);
  2800. entry = mas_walk(&mas);
  2801. MT_BUG_ON(mt, entry != ptr);
  2802. MT_BUG_ON(mt, mas.index != 0);
  2803. MT_BUG_ON(mt, mas.last != 0);
  2804. MT_BUG_ON(mt, mas.status != ma_root);
  2805. /* walk: none -> root */
  2806. mas.status = ma_none;
  2807. entry = mas_walk(&mas);
  2808. MT_BUG_ON(mt, entry != ptr);
  2809. MT_BUG_ON(mt, mas.index != 0);
  2810. MT_BUG_ON(mt, mas.last != 0);
  2811. MT_BUG_ON(mt, mas.status != ma_root);
  2812. /* walk: root -> root */
  2813. entry = mas_walk(&mas);
  2814. MT_BUG_ON(mt, entry != ptr);
  2815. MT_BUG_ON(mt, mas.index != 0);
  2816. MT_BUG_ON(mt, mas.last != 0);
  2817. MT_BUG_ON(mt, mas.status != ma_root);
  2818. /* walk: root -> none */
  2819. mas_set(&mas, 10);
  2820. entry = mas_walk(&mas);
  2821. MT_BUG_ON(mt, entry != NULL);
  2822. MT_BUG_ON(mt, mas.index != 1);
  2823. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2824. MT_BUG_ON(mt, mas.status != ma_none);
  2825. /* walk: none -> root */
  2826. mas.index = mas.last = 0;
  2827. entry = mas_walk(&mas);
  2828. MT_BUG_ON(mt, entry != ptr);
  2829. MT_BUG_ON(mt, mas.index != 0);
  2830. MT_BUG_ON(mt, mas.last != 0);
  2831. MT_BUG_ON(mt, mas.status != ma_root);
  2832. mas_unlock(&mas);
  2833. /* Check when there is an actual node */
  2834. mtree_store_range(mt, 0, 0, NULL, GFP_KERNEL);
  2835. mtree_store_range(mt, 0x1000, 0x1500, ptr, GFP_KERNEL);
  2836. mtree_store_range(mt, 0x2000, 0x2500, ptr2, GFP_KERNEL);
  2837. mtree_store_range(mt, 0x3000, 0x3500, ptr3, GFP_KERNEL);
  2838. mas_lock(&mas);
  2839. /* next: start ->active */
  2840. mas_set(&mas, 0);
  2841. entry = mas_next(&mas, ULONG_MAX);
  2842. MT_BUG_ON(mt, entry != ptr);
  2843. MT_BUG_ON(mt, mas.index != 0x1000);
  2844. MT_BUG_ON(mt, mas.last != 0x1500);
  2845. MT_BUG_ON(mt, !mas_is_active(&mas));
  2846. /* next: pause ->active */
  2847. mas_set(&mas, 0);
  2848. mas_pause(&mas);
  2849. entry = mas_next(&mas, ULONG_MAX);
  2850. MT_BUG_ON(mt, entry != ptr);
  2851. MT_BUG_ON(mt, mas.index != 0x1000);
  2852. MT_BUG_ON(mt, mas.last != 0x1500);
  2853. MT_BUG_ON(mt, !mas_is_active(&mas));
  2854. /* next: none ->active */
  2855. mas.index = mas.last = 0;
  2856. mas.offset = 0;
  2857. mas.status = ma_none;
  2858. entry = mas_next(&mas, ULONG_MAX);
  2859. MT_BUG_ON(mt, entry != ptr);
  2860. MT_BUG_ON(mt, mas.index != 0x1000);
  2861. MT_BUG_ON(mt, mas.last != 0x1500);
  2862. MT_BUG_ON(mt, !mas_is_active(&mas));
  2863. /* next:active ->active (spanning limit) */
  2864. entry = mas_next(&mas, 0x2100);
  2865. MT_BUG_ON(mt, entry != ptr2);
  2866. MT_BUG_ON(mt, mas.index != 0x2000);
  2867. MT_BUG_ON(mt, mas.last != 0x2500);
  2868. MT_BUG_ON(mt, !mas_is_active(&mas));
  2869. /* next:active -> overflow (limit reached) beyond data */
  2870. entry = mas_next(&mas, 0x2999);
  2871. MT_BUG_ON(mt, entry != NULL);
  2872. MT_BUG_ON(mt, mas.index != 0x2501);
  2873. MT_BUG_ON(mt, mas.last != 0x2fff);
  2874. MT_BUG_ON(mt, !mas_is_overflow(&mas));
  2875. /* next:overflow -> active (limit changed) */
  2876. entry = mas_next(&mas, ULONG_MAX);
  2877. MT_BUG_ON(mt, entry != ptr3);
  2878. MT_BUG_ON(mt, mas.index != 0x3000);
  2879. MT_BUG_ON(mt, mas.last != 0x3500);
  2880. MT_BUG_ON(mt, !mas_is_active(&mas));
  2881. /* next:active -> overflow (limit reached) */
  2882. entry = mas_next(&mas, ULONG_MAX);
  2883. MT_BUG_ON(mt, entry != NULL);
  2884. MT_BUG_ON(mt, mas.index != 0x3501);
  2885. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2886. MT_BUG_ON(mt, !mas_is_overflow(&mas));
  2887. /* next:overflow -> overflow */
  2888. entry = mas_next(&mas, ULONG_MAX);
  2889. MT_BUG_ON(mt, entry != NULL);
  2890. MT_BUG_ON(mt, mas.index != 0x3501);
  2891. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  2892. MT_BUG_ON(mt, !mas_is_overflow(&mas));
  2893. /* prev:overflow -> active */
  2894. entry = mas_prev(&mas, 0);
  2895. MT_BUG_ON(mt, entry != ptr3);
  2896. MT_BUG_ON(mt, mas.index != 0x3000);
  2897. MT_BUG_ON(mt, mas.last != 0x3500);
  2898. MT_BUG_ON(mt, !mas_is_active(&mas));
  2899. /* next: none -> active, skip value at location */
  2900. mas_set(&mas, 0);
  2901. entry = mas_next(&mas, ULONG_MAX);
  2902. mas.status = ma_none;
  2903. mas.offset = 0;
  2904. entry = mas_next(&mas, ULONG_MAX);
  2905. MT_BUG_ON(mt, entry != ptr2);
  2906. MT_BUG_ON(mt, mas.index != 0x2000);
  2907. MT_BUG_ON(mt, mas.last != 0x2500);
  2908. MT_BUG_ON(mt, !mas_is_active(&mas));
  2909. /* prev:active ->active */
  2910. entry = mas_prev(&mas, 0);
  2911. MT_BUG_ON(mt, entry != ptr);
  2912. MT_BUG_ON(mt, mas.index != 0x1000);
  2913. MT_BUG_ON(mt, mas.last != 0x1500);
  2914. MT_BUG_ON(mt, !mas_is_active(&mas));
  2915. /* prev:active -> underflow (span limit) */
  2916. mas_next(&mas, ULONG_MAX);
  2917. entry = mas_prev(&mas, 0x1200);
  2918. MT_BUG_ON(mt, entry != ptr);
  2919. MT_BUG_ON(mt, mas.index != 0x1000);
  2920. MT_BUG_ON(mt, mas.last != 0x1500);
  2921. MT_BUG_ON(mt, !mas_is_active(&mas)); /* spanning limit */
  2922. entry = mas_prev(&mas, 0x1200); /* underflow */
  2923. MT_BUG_ON(mt, entry != NULL);
  2924. MT_BUG_ON(mt, mas.index != 0x1000);
  2925. MT_BUG_ON(mt, mas.last != 0x1500);
  2926. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  2927. /* prev:underflow -> underflow (lower limit) spanning end range */
  2928. entry = mas_prev(&mas, 0x0100);
  2929. MT_BUG_ON(mt, entry != NULL);
  2930. MT_BUG_ON(mt, mas.index != 0);
  2931. MT_BUG_ON(mt, mas.last != 0x0FFF);
  2932. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  2933. /* prev:underflow -> underflow */
  2934. entry = mas_prev(&mas, 0);
  2935. MT_BUG_ON(mt, entry != NULL);
  2936. MT_BUG_ON(mt, mas.index != 0);
  2937. MT_BUG_ON(mt, mas.last != 0x0FFF);
  2938. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  2939. /* prev:underflow -> underflow */
  2940. entry = mas_prev(&mas, 0);
  2941. MT_BUG_ON(mt, entry != NULL);
  2942. MT_BUG_ON(mt, mas.index != 0);
  2943. MT_BUG_ON(mt, mas.last != 0x0FFF);
  2944. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  2945. /* next:underflow -> active */
  2946. entry = mas_next(&mas, ULONG_MAX);
  2947. MT_BUG_ON(mt, entry != ptr);
  2948. MT_BUG_ON(mt, mas.index != 0x1000);
  2949. MT_BUG_ON(mt, mas.last != 0x1500);
  2950. MT_BUG_ON(mt, !mas_is_active(&mas));
  2951. /* prev:first value -> underflow */
  2952. entry = mas_prev(&mas, 0x1000);
  2953. MT_BUG_ON(mt, entry != NULL);
  2954. MT_BUG_ON(mt, mas.index != 0x1000);
  2955. MT_BUG_ON(mt, mas.last != 0x1500);
  2956. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  2957. /* find:underflow -> first value */
  2958. entry = mas_find(&mas, ULONG_MAX);
  2959. MT_BUG_ON(mt, entry != ptr);
  2960. MT_BUG_ON(mt, mas.index != 0x1000);
  2961. MT_BUG_ON(mt, mas.last != 0x1500);
  2962. MT_BUG_ON(mt, !mas_is_active(&mas));
  2963. /* prev: pause ->active */
  2964. mas_set(&mas, 0x3600);
  2965. entry = mas_prev(&mas, 0);
  2966. MT_BUG_ON(mt, entry != ptr3);
  2967. mas_pause(&mas);
  2968. entry = mas_prev(&mas, 0);
  2969. MT_BUG_ON(mt, entry != ptr2);
  2970. MT_BUG_ON(mt, mas.index != 0x2000);
  2971. MT_BUG_ON(mt, mas.last != 0x2500);
  2972. MT_BUG_ON(mt, !mas_is_active(&mas));
  2973. /* prev:active -> underflow spanning min */
  2974. entry = mas_prev(&mas, 0x1600);
  2975. MT_BUG_ON(mt, entry != NULL);
  2976. MT_BUG_ON(mt, mas.index != 0x1501);
  2977. MT_BUG_ON(mt, mas.last != 0x1FFF);
  2978. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  2979. /* prev: active ->active, continue */
  2980. entry = mas_prev(&mas, 0);
  2981. MT_BUG_ON(mt, entry != ptr);
  2982. MT_BUG_ON(mt, mas.index != 0x1000);
  2983. MT_BUG_ON(mt, mas.last != 0x1500);
  2984. MT_BUG_ON(mt, !mas_is_active(&mas));
  2985. /* find: start ->active */
  2986. mas_set(&mas, 0);
  2987. entry = mas_find(&mas, ULONG_MAX);
  2988. MT_BUG_ON(mt, entry != ptr);
  2989. MT_BUG_ON(mt, mas.index != 0x1000);
  2990. MT_BUG_ON(mt, mas.last != 0x1500);
  2991. MT_BUG_ON(mt, !mas_is_active(&mas));
  2992. /* find: pause ->active */
  2993. mas_set(&mas, 0);
  2994. mas_pause(&mas);
  2995. entry = mas_find(&mas, ULONG_MAX);
  2996. MT_BUG_ON(mt, entry != ptr);
  2997. MT_BUG_ON(mt, mas.index != 0x1000);
  2998. MT_BUG_ON(mt, mas.last != 0x1500);
  2999. MT_BUG_ON(mt, !mas_is_active(&mas));
  3000. /* find: start ->active on value */
  3001. mas_set(&mas, 1200);
  3002. entry = mas_find(&mas, ULONG_MAX);
  3003. MT_BUG_ON(mt, entry != ptr);
  3004. MT_BUG_ON(mt, mas.index != 0x1000);
  3005. MT_BUG_ON(mt, mas.last != 0x1500);
  3006. MT_BUG_ON(mt, !mas_is_active(&mas));
  3007. /* find:active ->active */
  3008. entry = mas_find(&mas, ULONG_MAX);
  3009. MT_BUG_ON(mt, entry != ptr2);
  3010. MT_BUG_ON(mt, mas.index != 0x2000);
  3011. MT_BUG_ON(mt, mas.last != 0x2500);
  3012. MT_BUG_ON(mt, !mas_is_active(&mas));
  3013. /* find:active -> active (NULL)*/
  3014. entry = mas_find(&mas, 0x2700);
  3015. MT_BUG_ON(mt, entry != NULL);
  3016. MT_BUG_ON(mt, mas.index != 0x2501);
  3017. MT_BUG_ON(mt, mas.last != 0x2FFF);
  3018. MAS_BUG_ON(&mas, !mas_is_active(&mas));
  3019. /* find: overflow ->active */
  3020. entry = mas_find(&mas, 0x5000);
  3021. MT_BUG_ON(mt, entry != ptr3);
  3022. MT_BUG_ON(mt, mas.index != 0x3000);
  3023. MT_BUG_ON(mt, mas.last != 0x3500);
  3024. MT_BUG_ON(mt, !mas_is_active(&mas));
  3025. /* find:active -> active (NULL) end*/
  3026. entry = mas_find(&mas, ULONG_MAX);
  3027. MT_BUG_ON(mt, entry != NULL);
  3028. MT_BUG_ON(mt, mas.index != 0x3501);
  3029. MT_BUG_ON(mt, mas.last != ULONG_MAX);
  3030. MAS_BUG_ON(&mas, !mas_is_active(&mas));
  3031. /* find_rev: active (END) ->active */
  3032. entry = mas_find_rev(&mas, 0);
  3033. MT_BUG_ON(mt, entry != ptr3);
  3034. MT_BUG_ON(mt, mas.index != 0x3000);
  3035. MT_BUG_ON(mt, mas.last != 0x3500);
  3036. MT_BUG_ON(mt, !mas_is_active(&mas));
  3037. /* find_rev:active ->active */
  3038. entry = mas_find_rev(&mas, 0);
  3039. MT_BUG_ON(mt, entry != ptr2);
  3040. MT_BUG_ON(mt, mas.index != 0x2000);
  3041. MT_BUG_ON(mt, mas.last != 0x2500);
  3042. MT_BUG_ON(mt, !mas_is_active(&mas));
  3043. /* find_rev: pause ->active */
  3044. mas_pause(&mas);
  3045. entry = mas_find_rev(&mas, 0);
  3046. MT_BUG_ON(mt, entry != ptr);
  3047. MT_BUG_ON(mt, mas.index != 0x1000);
  3048. MT_BUG_ON(mt, mas.last != 0x1500);
  3049. MT_BUG_ON(mt, !mas_is_active(&mas));
  3050. /* find_rev:active -> underflow */
  3051. entry = mas_find_rev(&mas, 0);
  3052. MT_BUG_ON(mt, entry != NULL);
  3053. MT_BUG_ON(mt, mas.index != 0);
  3054. MT_BUG_ON(mt, mas.last != 0x0FFF);
  3055. MT_BUG_ON(mt, !mas_is_underflow(&mas));
  3056. /* find_rev: start ->active */
  3057. mas_set(&mas, 0x1200);
  3058. entry = mas_find_rev(&mas, 0);
  3059. MT_BUG_ON(mt, entry != ptr);
  3060. MT_BUG_ON(mt, mas.index != 0x1000);
  3061. MT_BUG_ON(mt, mas.last != 0x1500);
  3062. MT_BUG_ON(mt, !mas_is_active(&mas));
  3063. /* mas_walk start ->active */
  3064. mas_set(&mas, 0x1200);
  3065. entry = mas_walk(&mas);
  3066. MT_BUG_ON(mt, entry != ptr);
  3067. MT_BUG_ON(mt, mas.index != 0x1000);
  3068. MT_BUG_ON(mt, mas.last != 0x1500);
  3069. MT_BUG_ON(mt, !mas_is_active(&mas));
  3070. /* mas_walk start ->active */
  3071. mas_set(&mas, 0x1600);
  3072. entry = mas_walk(&mas);
  3073. MT_BUG_ON(mt, entry != NULL);
  3074. MT_BUG_ON(mt, mas.index != 0x1501);
  3075. MT_BUG_ON(mt, mas.last != 0x1fff);
  3076. MT_BUG_ON(mt, !mas_is_active(&mas));
  3077. /* mas_walk pause ->active */
  3078. mas_set(&mas, 0x1200);
  3079. mas_pause(&mas);
  3080. entry = mas_walk(&mas);
  3081. MT_BUG_ON(mt, entry != ptr);
  3082. MT_BUG_ON(mt, mas.index != 0x1000);
  3083. MT_BUG_ON(mt, mas.last != 0x1500);
  3084. MT_BUG_ON(mt, !mas_is_active(&mas));
  3085. /* mas_walk pause -> active */
  3086. mas_set(&mas, 0x1600);
  3087. mas_pause(&mas);
  3088. entry = mas_walk(&mas);
  3089. MT_BUG_ON(mt, entry != NULL);
  3090. MT_BUG_ON(mt, mas.index != 0x1501);
  3091. MT_BUG_ON(mt, mas.last != 0x1fff);
  3092. MT_BUG_ON(mt, !mas_is_active(&mas));
  3093. /* mas_walk none -> active */
  3094. mas_set(&mas, 0x1200);
  3095. mas.status = ma_none;
  3096. entry = mas_walk(&mas);
  3097. MT_BUG_ON(mt, entry != ptr);
  3098. MT_BUG_ON(mt, mas.index != 0x1000);
  3099. MT_BUG_ON(mt, mas.last != 0x1500);
  3100. MT_BUG_ON(mt, !mas_is_active(&mas));
  3101. /* mas_walk none -> active */
  3102. mas_set(&mas, 0x1600);
  3103. mas.status = ma_none;
  3104. entry = mas_walk(&mas);
  3105. MT_BUG_ON(mt, entry != NULL);
  3106. MT_BUG_ON(mt, mas.index != 0x1501);
  3107. MT_BUG_ON(mt, mas.last != 0x1fff);
  3108. MT_BUG_ON(mt, !mas_is_active(&mas));
  3109. /* mas_walk active -> active */
  3110. mas.index = 0x1200;
  3111. mas.last = 0x1200;
  3112. mas.offset = 0;
  3113. entry = mas_walk(&mas);
  3114. MT_BUG_ON(mt, entry != ptr);
  3115. MT_BUG_ON(mt, mas.index != 0x1000);
  3116. MT_BUG_ON(mt, mas.last != 0x1500);
  3117. MT_BUG_ON(mt, !mas_is_active(&mas));
  3118. /* mas_walk active -> active */
  3119. mas.index = 0x1600;
  3120. mas.last = 0x1600;
  3121. entry = mas_walk(&mas);
  3122. MT_BUG_ON(mt, entry != NULL);
  3123. MT_BUG_ON(mt, mas.index != 0x1501);
  3124. MT_BUG_ON(mt, mas.last != 0x1fff);
  3125. MT_BUG_ON(mt, !mas_is_active(&mas));
  3126. mas_unlock(&mas);
  3127. mtree_destroy(mt);
  3128. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  3129. mas_lock(&mas);
  3130. for (int count = 0; count < 30; count++) {
  3131. mas_set(&mas, count);
  3132. mas_store_gfp(&mas, xa_mk_value(count), GFP_KERNEL);
  3133. }
  3134. /* Ensure mas_find works with MA_UNDERFLOW */
  3135. mas_set(&mas, 0);
  3136. entry = mas_walk(&mas);
  3137. mas_set(&mas, 0);
  3138. mas_prev(&mas, 0);
  3139. MT_BUG_ON(mt, mas.status != ma_underflow);
  3140. MT_BUG_ON(mt, mas_find(&mas, ULONG_MAX) != entry);
  3141. /* Restore active on mas_next */
  3142. entry = mas_next(&mas, ULONG_MAX);
  3143. index = mas.index;
  3144. mas_prev(&mas, index);
  3145. MT_BUG_ON(mt, mas.status != ma_underflow);
  3146. MT_BUG_ON(mt, mas_next(&mas, ULONG_MAX) != entry);
  3147. /* Ensure overflow -> active works */
  3148. mas_prev(&mas, 0);
  3149. mas_next(&mas, index - 1);
  3150. MT_BUG_ON(mt, mas.status != ma_overflow);
  3151. MT_BUG_ON(mt, mas_next(&mas, ULONG_MAX) != entry);
  3152. mas_unlock(&mas);
  3153. }
  3154. static noinline void __init alloc_cyclic_testing(struct maple_tree *mt)
  3155. {
  3156. unsigned long location;
  3157. unsigned long next;
  3158. int ret = 0;
  3159. MA_STATE(mas, mt, 0, 0);
  3160. next = 0;
  3161. mtree_lock(mt);
  3162. for (int i = 0; i < 100; i++) {
  3163. mas_alloc_cyclic(&mas, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL);
  3164. MAS_BUG_ON(&mas, i != location - 2);
  3165. MAS_BUG_ON(&mas, mas.index != location);
  3166. MAS_BUG_ON(&mas, mas.last != location);
  3167. MAS_BUG_ON(&mas, i != next - 3);
  3168. }
  3169. mtree_unlock(mt);
  3170. mtree_destroy(mt);
  3171. next = 0;
  3172. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  3173. for (int i = 0; i < 100; i++) {
  3174. mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL);
  3175. MT_BUG_ON(mt, i != location - 2);
  3176. MT_BUG_ON(mt, i != next - 3);
  3177. MT_BUG_ON(mt, mtree_load(mt, location) != mt);
  3178. }
  3179. mtree_destroy(mt);
  3180. /*
  3181. * Issue with reverse search was discovered
  3182. * https://lore.kernel.org/all/20241216060600.287B4C4CED0@smtp.kernel.org/
  3183. * Exhausting the allocation area and forcing the search to wrap needs a
  3184. * mas_reset() in mas_alloc_cyclic().
  3185. */
  3186. next = 0;
  3187. mt_init_flags(mt, MT_FLAGS_ALLOC_RANGE);
  3188. for (int i = 0; i < 1023; i++) {
  3189. mtree_alloc_cyclic(mt, &location, mt, 2, 1024, &next, GFP_KERNEL);
  3190. MT_BUG_ON(mt, i != location - 2);
  3191. MT_BUG_ON(mt, i != next - 3);
  3192. MT_BUG_ON(mt, mtree_load(mt, location) != mt);
  3193. }
  3194. mtree_erase(mt, 123);
  3195. MT_BUG_ON(mt, mtree_load(mt, 123) != NULL);
  3196. mtree_alloc_cyclic(mt, &location, mt, 2, 1024, &next, GFP_KERNEL);
  3197. MT_BUG_ON(mt, 123 != location);
  3198. MT_BUG_ON(mt, 124 != next);
  3199. MT_BUG_ON(mt, mtree_load(mt, location) != mt);
  3200. mtree_erase(mt, 100);
  3201. mtree_alloc_cyclic(mt, &location, mt, 2, 1024, &next, GFP_KERNEL);
  3202. MT_BUG_ON(mt, 100 != location);
  3203. MT_BUG_ON(mt, 101 != next);
  3204. MT_BUG_ON(mt, mtree_load(mt, location) != mt);
  3205. mtree_destroy(mt);
  3206. /* Overflow test */
  3207. next = ULONG_MAX - 1;
  3208. ret = mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL);
  3209. MT_BUG_ON(mt, ret != 0);
  3210. ret = mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL);
  3211. MT_BUG_ON(mt, ret != 0);
  3212. ret = mtree_alloc_cyclic(mt, &location, mt, 2, ULONG_MAX, &next, GFP_KERNEL);
  3213. MT_BUG_ON(mt, ret != 1);
  3214. }
  3215. static DEFINE_MTREE(tree);
  3216. static int __init maple_tree_seed(void)
  3217. {
  3218. unsigned long set[] = { 5015, 5014, 5017, 25, 1000,
  3219. 1001, 1002, 1003, 1005, 0,
  3220. 5003, 5002};
  3221. void *ptr = &set;
  3222. pr_info("\nTEST STARTING\n\n");
  3223. #if defined(BENCH_SLOT_STORE)
  3224. #define BENCH
  3225. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3226. bench_slot_store(&tree);
  3227. mtree_destroy(&tree);
  3228. goto skip;
  3229. #endif
  3230. #if defined(BENCH_NODE_STORE)
  3231. #define BENCH
  3232. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3233. bench_node_store(&tree);
  3234. mtree_destroy(&tree);
  3235. goto skip;
  3236. #endif
  3237. #if defined(BENCH_AWALK)
  3238. #define BENCH
  3239. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3240. bench_awalk(&tree);
  3241. mtree_destroy(&tree);
  3242. goto skip;
  3243. #endif
  3244. #if defined(BENCH_WALK)
  3245. #define BENCH
  3246. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3247. bench_walk(&tree);
  3248. mtree_destroy(&tree);
  3249. goto skip;
  3250. #endif
  3251. #if defined(BENCH_LOAD)
  3252. #define BENCH
  3253. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3254. bench_load(&tree);
  3255. mtree_destroy(&tree);
  3256. goto skip;
  3257. #endif
  3258. #if defined(BENCH_FORK)
  3259. #define BENCH
  3260. bench_forking();
  3261. goto skip;
  3262. #endif
  3263. #if defined(BENCH_MT_FOR_EACH)
  3264. #define BENCH
  3265. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3266. bench_mt_for_each(&tree);
  3267. mtree_destroy(&tree);
  3268. goto skip;
  3269. #endif
  3270. #if defined(BENCH_MAS_FOR_EACH)
  3271. #define BENCH
  3272. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3273. bench_mas_for_each(&tree);
  3274. mtree_destroy(&tree);
  3275. goto skip;
  3276. #endif
  3277. #if defined(BENCH_MAS_PREV)
  3278. #define BENCH
  3279. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3280. bench_mas_prev(&tree);
  3281. mtree_destroy(&tree);
  3282. goto skip;
  3283. #endif
  3284. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3285. check_deficient_node(&tree);
  3286. mtree_destroy(&tree);
  3287. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3288. check_store_null(&tree);
  3289. mtree_destroy(&tree);
  3290. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3291. check_root_expand(&tree);
  3292. mtree_destroy(&tree);
  3293. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3294. check_iteration(&tree);
  3295. mtree_destroy(&tree);
  3296. check_forking();
  3297. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3298. check_mas_store_gfp(&tree);
  3299. mtree_destroy(&tree);
  3300. /* Test ranges (store and insert) */
  3301. mt_init_flags(&tree, 0);
  3302. check_ranges(&tree);
  3303. mtree_destroy(&tree);
  3304. #if defined(CONFIG_64BIT)
  3305. /* These tests have ranges outside of 4GB */
  3306. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3307. check_alloc_range(&tree);
  3308. mtree_destroy(&tree);
  3309. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3310. check_alloc_rev_range(&tree);
  3311. mtree_destroy(&tree);
  3312. #endif
  3313. mt_init_flags(&tree, 0);
  3314. check_load(&tree, set[0], NULL); /* See if 5015 -> NULL */
  3315. check_insert(&tree, set[9], &tree); /* Insert 0 */
  3316. check_load(&tree, set[9], &tree); /* See if 0 -> &tree */
  3317. check_load(&tree, set[0], NULL); /* See if 5015 -> NULL */
  3318. check_insert(&tree, set[10], ptr); /* Insert 5003 */
  3319. check_load(&tree, set[9], &tree); /* See if 0 -> &tree */
  3320. check_load(&tree, set[11], NULL); /* See if 5002 -> NULL */
  3321. check_load(&tree, set[10], ptr); /* See if 5003 -> ptr */
  3322. /* Clear out the tree */
  3323. mtree_destroy(&tree);
  3324. /* Try to insert, insert a dup, and load back what was inserted. */
  3325. mt_init_flags(&tree, 0);
  3326. check_insert(&tree, set[0], &tree); /* Insert 5015 */
  3327. check_dup_insert(&tree, set[0], &tree); /* Insert 5015 again */
  3328. check_load(&tree, set[0], &tree); /* See if 5015 -> &tree */
  3329. /*
  3330. * Second set of tests try to load a value that doesn't exist, inserts
  3331. * a second value, then loads the value again
  3332. */
  3333. check_load(&tree, set[1], NULL); /* See if 5014 -> NULL */
  3334. check_insert(&tree, set[1], ptr); /* insert 5014 -> ptr */
  3335. check_load(&tree, set[1], ptr); /* See if 5014 -> ptr */
  3336. check_load(&tree, set[0], &tree); /* See if 5015 -> &tree */
  3337. /*
  3338. * Tree currently contains:
  3339. * p[0]: 14 -> (nil) p[1]: 15 -> ptr p[2]: 16 -> &tree p[3]: 0 -> (nil)
  3340. */
  3341. check_insert(&tree, set[6], ptr); /* insert 1002 -> ptr */
  3342. check_insert(&tree, set[7], &tree); /* insert 1003 -> &tree */
  3343. check_load(&tree, set[0], &tree); /* See if 5015 -> &tree */
  3344. check_load(&tree, set[1], ptr); /* See if 5014 -> ptr */
  3345. check_load(&tree, set[6], ptr); /* See if 1002 -> ptr */
  3346. check_load(&tree, set[7], &tree); /* 1003 = &tree ? */
  3347. /* Clear out tree */
  3348. mtree_destroy(&tree);
  3349. mt_init_flags(&tree, 0);
  3350. /* Test inserting into a NULL hole. */
  3351. check_insert(&tree, set[5], ptr); /* insert 1001 -> ptr */
  3352. check_insert(&tree, set[7], &tree); /* insert 1003 -> &tree */
  3353. check_insert(&tree, set[6], ptr); /* insert 1002 -> ptr */
  3354. check_load(&tree, set[5], ptr); /* See if 1001 -> ptr */
  3355. check_load(&tree, set[6], ptr); /* See if 1002 -> ptr */
  3356. check_load(&tree, set[7], &tree); /* See if 1003 -> &tree */
  3357. /* Clear out the tree */
  3358. mtree_destroy(&tree);
  3359. mt_init_flags(&tree, 0);
  3360. /*
  3361. * set[] = {5015, 5014, 5017, 25, 1000,
  3362. * 1001, 1002, 1003, 1005, 0,
  3363. * 5003, 5002};
  3364. */
  3365. check_insert(&tree, set[0], ptr); /* 5015 */
  3366. check_insert(&tree, set[1], &tree); /* 5014 */
  3367. check_insert(&tree, set[2], ptr); /* 5017 */
  3368. check_insert(&tree, set[3], &tree); /* 25 */
  3369. check_load(&tree, set[0], ptr);
  3370. check_load(&tree, set[1], &tree);
  3371. check_load(&tree, set[2], ptr);
  3372. check_load(&tree, set[3], &tree);
  3373. check_insert(&tree, set[4], ptr); /* 1000 < Should split. */
  3374. check_load(&tree, set[0], ptr);
  3375. check_load(&tree, set[1], &tree);
  3376. check_load(&tree, set[2], ptr);
  3377. check_load(&tree, set[3], &tree); /*25 */
  3378. check_load(&tree, set[4], ptr);
  3379. check_insert(&tree, set[5], &tree); /* 1001 */
  3380. check_load(&tree, set[0], ptr);
  3381. check_load(&tree, set[1], &tree);
  3382. check_load(&tree, set[2], ptr);
  3383. check_load(&tree, set[3], &tree);
  3384. check_load(&tree, set[4], ptr);
  3385. check_load(&tree, set[5], &tree);
  3386. check_insert(&tree, set[6], ptr);
  3387. check_load(&tree, set[0], ptr);
  3388. check_load(&tree, set[1], &tree);
  3389. check_load(&tree, set[2], ptr);
  3390. check_load(&tree, set[3], &tree);
  3391. check_load(&tree, set[4], ptr);
  3392. check_load(&tree, set[5], &tree);
  3393. check_load(&tree, set[6], ptr);
  3394. check_insert(&tree, set[7], &tree);
  3395. check_load(&tree, set[0], ptr);
  3396. check_insert(&tree, set[8], ptr);
  3397. check_insert(&tree, set[9], &tree);
  3398. check_load(&tree, set[0], ptr);
  3399. check_load(&tree, set[1], &tree);
  3400. check_load(&tree, set[2], ptr);
  3401. check_load(&tree, set[3], &tree);
  3402. check_load(&tree, set[4], ptr);
  3403. check_load(&tree, set[5], &tree);
  3404. check_load(&tree, set[6], ptr);
  3405. check_load(&tree, set[9], &tree);
  3406. mtree_destroy(&tree);
  3407. mt_init_flags(&tree, 0);
  3408. check_seq(&tree, 16, false);
  3409. mtree_destroy(&tree);
  3410. mt_init_flags(&tree, 0);
  3411. check_seq(&tree, 1000, true);
  3412. mtree_destroy(&tree);
  3413. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3414. check_rev_seq(&tree, 1000, true);
  3415. mtree_destroy(&tree);
  3416. check_lower_bound_split(&tree);
  3417. check_upper_bound_split(&tree);
  3418. check_mid_split(&tree);
  3419. mt_init_flags(&tree, 0);
  3420. check_next_entry(&tree);
  3421. check_find(&tree);
  3422. check_find_2(&tree);
  3423. mtree_destroy(&tree);
  3424. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3425. check_prev_entry(&tree);
  3426. mtree_destroy(&tree);
  3427. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3428. check_gap_combining(&tree);
  3429. mtree_destroy(&tree);
  3430. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3431. check_node_overwrite(&tree);
  3432. mtree_destroy(&tree);
  3433. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3434. next_prev_test(&tree);
  3435. mtree_destroy(&tree);
  3436. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3437. check_spanning_relatives(&tree);
  3438. mtree_destroy(&tree);
  3439. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3440. check_rev_find(&tree);
  3441. mtree_destroy(&tree);
  3442. mt_init_flags(&tree, 0);
  3443. check_fuzzer(&tree);
  3444. mtree_destroy(&tree);
  3445. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3446. check_bnode_min_spanning(&tree);
  3447. mtree_destroy(&tree);
  3448. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3449. check_empty_area_window(&tree);
  3450. mtree_destroy(&tree);
  3451. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3452. check_empty_area_fill(&tree);
  3453. mtree_destroy(&tree);
  3454. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3455. check_state_handling(&tree);
  3456. mtree_destroy(&tree);
  3457. mt_init_flags(&tree, MT_FLAGS_ALLOC_RANGE);
  3458. alloc_cyclic_testing(&tree);
  3459. mtree_destroy(&tree);
  3460. #if defined(BENCH)
  3461. skip:
  3462. #endif
  3463. rcu_barrier();
  3464. pr_info("maple_tree: %u of %u tests passed\n",
  3465. atomic_read(&maple_tree_tests_passed),
  3466. atomic_read(&maple_tree_tests_run));
  3467. if (atomic_read(&maple_tree_tests_run) ==
  3468. atomic_read(&maple_tree_tests_passed))
  3469. return 0;
  3470. return -EINVAL;
  3471. }
  3472. static void __exit maple_tree_harvest(void)
  3473. {
  3474. }
  3475. module_init(maple_tree_seed);
  3476. module_exit(maple_tree_harvest);
  3477. MODULE_AUTHOR("Liam R. Howlett <Liam.Howlett@Oracle.com>");
  3478. MODULE_DESCRIPTION("maple tree API test module");
  3479. MODULE_LICENSE("GPL");