basic_api.c 64 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include "basic_api.h"
  3. #include <string.h>
  4. #include <linux/memblock.h>
  5. #define EXPECTED_MEMBLOCK_REGIONS 128
  6. #define FUNC_ADD "memblock_add"
  7. #define FUNC_RESERVE "memblock_reserve"
  8. #define FUNC_REMOVE "memblock_remove"
  9. #define FUNC_FREE "memblock_free"
  10. #define FUNC_TRIM "memblock_trim_memory"
  11. static int memblock_initialization_check(void)
  12. {
  13. PREFIX_PUSH();
  14. ASSERT_NE(memblock.memory.regions, NULL);
  15. ASSERT_EQ(memblock.memory.cnt, 0);
  16. ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS);
  17. ASSERT_EQ(strcmp(memblock.memory.name, "memory"), 0);
  18. ASSERT_NE(memblock.reserved.regions, NULL);
  19. ASSERT_EQ(memblock.reserved.cnt, 0);
  20. ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS);
  21. ASSERT_EQ(strcmp(memblock.reserved.name, "reserved"), 0);
  22. ASSERT_EQ(memblock.bottom_up, false);
  23. ASSERT_EQ(memblock.current_limit, MEMBLOCK_ALLOC_ANYWHERE);
  24. test_pass_pop();
  25. return 0;
  26. }
  27. /*
  28. * A simple test that adds a memory block of a specified base address
  29. * and size to the collection of available memory regions (memblock.memory).
  30. * Expect to create a new entry. The region counter and total memory get
  31. * updated.
  32. */
  33. static int memblock_add_simple_check(void)
  34. {
  35. struct memblock_region *rgn;
  36. rgn = &memblock.memory.regions[0];
  37. struct region r = {
  38. .base = SZ_1G,
  39. .size = SZ_4M
  40. };
  41. PREFIX_PUSH();
  42. reset_memblock_regions();
  43. memblock_add(r.base, r.size);
  44. ASSERT_EQ(rgn->base, r.base);
  45. ASSERT_EQ(rgn->size, r.size);
  46. ASSERT_EQ(memblock.memory.cnt, 1);
  47. ASSERT_EQ(memblock.memory.total_size, r.size);
  48. test_pass_pop();
  49. return 0;
  50. }
  51. /*
  52. * A simple test that adds a memory block of a specified base address, size,
  53. * NUMA node and memory flags to the collection of available memory regions.
  54. * Expect to create a new entry. The region counter and total memory get
  55. * updated.
  56. */
  57. static int memblock_add_node_simple_check(void)
  58. {
  59. struct memblock_region *rgn;
  60. rgn = &memblock.memory.regions[0];
  61. struct region r = {
  62. .base = SZ_1M,
  63. .size = SZ_16M
  64. };
  65. PREFIX_PUSH();
  66. reset_memblock_regions();
  67. memblock_add_node(r.base, r.size, 1, MEMBLOCK_HOTPLUG);
  68. ASSERT_EQ(rgn->base, r.base);
  69. ASSERT_EQ(rgn->size, r.size);
  70. #ifdef CONFIG_NUMA
  71. ASSERT_EQ(rgn->nid, 1);
  72. #endif
  73. ASSERT_EQ(rgn->flags, MEMBLOCK_HOTPLUG);
  74. ASSERT_EQ(memblock.memory.cnt, 1);
  75. ASSERT_EQ(memblock.memory.total_size, r.size);
  76. test_pass_pop();
  77. return 0;
  78. }
  79. /*
  80. * A test that tries to add two memory blocks that don't overlap with one
  81. * another:
  82. *
  83. * | +--------+ +--------+ |
  84. * | | r1 | | r2 | |
  85. * +--------+--------+--------+--------+--+
  86. *
  87. * Expect to add two correctly initialized entries to the collection of
  88. * available memory regions (memblock.memory). The total size and
  89. * region counter fields get updated.
  90. */
  91. static int memblock_add_disjoint_check(void)
  92. {
  93. struct memblock_region *rgn1, *rgn2;
  94. rgn1 = &memblock.memory.regions[0];
  95. rgn2 = &memblock.memory.regions[1];
  96. struct region r1 = {
  97. .base = SZ_1G,
  98. .size = SZ_8K
  99. };
  100. struct region r2 = {
  101. .base = SZ_1G + SZ_16K,
  102. .size = SZ_8K
  103. };
  104. PREFIX_PUSH();
  105. reset_memblock_regions();
  106. memblock_add(r1.base, r1.size);
  107. memblock_add(r2.base, r2.size);
  108. ASSERT_EQ(rgn1->base, r1.base);
  109. ASSERT_EQ(rgn1->size, r1.size);
  110. ASSERT_EQ(rgn2->base, r2.base);
  111. ASSERT_EQ(rgn2->size, r2.size);
  112. ASSERT_EQ(memblock.memory.cnt, 2);
  113. ASSERT_EQ(memblock.memory.total_size, r1.size + r2.size);
  114. test_pass_pop();
  115. return 0;
  116. }
  117. /*
  118. * A test that tries to add two memory blocks r1 and r2, where r2 overlaps
  119. * with the beginning of r1 (that is r1.base < r2.base + r2.size):
  120. *
  121. * | +----+----+------------+ |
  122. * | | |r2 | r1 | |
  123. * +----+----+----+------------+----------+
  124. * ^ ^
  125. * | |
  126. * | r1.base
  127. * |
  128. * r2.base
  129. *
  130. * Expect to merge the two entries into one region that starts at r2.base
  131. * and has size of two regions minus their intersection. The total size of
  132. * the available memory is updated, and the region counter stays the same.
  133. */
  134. static int memblock_add_overlap_top_check(void)
  135. {
  136. struct memblock_region *rgn;
  137. phys_addr_t total_size;
  138. rgn = &memblock.memory.regions[0];
  139. struct region r1 = {
  140. .base = SZ_512M,
  141. .size = SZ_1G
  142. };
  143. struct region r2 = {
  144. .base = SZ_256M,
  145. .size = SZ_512M
  146. };
  147. PREFIX_PUSH();
  148. total_size = (r1.base - r2.base) + r1.size;
  149. reset_memblock_regions();
  150. memblock_add(r1.base, r1.size);
  151. memblock_add(r2.base, r2.size);
  152. ASSERT_EQ(rgn->base, r2.base);
  153. ASSERT_EQ(rgn->size, total_size);
  154. ASSERT_EQ(memblock.memory.cnt, 1);
  155. ASSERT_EQ(memblock.memory.total_size, total_size);
  156. test_pass_pop();
  157. return 0;
  158. }
  159. /*
  160. * A test that tries to add two memory blocks r1 and r2, where r2 overlaps
  161. * with the end of r1 (that is r2.base < r1.base + r1.size):
  162. *
  163. * | +--+------+----------+ |
  164. * | | | r1 | r2 | |
  165. * +--+--+------+----------+--------------+
  166. * ^ ^
  167. * | |
  168. * | r2.base
  169. * |
  170. * r1.base
  171. *
  172. * Expect to merge the two entries into one region that starts at r1.base
  173. * and has size of two regions minus their intersection. The total size of
  174. * the available memory is updated, and the region counter stays the same.
  175. */
  176. static int memblock_add_overlap_bottom_check(void)
  177. {
  178. struct memblock_region *rgn;
  179. phys_addr_t total_size;
  180. rgn = &memblock.memory.regions[0];
  181. struct region r1 = {
  182. .base = SZ_128M,
  183. .size = SZ_512M
  184. };
  185. struct region r2 = {
  186. .base = SZ_256M,
  187. .size = SZ_1G
  188. };
  189. PREFIX_PUSH();
  190. total_size = (r2.base - r1.base) + r2.size;
  191. reset_memblock_regions();
  192. memblock_add(r1.base, r1.size);
  193. memblock_add(r2.base, r2.size);
  194. ASSERT_EQ(rgn->base, r1.base);
  195. ASSERT_EQ(rgn->size, total_size);
  196. ASSERT_EQ(memblock.memory.cnt, 1);
  197. ASSERT_EQ(memblock.memory.total_size, total_size);
  198. test_pass_pop();
  199. return 0;
  200. }
  201. /*
  202. * A test that tries to add two memory blocks r1 and r2, where r2 is
  203. * within the range of r1 (that is r1.base < r2.base &&
  204. * r2.base + r2.size < r1.base + r1.size):
  205. *
  206. * | +-------+--+-----------------------+
  207. * | | |r2| r1 |
  208. * +---+-------+--+-----------------------+
  209. * ^
  210. * |
  211. * r1.base
  212. *
  213. * Expect to merge two entries into one region that stays the same.
  214. * The counter and total size of available memory are not updated.
  215. */
  216. static int memblock_add_within_check(void)
  217. {
  218. struct memblock_region *rgn;
  219. rgn = &memblock.memory.regions[0];
  220. struct region r1 = {
  221. .base = SZ_8M,
  222. .size = SZ_32M
  223. };
  224. struct region r2 = {
  225. .base = SZ_16M,
  226. .size = SZ_1M
  227. };
  228. PREFIX_PUSH();
  229. reset_memblock_regions();
  230. memblock_add(r1.base, r1.size);
  231. memblock_add(r2.base, r2.size);
  232. ASSERT_EQ(rgn->base, r1.base);
  233. ASSERT_EQ(rgn->size, r1.size);
  234. ASSERT_EQ(memblock.memory.cnt, 1);
  235. ASSERT_EQ(memblock.memory.total_size, r1.size);
  236. test_pass_pop();
  237. return 0;
  238. }
  239. /*
  240. * A simple test that tries to add the same memory block twice. Expect
  241. * the counter and total size of available memory to not be updated.
  242. */
  243. static int memblock_add_twice_check(void)
  244. {
  245. struct region r = {
  246. .base = SZ_16K,
  247. .size = SZ_2M
  248. };
  249. PREFIX_PUSH();
  250. reset_memblock_regions();
  251. memblock_add(r.base, r.size);
  252. memblock_add(r.base, r.size);
  253. ASSERT_EQ(memblock.memory.cnt, 1);
  254. ASSERT_EQ(memblock.memory.total_size, r.size);
  255. test_pass_pop();
  256. return 0;
  257. }
  258. /*
  259. * A test that tries to add two memory blocks that don't overlap with one
  260. * another and then add a third memory block in the space between the first two:
  261. *
  262. * | +--------+--------+--------+ |
  263. * | | r1 | r3 | r2 | |
  264. * +--------+--------+--------+--------+--+
  265. *
  266. * Expect to merge the three entries into one region that starts at r1.base
  267. * and has size of r1.size + r2.size + r3.size. The region counter and total
  268. * size of the available memory are updated.
  269. */
  270. static int memblock_add_between_check(void)
  271. {
  272. struct memblock_region *rgn;
  273. phys_addr_t total_size;
  274. rgn = &memblock.memory.regions[0];
  275. struct region r1 = {
  276. .base = SZ_1G,
  277. .size = SZ_8K
  278. };
  279. struct region r2 = {
  280. .base = SZ_1G + SZ_16K,
  281. .size = SZ_8K
  282. };
  283. struct region r3 = {
  284. .base = SZ_1G + SZ_8K,
  285. .size = SZ_8K
  286. };
  287. PREFIX_PUSH();
  288. total_size = r1.size + r2.size + r3.size;
  289. reset_memblock_regions();
  290. memblock_add(r1.base, r1.size);
  291. memblock_add(r2.base, r2.size);
  292. memblock_add(r3.base, r3.size);
  293. ASSERT_EQ(rgn->base, r1.base);
  294. ASSERT_EQ(rgn->size, total_size);
  295. ASSERT_EQ(memblock.memory.cnt, 1);
  296. ASSERT_EQ(memblock.memory.total_size, total_size);
  297. test_pass_pop();
  298. return 0;
  299. }
  300. /*
  301. * A simple test that tries to add a memory block r when r extends past
  302. * PHYS_ADDR_MAX:
  303. *
  304. * +--------+
  305. * | r |
  306. * +--------+
  307. * | +----+
  308. * | | rgn|
  309. * +----------------------------+----+
  310. *
  311. * Expect to add a memory block of size PHYS_ADDR_MAX - r.base. Expect the
  312. * total size of available memory and the counter to be updated.
  313. */
  314. static int memblock_add_near_max_check(void)
  315. {
  316. struct memblock_region *rgn;
  317. phys_addr_t total_size;
  318. rgn = &memblock.memory.regions[0];
  319. struct region r = {
  320. .base = PHYS_ADDR_MAX - SZ_1M,
  321. .size = SZ_2M
  322. };
  323. PREFIX_PUSH();
  324. total_size = PHYS_ADDR_MAX - r.base;
  325. reset_memblock_regions();
  326. memblock_add(r.base, r.size);
  327. ASSERT_EQ(rgn->base, r.base);
  328. ASSERT_EQ(rgn->size, total_size);
  329. ASSERT_EQ(memblock.memory.cnt, 1);
  330. ASSERT_EQ(memblock.memory.total_size, total_size);
  331. test_pass_pop();
  332. return 0;
  333. }
  334. /*
  335. * A test that trying to add the 129th memory block.
  336. * Expect to trigger memblock_double_array() to double the
  337. * memblock.memory.max, find a new valid memory as
  338. * memory.regions.
  339. */
  340. static int memblock_add_many_check(void)
  341. {
  342. int i;
  343. void *orig_region;
  344. struct region r = {
  345. .base = SZ_16K,
  346. .size = SZ_16K,
  347. };
  348. phys_addr_t new_memory_regions_size;
  349. phys_addr_t base, size = SZ_64;
  350. phys_addr_t gap_size = SZ_64;
  351. PREFIX_PUSH();
  352. reset_memblock_regions();
  353. memblock_allow_resize();
  354. dummy_physical_memory_init();
  355. /*
  356. * We allocated enough memory by using dummy_physical_memory_init(), and
  357. * split it into small block. First we split a large enough memory block
  358. * as the memory region which will be choosed by memblock_double_array().
  359. */
  360. base = PAGE_ALIGN(dummy_physical_memory_base());
  361. new_memory_regions_size = PAGE_ALIGN(INIT_MEMBLOCK_REGIONS * 2 *
  362. sizeof(struct memblock_region));
  363. memblock_add(base, new_memory_regions_size);
  364. /* This is the base of small memory block. */
  365. base += new_memory_regions_size + gap_size;
  366. orig_region = memblock.memory.regions;
  367. for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) {
  368. /*
  369. * Add these small block to fulfill the memblock. We keep a
  370. * gap between the nearby memory to avoid being merged.
  371. */
  372. memblock_add(base, size);
  373. base += size + gap_size;
  374. ASSERT_EQ(memblock.memory.cnt, i + 2);
  375. ASSERT_EQ(memblock.memory.total_size, new_memory_regions_size +
  376. (i + 1) * size);
  377. }
  378. /*
  379. * At there, memblock_double_array() has been succeed, check if it
  380. * update the memory.max.
  381. */
  382. ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
  383. /* memblock_double_array() will reserve the memory it used. Check it. */
  384. ASSERT_EQ(memblock.reserved.cnt, 1);
  385. ASSERT_EQ(memblock.reserved.total_size, new_memory_regions_size);
  386. /*
  387. * Now memblock_double_array() works fine. Let's check after the
  388. * double_array(), the memblock_add() still works as normal.
  389. */
  390. memblock_add(r.base, r.size);
  391. ASSERT_EQ(memblock.memory.regions[0].base, r.base);
  392. ASSERT_EQ(memblock.memory.regions[0].size, r.size);
  393. ASSERT_EQ(memblock.memory.cnt, INIT_MEMBLOCK_REGIONS + 2);
  394. ASSERT_EQ(memblock.memory.total_size, INIT_MEMBLOCK_REGIONS * size +
  395. new_memory_regions_size +
  396. r.size);
  397. ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
  398. dummy_physical_memory_cleanup();
  399. /*
  400. * The current memory.regions is occupying a range of memory that
  401. * allocated from dummy_physical_memory_init(). After free the memory,
  402. * we must not use it. So restore the origin memory region to make sure
  403. * the tests can run as normal and not affected by the double array.
  404. */
  405. memblock.memory.regions = orig_region;
  406. memblock.memory.cnt = INIT_MEMBLOCK_REGIONS;
  407. test_pass_pop();
  408. return 0;
  409. }
  410. static int memblock_add_checks(void)
  411. {
  412. prefix_reset();
  413. prefix_push(FUNC_ADD);
  414. test_print("Running %s tests...\n", FUNC_ADD);
  415. memblock_add_simple_check();
  416. memblock_add_node_simple_check();
  417. memblock_add_disjoint_check();
  418. memblock_add_overlap_top_check();
  419. memblock_add_overlap_bottom_check();
  420. memblock_add_within_check();
  421. memblock_add_twice_check();
  422. memblock_add_between_check();
  423. memblock_add_near_max_check();
  424. memblock_add_many_check();
  425. prefix_pop();
  426. return 0;
  427. }
  428. /*
  429. * A simple test that marks a memory block of a specified base address
  430. * and size as reserved and to the collection of reserved memory regions
  431. * (memblock.reserved). Expect to create a new entry. The region counter
  432. * and total memory size are updated.
  433. */
  434. static int memblock_reserve_simple_check(void)
  435. {
  436. struct memblock_region *rgn;
  437. rgn = &memblock.reserved.regions[0];
  438. struct region r = {
  439. .base = SZ_2G,
  440. .size = SZ_128M
  441. };
  442. PREFIX_PUSH();
  443. reset_memblock_regions();
  444. memblock_reserve(r.base, r.size);
  445. ASSERT_EQ(rgn->base, r.base);
  446. ASSERT_EQ(rgn->size, r.size);
  447. test_pass_pop();
  448. return 0;
  449. }
  450. /*
  451. * A test that tries to mark two memory blocks that don't overlap as reserved:
  452. *
  453. * | +--+ +----------------+ |
  454. * | |r1| | r2 | |
  455. * +--------+--+------+----------------+--+
  456. *
  457. * Expect to add two entries to the collection of reserved memory regions
  458. * (memblock.reserved). The total size and region counter for
  459. * memblock.reserved are updated.
  460. */
  461. static int memblock_reserve_disjoint_check(void)
  462. {
  463. struct memblock_region *rgn1, *rgn2;
  464. rgn1 = &memblock.reserved.regions[0];
  465. rgn2 = &memblock.reserved.regions[1];
  466. struct region r1 = {
  467. .base = SZ_256M,
  468. .size = SZ_16M
  469. };
  470. struct region r2 = {
  471. .base = SZ_512M,
  472. .size = SZ_512M
  473. };
  474. PREFIX_PUSH();
  475. reset_memblock_regions();
  476. memblock_reserve(r1.base, r1.size);
  477. memblock_reserve(r2.base, r2.size);
  478. ASSERT_EQ(rgn1->base, r1.base);
  479. ASSERT_EQ(rgn1->size, r1.size);
  480. ASSERT_EQ(rgn2->base, r2.base);
  481. ASSERT_EQ(rgn2->size, r2.size);
  482. ASSERT_EQ(memblock.reserved.cnt, 2);
  483. ASSERT_EQ(memblock.reserved.total_size, r1.size + r2.size);
  484. test_pass_pop();
  485. return 0;
  486. }
  487. /*
  488. * A test that tries to mark two memory blocks r1 and r2 as reserved,
  489. * where r2 overlaps with the beginning of r1 (that is
  490. * r1.base < r2.base + r2.size):
  491. *
  492. * | +--------------+--+--------------+ |
  493. * | | r2 | | r1 | |
  494. * +--+--------------+--+--------------+--+
  495. * ^ ^
  496. * | |
  497. * | r1.base
  498. * |
  499. * r2.base
  500. *
  501. * Expect to merge two entries into one region that starts at r2.base and
  502. * has size of two regions minus their intersection. The total size of the
  503. * reserved memory is updated, and the region counter is not updated.
  504. */
  505. static int memblock_reserve_overlap_top_check(void)
  506. {
  507. struct memblock_region *rgn;
  508. phys_addr_t total_size;
  509. rgn = &memblock.reserved.regions[0];
  510. struct region r1 = {
  511. .base = SZ_1G,
  512. .size = SZ_1G
  513. };
  514. struct region r2 = {
  515. .base = SZ_128M,
  516. .size = SZ_1G
  517. };
  518. PREFIX_PUSH();
  519. total_size = (r1.base - r2.base) + r1.size;
  520. reset_memblock_regions();
  521. memblock_reserve(r1.base, r1.size);
  522. memblock_reserve(r2.base, r2.size);
  523. ASSERT_EQ(rgn->base, r2.base);
  524. ASSERT_EQ(rgn->size, total_size);
  525. ASSERT_EQ(memblock.reserved.cnt, 1);
  526. ASSERT_EQ(memblock.reserved.total_size, total_size);
  527. test_pass_pop();
  528. return 0;
  529. }
  530. /*
  531. * A test that tries to mark two memory blocks r1 and r2 as reserved,
  532. * where r2 overlaps with the end of r1 (that is
  533. * r2.base < r1.base + r1.size):
  534. *
  535. * | +--------------+--+--------------+ |
  536. * | | r1 | | r2 | |
  537. * +--+--------------+--+--------------+--+
  538. * ^ ^
  539. * | |
  540. * | r2.base
  541. * |
  542. * r1.base
  543. *
  544. * Expect to merge two entries into one region that starts at r1.base and
  545. * has size of two regions minus their intersection. The total size of the
  546. * reserved memory is updated, and the region counter is not updated.
  547. */
  548. static int memblock_reserve_overlap_bottom_check(void)
  549. {
  550. struct memblock_region *rgn;
  551. phys_addr_t total_size;
  552. rgn = &memblock.reserved.regions[0];
  553. struct region r1 = {
  554. .base = SZ_2K,
  555. .size = SZ_128K
  556. };
  557. struct region r2 = {
  558. .base = SZ_128K,
  559. .size = SZ_128K
  560. };
  561. PREFIX_PUSH();
  562. total_size = (r2.base - r1.base) + r2.size;
  563. reset_memblock_regions();
  564. memblock_reserve(r1.base, r1.size);
  565. memblock_reserve(r2.base, r2.size);
  566. ASSERT_EQ(rgn->base, r1.base);
  567. ASSERT_EQ(rgn->size, total_size);
  568. ASSERT_EQ(memblock.reserved.cnt, 1);
  569. ASSERT_EQ(memblock.reserved.total_size, total_size);
  570. test_pass_pop();
  571. return 0;
  572. }
  573. /*
  574. * A test that tries to mark two memory blocks r1 and r2 as reserved,
  575. * where r2 is within the range of r1 (that is
  576. * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
  577. *
  578. * | +-----+--+---------------------------|
  579. * | | |r2| r1 |
  580. * +-+-----+--+---------------------------+
  581. * ^ ^
  582. * | |
  583. * | r2.base
  584. * |
  585. * r1.base
  586. *
  587. * Expect to merge two entries into one region that stays the same. The
  588. * counter and total size of available memory are not updated.
  589. */
  590. static int memblock_reserve_within_check(void)
  591. {
  592. struct memblock_region *rgn;
  593. rgn = &memblock.reserved.regions[0];
  594. struct region r1 = {
  595. .base = SZ_1M,
  596. .size = SZ_8M
  597. };
  598. struct region r2 = {
  599. .base = SZ_2M,
  600. .size = SZ_64K
  601. };
  602. PREFIX_PUSH();
  603. reset_memblock_regions();
  604. memblock_reserve(r1.base, r1.size);
  605. memblock_reserve(r2.base, r2.size);
  606. ASSERT_EQ(rgn->base, r1.base);
  607. ASSERT_EQ(rgn->size, r1.size);
  608. ASSERT_EQ(memblock.reserved.cnt, 1);
  609. ASSERT_EQ(memblock.reserved.total_size, r1.size);
  610. test_pass_pop();
  611. return 0;
  612. }
  613. /*
  614. * A simple test that tries to reserve the same memory block twice.
  615. * Expect the region counter and total size of reserved memory to not
  616. * be updated.
  617. */
  618. static int memblock_reserve_twice_check(void)
  619. {
  620. struct region r = {
  621. .base = SZ_16K,
  622. .size = SZ_2M
  623. };
  624. PREFIX_PUSH();
  625. reset_memblock_regions();
  626. memblock_reserve(r.base, r.size);
  627. memblock_reserve(r.base, r.size);
  628. ASSERT_EQ(memblock.reserved.cnt, 1);
  629. ASSERT_EQ(memblock.reserved.total_size, r.size);
  630. test_pass_pop();
  631. return 0;
  632. }
  633. /*
  634. * A test that tries to mark two memory blocks that don't overlap as reserved
  635. * and then reserve a third memory block in the space between the first two:
  636. *
  637. * | +--------+--------+--------+ |
  638. * | | r1 | r3 | r2 | |
  639. * +--------+--------+--------+--------+--+
  640. *
  641. * Expect to merge the three entries into one reserved region that starts at
  642. * r1.base and has size of r1.size + r2.size + r3.size. The region counter and
  643. * total for memblock.reserved are updated.
  644. */
  645. static int memblock_reserve_between_check(void)
  646. {
  647. struct memblock_region *rgn;
  648. phys_addr_t total_size;
  649. rgn = &memblock.reserved.regions[0];
  650. struct region r1 = {
  651. .base = SZ_1G,
  652. .size = SZ_8K
  653. };
  654. struct region r2 = {
  655. .base = SZ_1G + SZ_16K,
  656. .size = SZ_8K
  657. };
  658. struct region r3 = {
  659. .base = SZ_1G + SZ_8K,
  660. .size = SZ_8K
  661. };
  662. PREFIX_PUSH();
  663. total_size = r1.size + r2.size + r3.size;
  664. reset_memblock_regions();
  665. memblock_reserve(r1.base, r1.size);
  666. memblock_reserve(r2.base, r2.size);
  667. memblock_reserve(r3.base, r3.size);
  668. ASSERT_EQ(rgn->base, r1.base);
  669. ASSERT_EQ(rgn->size, total_size);
  670. ASSERT_EQ(memblock.reserved.cnt, 1);
  671. ASSERT_EQ(memblock.reserved.total_size, total_size);
  672. test_pass_pop();
  673. return 0;
  674. }
  675. /*
  676. * A simple test that tries to reserve a memory block r when r extends past
  677. * PHYS_ADDR_MAX:
  678. *
  679. * +--------+
  680. * | r |
  681. * +--------+
  682. * | +----+
  683. * | | rgn|
  684. * +----------------------------+----+
  685. *
  686. * Expect to reserve a memory block of size PHYS_ADDR_MAX - r.base. Expect the
  687. * total size of reserved memory and the counter to be updated.
  688. */
  689. static int memblock_reserve_near_max_check(void)
  690. {
  691. struct memblock_region *rgn;
  692. phys_addr_t total_size;
  693. rgn = &memblock.reserved.regions[0];
  694. struct region r = {
  695. .base = PHYS_ADDR_MAX - SZ_1M,
  696. .size = SZ_2M
  697. };
  698. PREFIX_PUSH();
  699. total_size = PHYS_ADDR_MAX - r.base;
  700. reset_memblock_regions();
  701. memblock_reserve(r.base, r.size);
  702. ASSERT_EQ(rgn->base, r.base);
  703. ASSERT_EQ(rgn->size, total_size);
  704. ASSERT_EQ(memblock.reserved.cnt, 1);
  705. ASSERT_EQ(memblock.reserved.total_size, total_size);
  706. test_pass_pop();
  707. return 0;
  708. }
  709. /*
  710. * A test that trying to reserve the 129th memory block.
  711. * Expect to trigger memblock_double_array() to double the
  712. * memblock.memory.max, find a new valid memory as
  713. * reserved.regions.
  714. */
  715. static int memblock_reserve_many_check(void)
  716. {
  717. int i;
  718. void *orig_region;
  719. struct region r = {
  720. .base = SZ_16K,
  721. .size = SZ_16K,
  722. };
  723. phys_addr_t memory_base = SZ_128K;
  724. phys_addr_t new_reserved_regions_size;
  725. PREFIX_PUSH();
  726. reset_memblock_regions();
  727. memblock_allow_resize();
  728. /* Add a valid memory region used by double_array(). */
  729. dummy_physical_memory_init();
  730. memblock_add(dummy_physical_memory_base(), MEM_SIZE);
  731. for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) {
  732. /* Reserve some fakes memory region to fulfill the memblock. */
  733. memblock_reserve(memory_base, MEM_SIZE);
  734. ASSERT_EQ(memblock.reserved.cnt, i + 1);
  735. ASSERT_EQ(memblock.reserved.total_size, (i + 1) * MEM_SIZE);
  736. /* Keep the gap so these memory region will not be merged. */
  737. memory_base += MEM_SIZE * 2;
  738. }
  739. orig_region = memblock.reserved.regions;
  740. /* This reserve the 129 memory_region, and makes it double array. */
  741. memblock_reserve(memory_base, MEM_SIZE);
  742. /*
  743. * This is the memory region size used by the doubled reserved.regions,
  744. * and it has been reserved due to it has been used. The size is used to
  745. * calculate the total_size that the memblock.reserved have now.
  746. */
  747. new_reserved_regions_size = PAGE_ALIGN((INIT_MEMBLOCK_REGIONS * 2) *
  748. sizeof(struct memblock_region));
  749. /*
  750. * The double_array() will find a free memory region as the new
  751. * reserved.regions, and the used memory region will be reserved, so
  752. * there will be one more region exist in the reserved memblock. And the
  753. * one more reserved region's size is new_reserved_regions_size.
  754. */
  755. ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 2);
  756. ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
  757. new_reserved_regions_size);
  758. ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
  759. /*
  760. * Now memblock_double_array() works fine. Let's check after the
  761. * double_array(), the memblock_reserve() still works as normal.
  762. */
  763. memblock_reserve(r.base, r.size);
  764. ASSERT_EQ(memblock.reserved.regions[0].base, r.base);
  765. ASSERT_EQ(memblock.reserved.regions[0].size, r.size);
  766. ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 3);
  767. ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
  768. new_reserved_regions_size +
  769. r.size);
  770. ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
  771. dummy_physical_memory_cleanup();
  772. /*
  773. * The current reserved.regions is occupying a range of memory that
  774. * allocated from dummy_physical_memory_init(). After free the memory,
  775. * we must not use it. So restore the origin memory region to make sure
  776. * the tests can run as normal and not affected by the double array.
  777. */
  778. memblock.reserved.regions = orig_region;
  779. memblock.reserved.cnt = INIT_MEMBLOCK_RESERVED_REGIONS;
  780. test_pass_pop();
  781. return 0;
  782. }
  783. /*
  784. * A test that trying to reserve the 129th memory block at all locations.
  785. * Expect to trigger memblock_double_array() to double the
  786. * memblock.memory.max, find a new valid memory as reserved.regions.
  787. *
  788. * 0 1 2 128
  789. * +-------+ +-------+ +-------+ +-------+
  790. * | 32K | | 32K | | 32K | ... | 32K |
  791. * +-------+-------+-------+-------+-------+ +-------+
  792. * |<-32K->| |<-32K->|
  793. *
  794. */
  795. /* Keep the gap so these memory region will not be merged. */
  796. #define MEMORY_BASE(idx) (SZ_128K + (MEM_SIZE * 2) * (idx))
  797. static int memblock_reserve_all_locations_check(void)
  798. {
  799. int i, skip;
  800. void *orig_region;
  801. struct region r = {
  802. .base = SZ_16K,
  803. .size = SZ_16K,
  804. };
  805. phys_addr_t new_reserved_regions_size;
  806. PREFIX_PUSH();
  807. /* Reserve the 129th memory block for all possible positions*/
  808. for (skip = 0; skip < INIT_MEMBLOCK_REGIONS + 1; skip++) {
  809. reset_memblock_regions();
  810. memblock_allow_resize();
  811. /* Add a valid memory region used by double_array(). */
  812. dummy_physical_memory_init();
  813. memblock_add(dummy_physical_memory_base(), MEM_SIZE);
  814. for (i = 0; i < INIT_MEMBLOCK_REGIONS + 1; i++) {
  815. if (i == skip)
  816. continue;
  817. /* Reserve some fakes memory region to fulfill the memblock. */
  818. memblock_reserve(MEMORY_BASE(i), MEM_SIZE);
  819. if (i < skip) {
  820. ASSERT_EQ(memblock.reserved.cnt, i + 1);
  821. ASSERT_EQ(memblock.reserved.total_size, (i + 1) * MEM_SIZE);
  822. } else {
  823. ASSERT_EQ(memblock.reserved.cnt, i);
  824. ASSERT_EQ(memblock.reserved.total_size, i * MEM_SIZE);
  825. }
  826. }
  827. orig_region = memblock.reserved.regions;
  828. /* This reserve the 129 memory_region, and makes it double array. */
  829. memblock_reserve(MEMORY_BASE(skip), MEM_SIZE);
  830. /*
  831. * This is the memory region size used by the doubled reserved.regions,
  832. * and it has been reserved due to it has been used. The size is used to
  833. * calculate the total_size that the memblock.reserved have now.
  834. */
  835. new_reserved_regions_size = PAGE_ALIGN((INIT_MEMBLOCK_REGIONS * 2) *
  836. sizeof(struct memblock_region));
  837. /*
  838. * The double_array() will find a free memory region as the new
  839. * reserved.regions, and the used memory region will be reserved, so
  840. * there will be one more region exist in the reserved memblock. And the
  841. * one more reserved region's size is new_reserved_regions_size.
  842. */
  843. ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 2);
  844. ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
  845. new_reserved_regions_size);
  846. ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
  847. /*
  848. * Now memblock_double_array() works fine. Let's check after the
  849. * double_array(), the memblock_reserve() still works as normal.
  850. */
  851. memblock_reserve(r.base, r.size);
  852. ASSERT_EQ(memblock.reserved.regions[0].base, r.base);
  853. ASSERT_EQ(memblock.reserved.regions[0].size, r.size);
  854. ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 3);
  855. ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
  856. new_reserved_regions_size +
  857. r.size);
  858. ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
  859. dummy_physical_memory_cleanup();
  860. /*
  861. * The current reserved.regions is occupying a range of memory that
  862. * allocated from dummy_physical_memory_init(). After free the memory,
  863. * we must not use it. So restore the origin memory region to make sure
  864. * the tests can run as normal and not affected by the double array.
  865. */
  866. memblock.reserved.regions = orig_region;
  867. memblock.reserved.cnt = INIT_MEMBLOCK_RESERVED_REGIONS;
  868. }
  869. test_pass_pop();
  870. return 0;
  871. }
  872. /*
  873. * A test that trying to reserve the 129th memory block at all locations.
  874. * Expect to trigger memblock_double_array() to double the
  875. * memblock.memory.max, find a new valid memory as reserved.regions. And make
  876. * sure it doesn't conflict with the range we want to reserve.
  877. *
  878. * For example, we have 128 regions in reserved and now want to reserve
  879. * the skipped one. Since reserved is full, memblock_double_array() would find
  880. * an available range in memory for the new array. We intended to put two
  881. * ranges in memory with one is the exact range of the skipped one. Before
  882. * commit 48c3b583bbdd ("mm/memblock: fix overlapping allocation when doubling
  883. * reserved array"), the new array would sits in the skipped range which is a
  884. * conflict. The expected new array should be allocated from memory.regions[0].
  885. *
  886. * 0 1
  887. * memory +-------+ +-------+
  888. * | 32K | | 32K |
  889. * +-------+ ------+-------+-------+-------+
  890. * |<-32K->|<-32K->|<-32K->|
  891. *
  892. * 0 skipped 127
  893. * reserved +-------+ ......... +-------+
  894. * | 32K | . 32K . ... | 32K |
  895. * +-------+-------+-------+ +-------+
  896. * |<-32K->|
  897. * ^
  898. * |
  899. * |
  900. * skipped one
  901. */
  902. /* Keep the gap so these memory region will not be merged. */
  903. #define MEMORY_BASE_OFFSET(idx, offset) ((offset) + (MEM_SIZE * 2) * (idx))
  904. static int memblock_reserve_many_may_conflict_check(void)
  905. {
  906. int i, skip;
  907. void *orig_region;
  908. struct region r = {
  909. .base = SZ_16K,
  910. .size = SZ_16K,
  911. };
  912. phys_addr_t new_reserved_regions_size;
  913. /*
  914. * 0 1 129
  915. * +---+ +---+ +---+
  916. * |32K| |32K| .. |32K|
  917. * +---+ +---+ +---+
  918. *
  919. * Pre-allocate the range for 129 memory block + one range for double
  920. * memblock.reserved.regions at idx 0.
  921. */
  922. dummy_physical_memory_init();
  923. phys_addr_t memory_base = dummy_physical_memory_base();
  924. phys_addr_t offset = PAGE_ALIGN(memory_base);
  925. PREFIX_PUSH();
  926. /* Reserve the 129th memory block for all possible positions*/
  927. for (skip = 1; skip <= INIT_MEMBLOCK_REGIONS + 1; skip++) {
  928. reset_memblock_regions();
  929. memblock_allow_resize();
  930. reset_memblock_attributes();
  931. /* Add a valid memory region used by double_array(). */
  932. memblock_add(MEMORY_BASE_OFFSET(0, offset), MEM_SIZE);
  933. /*
  934. * Add a memory region which will be reserved as 129th memory
  935. * region. This is not expected to be used by double_array().
  936. */
  937. memblock_add(MEMORY_BASE_OFFSET(skip, offset), MEM_SIZE);
  938. for (i = 1; i <= INIT_MEMBLOCK_REGIONS + 1; i++) {
  939. if (i == skip)
  940. continue;
  941. /* Reserve some fakes memory region to fulfill the memblock. */
  942. memblock_reserve(MEMORY_BASE_OFFSET(i, offset), MEM_SIZE);
  943. if (i < skip) {
  944. ASSERT_EQ(memblock.reserved.cnt, i);
  945. ASSERT_EQ(memblock.reserved.total_size, i * MEM_SIZE);
  946. } else {
  947. ASSERT_EQ(memblock.reserved.cnt, i - 1);
  948. ASSERT_EQ(memblock.reserved.total_size, (i - 1) * MEM_SIZE);
  949. }
  950. }
  951. orig_region = memblock.reserved.regions;
  952. /* This reserve the 129 memory_region, and makes it double array. */
  953. memblock_reserve(MEMORY_BASE_OFFSET(skip, offset), MEM_SIZE);
  954. /*
  955. * This is the memory region size used by the doubled reserved.regions,
  956. * and it has been reserved due to it has been used. The size is used to
  957. * calculate the total_size that the memblock.reserved have now.
  958. */
  959. new_reserved_regions_size = PAGE_ALIGN((INIT_MEMBLOCK_REGIONS * 2) *
  960. sizeof(struct memblock_region));
  961. /*
  962. * The double_array() will find a free memory region as the new
  963. * reserved.regions, and the used memory region will be reserved, so
  964. * there will be one more region exist in the reserved memblock. And the
  965. * one more reserved region's size is new_reserved_regions_size.
  966. */
  967. ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 2);
  968. ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
  969. new_reserved_regions_size);
  970. ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
  971. /*
  972. * The first reserved region is allocated for double array
  973. * with the size of new_reserved_regions_size and the base to be
  974. * MEMORY_BASE_OFFSET(0, offset) + SZ_32K - new_reserved_regions_size
  975. */
  976. ASSERT_EQ(memblock.reserved.regions[0].base + memblock.reserved.regions[0].size,
  977. MEMORY_BASE_OFFSET(0, offset) + SZ_32K);
  978. ASSERT_EQ(memblock.reserved.regions[0].size, new_reserved_regions_size);
  979. /*
  980. * Now memblock_double_array() works fine. Let's check after the
  981. * double_array(), the memblock_reserve() still works as normal.
  982. */
  983. memblock_reserve(r.base, r.size);
  984. ASSERT_EQ(memblock.reserved.regions[0].base, r.base);
  985. ASSERT_EQ(memblock.reserved.regions[0].size, r.size);
  986. ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 3);
  987. ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
  988. new_reserved_regions_size +
  989. r.size);
  990. ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
  991. /*
  992. * The current reserved.regions is occupying a range of memory that
  993. * allocated from dummy_physical_memory_init(). After free the memory,
  994. * we must not use it. So restore the origin memory region to make sure
  995. * the tests can run as normal and not affected by the double array.
  996. */
  997. memblock.reserved.regions = orig_region;
  998. memblock.reserved.cnt = INIT_MEMBLOCK_RESERVED_REGIONS;
  999. }
  1000. dummy_physical_memory_cleanup();
  1001. test_pass_pop();
  1002. return 0;
  1003. }
  1004. static int memblock_reserve_checks(void)
  1005. {
  1006. prefix_reset();
  1007. prefix_push(FUNC_RESERVE);
  1008. test_print("Running %s tests...\n", FUNC_RESERVE);
  1009. memblock_reserve_simple_check();
  1010. memblock_reserve_disjoint_check();
  1011. memblock_reserve_overlap_top_check();
  1012. memblock_reserve_overlap_bottom_check();
  1013. memblock_reserve_within_check();
  1014. memblock_reserve_twice_check();
  1015. memblock_reserve_between_check();
  1016. memblock_reserve_near_max_check();
  1017. memblock_reserve_many_check();
  1018. memblock_reserve_all_locations_check();
  1019. memblock_reserve_many_may_conflict_check();
  1020. prefix_pop();
  1021. return 0;
  1022. }
  1023. /*
  1024. * A simple test that tries to remove a region r1 from the array of
  1025. * available memory regions. By "removing" a region we mean overwriting it
  1026. * with the next region r2 in memblock.memory:
  1027. *
  1028. * | ...... +----------------+ |
  1029. * | : r1 : | r2 | |
  1030. * +--+----+----------+----------------+--+
  1031. * ^
  1032. * |
  1033. * rgn.base
  1034. *
  1035. * Expect to add two memory blocks r1 and r2 and then remove r1 so that
  1036. * r2 is the first available region. The region counter and total size
  1037. * are updated.
  1038. */
  1039. static int memblock_remove_simple_check(void)
  1040. {
  1041. struct memblock_region *rgn;
  1042. rgn = &memblock.memory.regions[0];
  1043. struct region r1 = {
  1044. .base = SZ_2K,
  1045. .size = SZ_4K
  1046. };
  1047. struct region r2 = {
  1048. .base = SZ_128K,
  1049. .size = SZ_4M
  1050. };
  1051. PREFIX_PUSH();
  1052. reset_memblock_regions();
  1053. memblock_add(r1.base, r1.size);
  1054. memblock_add(r2.base, r2.size);
  1055. memblock_remove(r1.base, r1.size);
  1056. ASSERT_EQ(rgn->base, r2.base);
  1057. ASSERT_EQ(rgn->size, r2.size);
  1058. ASSERT_EQ(memblock.memory.cnt, 1);
  1059. ASSERT_EQ(memblock.memory.total_size, r2.size);
  1060. test_pass_pop();
  1061. return 0;
  1062. }
  1063. /*
  1064. * A test that tries to remove a region r2 that was not registered as
  1065. * available memory (i.e. has no corresponding entry in memblock.memory):
  1066. *
  1067. * +----------------+
  1068. * | r2 |
  1069. * +----------------+
  1070. * | +----+ |
  1071. * | | r1 | |
  1072. * +--+----+------------------------------+
  1073. * ^
  1074. * |
  1075. * rgn.base
  1076. *
  1077. * Expect the array, regions counter and total size to not be modified.
  1078. */
  1079. static int memblock_remove_absent_check(void)
  1080. {
  1081. struct memblock_region *rgn;
  1082. rgn = &memblock.memory.regions[0];
  1083. struct region r1 = {
  1084. .base = SZ_512K,
  1085. .size = SZ_4M
  1086. };
  1087. struct region r2 = {
  1088. .base = SZ_64M,
  1089. .size = SZ_1G
  1090. };
  1091. PREFIX_PUSH();
  1092. reset_memblock_regions();
  1093. memblock_add(r1.base, r1.size);
  1094. memblock_remove(r2.base, r2.size);
  1095. ASSERT_EQ(rgn->base, r1.base);
  1096. ASSERT_EQ(rgn->size, r1.size);
  1097. ASSERT_EQ(memblock.memory.cnt, 1);
  1098. ASSERT_EQ(memblock.memory.total_size, r1.size);
  1099. test_pass_pop();
  1100. return 0;
  1101. }
  1102. /*
  1103. * A test that tries to remove a region r2 that overlaps with the
  1104. * beginning of the already existing entry r1
  1105. * (that is r1.base < r2.base + r2.size):
  1106. *
  1107. * +-----------------+
  1108. * | r2 |
  1109. * +-----------------+
  1110. * | .........+--------+ |
  1111. * | : r1 | rgn | |
  1112. * +-----------------+--------+--------+--+
  1113. * ^ ^
  1114. * | |
  1115. * | rgn.base
  1116. * r1.base
  1117. *
  1118. * Expect that only the intersection of both regions is removed from the
  1119. * available memory pool. The regions counter and total size are updated.
  1120. */
  1121. static int memblock_remove_overlap_top_check(void)
  1122. {
  1123. struct memblock_region *rgn;
  1124. phys_addr_t r1_end, r2_end, total_size;
  1125. rgn = &memblock.memory.regions[0];
  1126. struct region r1 = {
  1127. .base = SZ_32M,
  1128. .size = SZ_32M
  1129. };
  1130. struct region r2 = {
  1131. .base = SZ_16M,
  1132. .size = SZ_32M
  1133. };
  1134. PREFIX_PUSH();
  1135. r1_end = r1.base + r1.size;
  1136. r2_end = r2.base + r2.size;
  1137. total_size = r1_end - r2_end;
  1138. reset_memblock_regions();
  1139. memblock_add(r1.base, r1.size);
  1140. memblock_remove(r2.base, r2.size);
  1141. ASSERT_EQ(rgn->base, r1.base + r2.base);
  1142. ASSERT_EQ(rgn->size, total_size);
  1143. ASSERT_EQ(memblock.memory.cnt, 1);
  1144. ASSERT_EQ(memblock.memory.total_size, total_size);
  1145. test_pass_pop();
  1146. return 0;
  1147. }
  1148. /*
  1149. * A test that tries to remove a region r2 that overlaps with the end of
  1150. * the already existing region r1 (that is r2.base < r1.base + r1.size):
  1151. *
  1152. * +--------------------------------+
  1153. * | r2 |
  1154. * +--------------------------------+
  1155. * | +---+..... |
  1156. * | |rgn| r1 : |
  1157. * +-+---+----+---------------------------+
  1158. * ^
  1159. * |
  1160. * r1.base
  1161. *
  1162. * Expect that only the intersection of both regions is removed from the
  1163. * available memory pool. The regions counter and total size are updated.
  1164. */
  1165. static int memblock_remove_overlap_bottom_check(void)
  1166. {
  1167. struct memblock_region *rgn;
  1168. phys_addr_t total_size;
  1169. rgn = &memblock.memory.regions[0];
  1170. struct region r1 = {
  1171. .base = SZ_2M,
  1172. .size = SZ_64M
  1173. };
  1174. struct region r2 = {
  1175. .base = SZ_32M,
  1176. .size = SZ_256M
  1177. };
  1178. PREFIX_PUSH();
  1179. total_size = r2.base - r1.base;
  1180. reset_memblock_regions();
  1181. memblock_add(r1.base, r1.size);
  1182. memblock_remove(r2.base, r2.size);
  1183. ASSERT_EQ(rgn->base, r1.base);
  1184. ASSERT_EQ(rgn->size, total_size);
  1185. ASSERT_EQ(memblock.memory.cnt, 1);
  1186. ASSERT_EQ(memblock.memory.total_size, total_size);
  1187. test_pass_pop();
  1188. return 0;
  1189. }
  1190. /*
  1191. * A test that tries to remove a region r2 that is within the range of
  1192. * the already existing entry r1 (that is
  1193. * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
  1194. *
  1195. * +----+
  1196. * | r2 |
  1197. * +----+
  1198. * | +-------------+....+---------------+ |
  1199. * | | rgn1 | r1 | rgn2 | |
  1200. * +-+-------------+----+---------------+-+
  1201. * ^
  1202. * |
  1203. * r1.base
  1204. *
  1205. * Expect that the region is split into two - one that ends at r2.base and
  1206. * another that starts at r2.base + r2.size, with appropriate sizes. The
  1207. * region counter and total size are updated.
  1208. */
  1209. static int memblock_remove_within_check(void)
  1210. {
  1211. struct memblock_region *rgn1, *rgn2;
  1212. phys_addr_t r1_size, r2_size, total_size;
  1213. rgn1 = &memblock.memory.regions[0];
  1214. rgn2 = &memblock.memory.regions[1];
  1215. struct region r1 = {
  1216. .base = SZ_1M,
  1217. .size = SZ_32M
  1218. };
  1219. struct region r2 = {
  1220. .base = SZ_16M,
  1221. .size = SZ_1M
  1222. };
  1223. PREFIX_PUSH();
  1224. r1_size = r2.base - r1.base;
  1225. r2_size = (r1.base + r1.size) - (r2.base + r2.size);
  1226. total_size = r1_size + r2_size;
  1227. reset_memblock_regions();
  1228. memblock_add(r1.base, r1.size);
  1229. memblock_remove(r2.base, r2.size);
  1230. ASSERT_EQ(rgn1->base, r1.base);
  1231. ASSERT_EQ(rgn1->size, r1_size);
  1232. ASSERT_EQ(rgn2->base, r2.base + r2.size);
  1233. ASSERT_EQ(rgn2->size, r2_size);
  1234. ASSERT_EQ(memblock.memory.cnt, 2);
  1235. ASSERT_EQ(memblock.memory.total_size, total_size);
  1236. test_pass_pop();
  1237. return 0;
  1238. }
  1239. /*
  1240. * A simple test that tries to remove a region r1 from the array of
  1241. * available memory regions when r1 is the only available region.
  1242. * Expect to add a memory block r1 and then remove r1 so that a dummy
  1243. * region is added. The region counter stays the same, and the total size
  1244. * is updated.
  1245. */
  1246. static int memblock_remove_only_region_check(void)
  1247. {
  1248. struct memblock_region *rgn;
  1249. rgn = &memblock.memory.regions[0];
  1250. struct region r1 = {
  1251. .base = SZ_2K,
  1252. .size = SZ_4K
  1253. };
  1254. PREFIX_PUSH();
  1255. reset_memblock_regions();
  1256. memblock_add(r1.base, r1.size);
  1257. memblock_remove(r1.base, r1.size);
  1258. ASSERT_EQ(rgn->base, 0);
  1259. ASSERT_EQ(rgn->size, 0);
  1260. ASSERT_EQ(memblock.memory.cnt, 0);
  1261. ASSERT_EQ(memblock.memory.total_size, 0);
  1262. test_pass_pop();
  1263. return 0;
  1264. }
  1265. /*
  1266. * A simple test that tries remove a region r2 from the array of available
  1267. * memory regions when r2 extends past PHYS_ADDR_MAX:
  1268. *
  1269. * +--------+
  1270. * | r2 |
  1271. * +--------+
  1272. * | +---+....+
  1273. * | |rgn| |
  1274. * +------------------------+---+----+
  1275. *
  1276. * Expect that only the portion between PHYS_ADDR_MAX and r2.base is removed.
  1277. * Expect the total size of available memory to be updated and the counter to
  1278. * not be updated.
  1279. */
  1280. static int memblock_remove_near_max_check(void)
  1281. {
  1282. struct memblock_region *rgn;
  1283. phys_addr_t total_size;
  1284. rgn = &memblock.memory.regions[0];
  1285. struct region r1 = {
  1286. .base = PHYS_ADDR_MAX - SZ_2M,
  1287. .size = SZ_2M
  1288. };
  1289. struct region r2 = {
  1290. .base = PHYS_ADDR_MAX - SZ_1M,
  1291. .size = SZ_2M
  1292. };
  1293. PREFIX_PUSH();
  1294. total_size = r1.size - (PHYS_ADDR_MAX - r2.base);
  1295. reset_memblock_regions();
  1296. memblock_add(r1.base, r1.size);
  1297. memblock_remove(r2.base, r2.size);
  1298. ASSERT_EQ(rgn->base, r1.base);
  1299. ASSERT_EQ(rgn->size, total_size);
  1300. ASSERT_EQ(memblock.memory.cnt, 1);
  1301. ASSERT_EQ(memblock.memory.total_size, total_size);
  1302. test_pass_pop();
  1303. return 0;
  1304. }
  1305. /*
  1306. * A test that tries to remove a region r3 that overlaps with two existing
  1307. * regions r1 and r2:
  1308. *
  1309. * +----------------+
  1310. * | r3 |
  1311. * +----------------+
  1312. * | +----+..... ........+--------+
  1313. * | | |r1 : : |r2 | |
  1314. * +----+----+----+---+-------+--------+-----+
  1315. *
  1316. * Expect that only the intersections of r1 with r3 and r2 with r3 are removed
  1317. * from the available memory pool. Expect the total size of available memory to
  1318. * be updated and the counter to not be updated.
  1319. */
  1320. static int memblock_remove_overlap_two_check(void)
  1321. {
  1322. struct memblock_region *rgn1, *rgn2;
  1323. phys_addr_t new_r1_size, new_r2_size, r2_end, r3_end, total_size;
  1324. rgn1 = &memblock.memory.regions[0];
  1325. rgn2 = &memblock.memory.regions[1];
  1326. struct region r1 = {
  1327. .base = SZ_16M,
  1328. .size = SZ_32M
  1329. };
  1330. struct region r2 = {
  1331. .base = SZ_64M,
  1332. .size = SZ_64M
  1333. };
  1334. struct region r3 = {
  1335. .base = SZ_32M,
  1336. .size = SZ_64M
  1337. };
  1338. PREFIX_PUSH();
  1339. r2_end = r2.base + r2.size;
  1340. r3_end = r3.base + r3.size;
  1341. new_r1_size = r3.base - r1.base;
  1342. new_r2_size = r2_end - r3_end;
  1343. total_size = new_r1_size + new_r2_size;
  1344. reset_memblock_regions();
  1345. memblock_add(r1.base, r1.size);
  1346. memblock_add(r2.base, r2.size);
  1347. memblock_remove(r3.base, r3.size);
  1348. ASSERT_EQ(rgn1->base, r1.base);
  1349. ASSERT_EQ(rgn1->size, new_r1_size);
  1350. ASSERT_EQ(rgn2->base, r3_end);
  1351. ASSERT_EQ(rgn2->size, new_r2_size);
  1352. ASSERT_EQ(memblock.memory.cnt, 2);
  1353. ASSERT_EQ(memblock.memory.total_size, total_size);
  1354. test_pass_pop();
  1355. return 0;
  1356. }
  1357. static int memblock_remove_checks(void)
  1358. {
  1359. prefix_reset();
  1360. prefix_push(FUNC_REMOVE);
  1361. test_print("Running %s tests...\n", FUNC_REMOVE);
  1362. memblock_remove_simple_check();
  1363. memblock_remove_absent_check();
  1364. memblock_remove_overlap_top_check();
  1365. memblock_remove_overlap_bottom_check();
  1366. memblock_remove_within_check();
  1367. memblock_remove_only_region_check();
  1368. memblock_remove_near_max_check();
  1369. memblock_remove_overlap_two_check();
  1370. prefix_pop();
  1371. return 0;
  1372. }
  1373. /*
  1374. * A simple test that tries to free a memory block r1 that was marked
  1375. * earlier as reserved. By "freeing" a region we mean overwriting it with
  1376. * the next entry r2 in memblock.reserved:
  1377. *
  1378. * | ...... +----+ |
  1379. * | : r1 : | r2 | |
  1380. * +--------------+----+-----------+----+-+
  1381. * ^
  1382. * |
  1383. * rgn.base
  1384. *
  1385. * Expect to reserve two memory regions and then erase r1 region with the
  1386. * value of r2. The region counter and total size are updated.
  1387. */
  1388. static int memblock_free_simple_check(void)
  1389. {
  1390. struct memblock_region *rgn;
  1391. rgn = &memblock.reserved.regions[0];
  1392. struct region r1 = {
  1393. .base = SZ_4M,
  1394. .size = SZ_1M
  1395. };
  1396. struct region r2 = {
  1397. .base = SZ_8M,
  1398. .size = SZ_1M
  1399. };
  1400. PREFIX_PUSH();
  1401. reset_memblock_regions();
  1402. memblock_reserve(r1.base, r1.size);
  1403. memblock_reserve(r2.base, r2.size);
  1404. memblock_free((void *)r1.base, r1.size);
  1405. ASSERT_EQ(rgn->base, r2.base);
  1406. ASSERT_EQ(rgn->size, r2.size);
  1407. ASSERT_EQ(memblock.reserved.cnt, 1);
  1408. ASSERT_EQ(memblock.reserved.total_size, r2.size);
  1409. test_pass_pop();
  1410. return 0;
  1411. }
  1412. /*
  1413. * A test that tries to free a region r2 that was not marked as reserved
  1414. * (i.e. has no corresponding entry in memblock.reserved):
  1415. *
  1416. * +----------------+
  1417. * | r2 |
  1418. * +----------------+
  1419. * | +----+ |
  1420. * | | r1 | |
  1421. * +--+----+------------------------------+
  1422. * ^
  1423. * |
  1424. * rgn.base
  1425. *
  1426. * The array, regions counter and total size are not modified.
  1427. */
  1428. static int memblock_free_absent_check(void)
  1429. {
  1430. struct memblock_region *rgn;
  1431. rgn = &memblock.reserved.regions[0];
  1432. struct region r1 = {
  1433. .base = SZ_2M,
  1434. .size = SZ_8K
  1435. };
  1436. struct region r2 = {
  1437. .base = SZ_16M,
  1438. .size = SZ_128M
  1439. };
  1440. PREFIX_PUSH();
  1441. reset_memblock_regions();
  1442. memblock_reserve(r1.base, r1.size);
  1443. memblock_free((void *)r2.base, r2.size);
  1444. ASSERT_EQ(rgn->base, r1.base);
  1445. ASSERT_EQ(rgn->size, r1.size);
  1446. ASSERT_EQ(memblock.reserved.cnt, 1);
  1447. ASSERT_EQ(memblock.reserved.total_size, r1.size);
  1448. test_pass_pop();
  1449. return 0;
  1450. }
  1451. /*
  1452. * A test that tries to free a region r2 that overlaps with the beginning
  1453. * of the already existing entry r1 (that is r1.base < r2.base + r2.size):
  1454. *
  1455. * +----+
  1456. * | r2 |
  1457. * +----+
  1458. * | ...+--------------+ |
  1459. * | : | r1 | |
  1460. * +----+--+--------------+---------------+
  1461. * ^ ^
  1462. * | |
  1463. * | rgn.base
  1464. * |
  1465. * r1.base
  1466. *
  1467. * Expect that only the intersection of both regions is freed. The
  1468. * regions counter and total size are updated.
  1469. */
  1470. static int memblock_free_overlap_top_check(void)
  1471. {
  1472. struct memblock_region *rgn;
  1473. phys_addr_t total_size;
  1474. rgn = &memblock.reserved.regions[0];
  1475. struct region r1 = {
  1476. .base = SZ_8M,
  1477. .size = SZ_32M
  1478. };
  1479. struct region r2 = {
  1480. .base = SZ_1M,
  1481. .size = SZ_8M
  1482. };
  1483. PREFIX_PUSH();
  1484. total_size = (r1.size + r1.base) - (r2.base + r2.size);
  1485. reset_memblock_regions();
  1486. memblock_reserve(r1.base, r1.size);
  1487. memblock_free((void *)r2.base, r2.size);
  1488. ASSERT_EQ(rgn->base, r2.base + r2.size);
  1489. ASSERT_EQ(rgn->size, total_size);
  1490. ASSERT_EQ(memblock.reserved.cnt, 1);
  1491. ASSERT_EQ(memblock.reserved.total_size, total_size);
  1492. test_pass_pop();
  1493. return 0;
  1494. }
  1495. /*
  1496. * A test that tries to free a region r2 that overlaps with the end of
  1497. * the already existing entry r1 (that is r2.base < r1.base + r1.size):
  1498. *
  1499. * +----------------+
  1500. * | r2 |
  1501. * +----------------+
  1502. * | +-----------+..... |
  1503. * | | r1 | : |
  1504. * +----+-----------+----+----------------+
  1505. *
  1506. * Expect that only the intersection of both regions is freed. The
  1507. * regions counter and total size are updated.
  1508. */
  1509. static int memblock_free_overlap_bottom_check(void)
  1510. {
  1511. struct memblock_region *rgn;
  1512. phys_addr_t total_size;
  1513. rgn = &memblock.reserved.regions[0];
  1514. struct region r1 = {
  1515. .base = SZ_8M,
  1516. .size = SZ_32M
  1517. };
  1518. struct region r2 = {
  1519. .base = SZ_32M,
  1520. .size = SZ_32M
  1521. };
  1522. PREFIX_PUSH();
  1523. total_size = r2.base - r1.base;
  1524. reset_memblock_regions();
  1525. memblock_reserve(r1.base, r1.size);
  1526. memblock_free((void *)r2.base, r2.size);
  1527. ASSERT_EQ(rgn->base, r1.base);
  1528. ASSERT_EQ(rgn->size, total_size);
  1529. ASSERT_EQ(memblock.reserved.cnt, 1);
  1530. ASSERT_EQ(memblock.reserved.total_size, total_size);
  1531. test_pass_pop();
  1532. return 0;
  1533. }
  1534. /*
  1535. * A test that tries to free a region r2 that is within the range of the
  1536. * already existing entry r1 (that is
  1537. * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
  1538. *
  1539. * +----+
  1540. * | r2 |
  1541. * +----+
  1542. * | +------------+....+---------------+
  1543. * | | rgn1 | r1 | rgn2 |
  1544. * +----+------------+----+---------------+
  1545. * ^
  1546. * |
  1547. * r1.base
  1548. *
  1549. * Expect that the region is split into two - one that ends at r2.base and
  1550. * another that starts at r2.base + r2.size, with appropriate sizes. The
  1551. * region counter and total size fields are updated.
  1552. */
  1553. static int memblock_free_within_check(void)
  1554. {
  1555. struct memblock_region *rgn1, *rgn2;
  1556. phys_addr_t r1_size, r2_size, total_size;
  1557. rgn1 = &memblock.reserved.regions[0];
  1558. rgn2 = &memblock.reserved.regions[1];
  1559. struct region r1 = {
  1560. .base = SZ_1M,
  1561. .size = SZ_8M
  1562. };
  1563. struct region r2 = {
  1564. .base = SZ_4M,
  1565. .size = SZ_1M
  1566. };
  1567. PREFIX_PUSH();
  1568. r1_size = r2.base - r1.base;
  1569. r2_size = (r1.base + r1.size) - (r2.base + r2.size);
  1570. total_size = r1_size + r2_size;
  1571. reset_memblock_regions();
  1572. memblock_reserve(r1.base, r1.size);
  1573. memblock_free((void *)r2.base, r2.size);
  1574. ASSERT_EQ(rgn1->base, r1.base);
  1575. ASSERT_EQ(rgn1->size, r1_size);
  1576. ASSERT_EQ(rgn2->base, r2.base + r2.size);
  1577. ASSERT_EQ(rgn2->size, r2_size);
  1578. ASSERT_EQ(memblock.reserved.cnt, 2);
  1579. ASSERT_EQ(memblock.reserved.total_size, total_size);
  1580. test_pass_pop();
  1581. return 0;
  1582. }
  1583. /*
  1584. * A simple test that tries to free a memory block r1 that was marked
  1585. * earlier as reserved when r1 is the only available region.
  1586. * Expect to reserve a memory block r1 and then free r1 so that r1 is
  1587. * overwritten with a dummy region. The region counter stays the same,
  1588. * and the total size is updated.
  1589. */
  1590. static int memblock_free_only_region_check(void)
  1591. {
  1592. struct memblock_region *rgn;
  1593. rgn = &memblock.reserved.regions[0];
  1594. struct region r1 = {
  1595. .base = SZ_2K,
  1596. .size = SZ_4K
  1597. };
  1598. PREFIX_PUSH();
  1599. reset_memblock_regions();
  1600. memblock_reserve(r1.base, r1.size);
  1601. memblock_free((void *)r1.base, r1.size);
  1602. ASSERT_EQ(rgn->base, 0);
  1603. ASSERT_EQ(rgn->size, 0);
  1604. ASSERT_EQ(memblock.reserved.cnt, 0);
  1605. ASSERT_EQ(memblock.reserved.total_size, 0);
  1606. test_pass_pop();
  1607. return 0;
  1608. }
  1609. /*
  1610. * A simple test that tries free a region r2 when r2 extends past PHYS_ADDR_MAX:
  1611. *
  1612. * +--------+
  1613. * | r2 |
  1614. * +--------+
  1615. * | +---+....+
  1616. * | |rgn| |
  1617. * +------------------------+---+----+
  1618. *
  1619. * Expect that only the portion between PHYS_ADDR_MAX and r2.base is freed.
  1620. * Expect the total size of reserved memory to be updated and the counter to
  1621. * not be updated.
  1622. */
  1623. static int memblock_free_near_max_check(void)
  1624. {
  1625. struct memblock_region *rgn;
  1626. phys_addr_t total_size;
  1627. rgn = &memblock.reserved.regions[0];
  1628. struct region r1 = {
  1629. .base = PHYS_ADDR_MAX - SZ_2M,
  1630. .size = SZ_2M
  1631. };
  1632. struct region r2 = {
  1633. .base = PHYS_ADDR_MAX - SZ_1M,
  1634. .size = SZ_2M
  1635. };
  1636. PREFIX_PUSH();
  1637. total_size = r1.size - (PHYS_ADDR_MAX - r2.base);
  1638. reset_memblock_regions();
  1639. memblock_reserve(r1.base, r1.size);
  1640. memblock_free((void *)r2.base, r2.size);
  1641. ASSERT_EQ(rgn->base, r1.base);
  1642. ASSERT_EQ(rgn->size, total_size);
  1643. ASSERT_EQ(memblock.reserved.cnt, 1);
  1644. ASSERT_EQ(memblock.reserved.total_size, total_size);
  1645. test_pass_pop();
  1646. return 0;
  1647. }
  1648. /*
  1649. * A test that tries to free a reserved region r3 that overlaps with two
  1650. * existing reserved regions r1 and r2:
  1651. *
  1652. * +----------------+
  1653. * | r3 |
  1654. * +----------------+
  1655. * | +----+..... ........+--------+
  1656. * | | |r1 : : |r2 | |
  1657. * +----+----+----+---+-------+--------+-----+
  1658. *
  1659. * Expect that only the intersections of r1 with r3 and r2 with r3 are freed
  1660. * from the collection of reserved memory. Expect the total size of reserved
  1661. * memory to be updated and the counter to not be updated.
  1662. */
  1663. static int memblock_free_overlap_two_check(void)
  1664. {
  1665. struct memblock_region *rgn1, *rgn2;
  1666. phys_addr_t new_r1_size, new_r2_size, r2_end, r3_end, total_size;
  1667. rgn1 = &memblock.reserved.regions[0];
  1668. rgn2 = &memblock.reserved.regions[1];
  1669. struct region r1 = {
  1670. .base = SZ_16M,
  1671. .size = SZ_32M
  1672. };
  1673. struct region r2 = {
  1674. .base = SZ_64M,
  1675. .size = SZ_64M
  1676. };
  1677. struct region r3 = {
  1678. .base = SZ_32M,
  1679. .size = SZ_64M
  1680. };
  1681. PREFIX_PUSH();
  1682. r2_end = r2.base + r2.size;
  1683. r3_end = r3.base + r3.size;
  1684. new_r1_size = r3.base - r1.base;
  1685. new_r2_size = r2_end - r3_end;
  1686. total_size = new_r1_size + new_r2_size;
  1687. reset_memblock_regions();
  1688. memblock_reserve(r1.base, r1.size);
  1689. memblock_reserve(r2.base, r2.size);
  1690. memblock_free((void *)r3.base, r3.size);
  1691. ASSERT_EQ(rgn1->base, r1.base);
  1692. ASSERT_EQ(rgn1->size, new_r1_size);
  1693. ASSERT_EQ(rgn2->base, r3_end);
  1694. ASSERT_EQ(rgn2->size, new_r2_size);
  1695. ASSERT_EQ(memblock.reserved.cnt, 2);
  1696. ASSERT_EQ(memblock.reserved.total_size, total_size);
  1697. test_pass_pop();
  1698. return 0;
  1699. }
  1700. static int memblock_free_checks(void)
  1701. {
  1702. prefix_reset();
  1703. prefix_push(FUNC_FREE);
  1704. test_print("Running %s tests...\n", FUNC_FREE);
  1705. memblock_free_simple_check();
  1706. memblock_free_absent_check();
  1707. memblock_free_overlap_top_check();
  1708. memblock_free_overlap_bottom_check();
  1709. memblock_free_within_check();
  1710. memblock_free_only_region_check();
  1711. memblock_free_near_max_check();
  1712. memblock_free_overlap_two_check();
  1713. prefix_pop();
  1714. return 0;
  1715. }
  1716. static int memblock_set_bottom_up_check(void)
  1717. {
  1718. prefix_push("memblock_set_bottom_up");
  1719. memblock_set_bottom_up(false);
  1720. ASSERT_EQ(memblock.bottom_up, false);
  1721. memblock_set_bottom_up(true);
  1722. ASSERT_EQ(memblock.bottom_up, true);
  1723. reset_memblock_attributes();
  1724. test_pass_pop();
  1725. return 0;
  1726. }
  1727. static int memblock_bottom_up_check(void)
  1728. {
  1729. prefix_push("memblock_bottom_up");
  1730. memblock_set_bottom_up(false);
  1731. ASSERT_EQ(memblock_bottom_up(), memblock.bottom_up);
  1732. ASSERT_EQ(memblock_bottom_up(), false);
  1733. memblock_set_bottom_up(true);
  1734. ASSERT_EQ(memblock_bottom_up(), memblock.bottom_up);
  1735. ASSERT_EQ(memblock_bottom_up(), true);
  1736. reset_memblock_attributes();
  1737. test_pass_pop();
  1738. return 0;
  1739. }
  1740. static int memblock_bottom_up_checks(void)
  1741. {
  1742. test_print("Running memblock_*bottom_up tests...\n");
  1743. prefix_reset();
  1744. memblock_set_bottom_up_check();
  1745. prefix_reset();
  1746. memblock_bottom_up_check();
  1747. return 0;
  1748. }
  1749. /*
  1750. * A test that tries to trim memory when both ends of the memory region are
  1751. * aligned. Expect that the memory will not be trimmed. Expect the counter to
  1752. * not be updated.
  1753. */
  1754. static int memblock_trim_memory_aligned_check(void)
  1755. {
  1756. struct memblock_region *rgn;
  1757. const phys_addr_t alignment = SMP_CACHE_BYTES;
  1758. rgn = &memblock.memory.regions[0];
  1759. struct region r = {
  1760. .base = alignment,
  1761. .size = alignment * 4
  1762. };
  1763. PREFIX_PUSH();
  1764. reset_memblock_regions();
  1765. memblock_add(r.base, r.size);
  1766. memblock_trim_memory(alignment);
  1767. ASSERT_EQ(rgn->base, r.base);
  1768. ASSERT_EQ(rgn->size, r.size);
  1769. ASSERT_EQ(memblock.memory.cnt, 1);
  1770. test_pass_pop();
  1771. return 0;
  1772. }
  1773. /*
  1774. * A test that tries to trim memory when there are two available regions, r1 and
  1775. * r2. Region r1 is aligned on both ends and region r2 is unaligned on one end
  1776. * and smaller than the alignment:
  1777. *
  1778. * alignment
  1779. * |--------|
  1780. * | +-----------------+ +------+ |
  1781. * | | r1 | | r2 | |
  1782. * +--------+-----------------+--------+------+---+
  1783. * ^ ^ ^ ^ ^
  1784. * |________|________|________| |
  1785. * | Unaligned address
  1786. * Aligned addresses
  1787. *
  1788. * Expect that r1 will not be trimmed and r2 will be removed. Expect the
  1789. * counter to be updated.
  1790. */
  1791. static int memblock_trim_memory_too_small_check(void)
  1792. {
  1793. struct memblock_region *rgn;
  1794. const phys_addr_t alignment = SMP_CACHE_BYTES;
  1795. rgn = &memblock.memory.regions[0];
  1796. struct region r1 = {
  1797. .base = alignment,
  1798. .size = alignment * 2
  1799. };
  1800. struct region r2 = {
  1801. .base = alignment * 4,
  1802. .size = alignment - SZ_2
  1803. };
  1804. PREFIX_PUSH();
  1805. reset_memblock_regions();
  1806. memblock_add(r1.base, r1.size);
  1807. memblock_add(r2.base, r2.size);
  1808. memblock_trim_memory(alignment);
  1809. ASSERT_EQ(rgn->base, r1.base);
  1810. ASSERT_EQ(rgn->size, r1.size);
  1811. ASSERT_EQ(memblock.memory.cnt, 1);
  1812. test_pass_pop();
  1813. return 0;
  1814. }
  1815. /*
  1816. * A test that tries to trim memory when there are two available regions, r1 and
  1817. * r2. Region r1 is aligned on both ends and region r2 is unaligned at the base
  1818. * and aligned at the end:
  1819. *
  1820. * Unaligned address
  1821. * |
  1822. * v
  1823. * | +-----------------+ +---------------+ |
  1824. * | | r1 | | r2 | |
  1825. * +--------+-----------------+----------+---------------+---+
  1826. * ^ ^ ^ ^ ^ ^
  1827. * |________|________|________|________|________|
  1828. * |
  1829. * Aligned addresses
  1830. *
  1831. * Expect that r1 will not be trimmed and r2 will be trimmed at the base.
  1832. * Expect the counter to not be updated.
  1833. */
  1834. static int memblock_trim_memory_unaligned_base_check(void)
  1835. {
  1836. struct memblock_region *rgn1, *rgn2;
  1837. const phys_addr_t alignment = SMP_CACHE_BYTES;
  1838. phys_addr_t offset = SZ_2;
  1839. phys_addr_t new_r2_base, new_r2_size;
  1840. rgn1 = &memblock.memory.regions[0];
  1841. rgn2 = &memblock.memory.regions[1];
  1842. struct region r1 = {
  1843. .base = alignment,
  1844. .size = alignment * 2
  1845. };
  1846. struct region r2 = {
  1847. .base = alignment * 4 + offset,
  1848. .size = alignment * 2 - offset
  1849. };
  1850. PREFIX_PUSH();
  1851. new_r2_base = r2.base + (alignment - offset);
  1852. new_r2_size = r2.size - (alignment - offset);
  1853. reset_memblock_regions();
  1854. memblock_add(r1.base, r1.size);
  1855. memblock_add(r2.base, r2.size);
  1856. memblock_trim_memory(alignment);
  1857. ASSERT_EQ(rgn1->base, r1.base);
  1858. ASSERT_EQ(rgn1->size, r1.size);
  1859. ASSERT_EQ(rgn2->base, new_r2_base);
  1860. ASSERT_EQ(rgn2->size, new_r2_size);
  1861. ASSERT_EQ(memblock.memory.cnt, 2);
  1862. test_pass_pop();
  1863. return 0;
  1864. }
  1865. /*
  1866. * A test that tries to trim memory when there are two available regions, r1 and
  1867. * r2. Region r1 is aligned on both ends and region r2 is aligned at the base
  1868. * and unaligned at the end:
  1869. *
  1870. * Unaligned address
  1871. * |
  1872. * v
  1873. * | +-----------------+ +---------------+ |
  1874. * | | r1 | | r2 | |
  1875. * +--------+-----------------+--------+---------------+---+
  1876. * ^ ^ ^ ^ ^ ^
  1877. * |________|________|________|________|________|
  1878. * |
  1879. * Aligned addresses
  1880. *
  1881. * Expect that r1 will not be trimmed and r2 will be trimmed at the end.
  1882. * Expect the counter to not be updated.
  1883. */
  1884. static int memblock_trim_memory_unaligned_end_check(void)
  1885. {
  1886. struct memblock_region *rgn1, *rgn2;
  1887. const phys_addr_t alignment = SMP_CACHE_BYTES;
  1888. phys_addr_t offset = SZ_2;
  1889. phys_addr_t new_r2_size;
  1890. rgn1 = &memblock.memory.regions[0];
  1891. rgn2 = &memblock.memory.regions[1];
  1892. struct region r1 = {
  1893. .base = alignment,
  1894. .size = alignment * 2
  1895. };
  1896. struct region r2 = {
  1897. .base = alignment * 4,
  1898. .size = alignment * 2 - offset
  1899. };
  1900. PREFIX_PUSH();
  1901. new_r2_size = r2.size - (alignment - offset);
  1902. reset_memblock_regions();
  1903. memblock_add(r1.base, r1.size);
  1904. memblock_add(r2.base, r2.size);
  1905. memblock_trim_memory(alignment);
  1906. ASSERT_EQ(rgn1->base, r1.base);
  1907. ASSERT_EQ(rgn1->size, r1.size);
  1908. ASSERT_EQ(rgn2->base, r2.base);
  1909. ASSERT_EQ(rgn2->size, new_r2_size);
  1910. ASSERT_EQ(memblock.memory.cnt, 2);
  1911. test_pass_pop();
  1912. return 0;
  1913. }
  1914. static int memblock_trim_memory_checks(void)
  1915. {
  1916. prefix_reset();
  1917. prefix_push(FUNC_TRIM);
  1918. test_print("Running %s tests...\n", FUNC_TRIM);
  1919. memblock_trim_memory_aligned_check();
  1920. memblock_trim_memory_too_small_check();
  1921. memblock_trim_memory_unaligned_base_check();
  1922. memblock_trim_memory_unaligned_end_check();
  1923. prefix_pop();
  1924. return 0;
  1925. }
  1926. static int memblock_overlaps_region_check(void)
  1927. {
  1928. struct region r = {
  1929. .base = SZ_1G,
  1930. .size = SZ_4M
  1931. };
  1932. PREFIX_PUSH();
  1933. reset_memblock_regions();
  1934. memblock_add(r.base, r.size);
  1935. /* Far Away */
  1936. ASSERT_FALSE(memblock_overlaps_region(&memblock.memory, SZ_1M, SZ_1M));
  1937. ASSERT_FALSE(memblock_overlaps_region(&memblock.memory, SZ_2G, SZ_1M));
  1938. /* Neighbor */
  1939. ASSERT_FALSE(memblock_overlaps_region(&memblock.memory, SZ_1G - SZ_1M, SZ_1M));
  1940. ASSERT_FALSE(memblock_overlaps_region(&memblock.memory, SZ_1G + SZ_4M, SZ_1M));
  1941. /* Partial Overlap */
  1942. ASSERT_TRUE(memblock_overlaps_region(&memblock.memory, SZ_1G - SZ_1M, SZ_2M));
  1943. ASSERT_TRUE(memblock_overlaps_region(&memblock.memory, SZ_1G + SZ_2M, SZ_2M));
  1944. /* Totally Overlap */
  1945. ASSERT_TRUE(memblock_overlaps_region(&memblock.memory, SZ_1G, SZ_4M));
  1946. ASSERT_TRUE(memblock_overlaps_region(&memblock.memory, SZ_1G - SZ_2M, SZ_8M));
  1947. ASSERT_TRUE(memblock_overlaps_region(&memblock.memory, SZ_1G + SZ_1M, SZ_1M));
  1948. test_pass_pop();
  1949. return 0;
  1950. }
  1951. static int memblock_overlaps_region_checks(void)
  1952. {
  1953. prefix_reset();
  1954. prefix_push("memblock_overlaps_region");
  1955. test_print("Running memblock_overlaps_region tests...\n");
  1956. memblock_overlaps_region_check();
  1957. prefix_pop();
  1958. return 0;
  1959. }
  1960. #ifdef CONFIG_NUMA
  1961. static int memblock_set_node_check(void)
  1962. {
  1963. unsigned long i, max_reserved;
  1964. struct memblock_region *rgn;
  1965. void *orig_region;
  1966. PREFIX_PUSH();
  1967. reset_memblock_regions();
  1968. memblock_allow_resize();
  1969. dummy_physical_memory_init();
  1970. memblock_add(dummy_physical_memory_base(), MEM_SIZE);
  1971. orig_region = memblock.reserved.regions;
  1972. /* Equally Split range to node 0 and 1*/
  1973. memblock_set_node(memblock_start_of_DRAM(),
  1974. memblock_phys_mem_size() / 2, &memblock.memory, 0);
  1975. memblock_set_node(memblock_start_of_DRAM() + memblock_phys_mem_size() / 2,
  1976. memblock_phys_mem_size() / 2, &memblock.memory, 1);
  1977. ASSERT_EQ(memblock.memory.cnt, 2);
  1978. rgn = &memblock.memory.regions[0];
  1979. ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
  1980. ASSERT_EQ(rgn->size, memblock_phys_mem_size() / 2);
  1981. ASSERT_EQ(memblock_get_region_node(rgn), 0);
  1982. rgn = &memblock.memory.regions[1];
  1983. ASSERT_EQ(rgn->base, memblock_start_of_DRAM() + memblock_phys_mem_size() / 2);
  1984. ASSERT_EQ(rgn->size, memblock_phys_mem_size() / 2);
  1985. ASSERT_EQ(memblock_get_region_node(rgn), 1);
  1986. /* Reserve 126 regions with the last one across node boundary */
  1987. for (i = 0; i < 125; i++)
  1988. memblock_reserve(memblock_start_of_DRAM() + SZ_16 * i, SZ_8);
  1989. memblock_reserve(memblock_start_of_DRAM() + memblock_phys_mem_size() / 2 - SZ_8,
  1990. SZ_16);
  1991. /*
  1992. * Commit 61167ad5fecd ("mm: pass nid to reserve_bootmem_region()")
  1993. * do following process to set nid to each memblock.reserved region.
  1994. * But it may miss some region if memblock_set_node() double the
  1995. * array.
  1996. *
  1997. * By checking 'max', we make sure all region nid is set properly.
  1998. */
  1999. repeat:
  2000. max_reserved = memblock.reserved.max;
  2001. for_each_mem_region(rgn) {
  2002. int nid = memblock_get_region_node(rgn);
  2003. memblock_set_node(rgn->base, rgn->size, &memblock.reserved, nid);
  2004. }
  2005. if (max_reserved != memblock.reserved.max)
  2006. goto repeat;
  2007. /* Confirm each region has valid node set */
  2008. for_each_reserved_mem_region(rgn) {
  2009. ASSERT_TRUE(numa_valid_node(memblock_get_region_node(rgn)));
  2010. if (rgn == (memblock.reserved.regions + memblock.reserved.cnt - 1))
  2011. ASSERT_EQ(1, memblock_get_region_node(rgn));
  2012. else
  2013. ASSERT_EQ(0, memblock_get_region_node(rgn));
  2014. }
  2015. dummy_physical_memory_cleanup();
  2016. /*
  2017. * The current reserved.regions is occupying a range of memory that
  2018. * allocated from dummy_physical_memory_init(). After free the memory,
  2019. * we must not use it. So restore the origin memory region to make sure
  2020. * the tests can run as normal and not affected by the double array.
  2021. */
  2022. memblock.reserved.regions = orig_region;
  2023. memblock.reserved.cnt = INIT_MEMBLOCK_RESERVED_REGIONS;
  2024. test_pass_pop();
  2025. return 0;
  2026. }
  2027. static int memblock_set_node_checks(void)
  2028. {
  2029. prefix_reset();
  2030. prefix_push("memblock_set_node");
  2031. test_print("Running memblock_set_node tests...\n");
  2032. memblock_set_node_check();
  2033. prefix_pop();
  2034. return 0;
  2035. }
  2036. #else
  2037. static int memblock_set_node_checks(void)
  2038. {
  2039. return 0;
  2040. }
  2041. #endif
  2042. int memblock_basic_checks(void)
  2043. {
  2044. memblock_initialization_check();
  2045. memblock_add_checks();
  2046. memblock_reserve_checks();
  2047. memblock_remove_checks();
  2048. memblock_free_checks();
  2049. memblock_bottom_up_checks();
  2050. memblock_trim_memory_checks();
  2051. memblock_overlaps_region_checks();
  2052. memblock_set_node_checks();
  2053. return 0;
  2054. }