vma.c 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include <stdbool.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include "maple-shared.h"
  6. #include "vma_internal.h"
  7. /* Include so header guard set. */
  8. #include "../../../mm/vma.h"
  9. static bool fail_prealloc;
  10. /* Then override vma_iter_prealloc() so we can choose to fail it. */
  11. #define vma_iter_prealloc(vmi, vma) \
  12. (fail_prealloc ? -ENOMEM : mas_preallocate(&(vmi)->mas, (vma), GFP_KERNEL))
  13. /*
  14. * Directly import the VMA implementation here. Our vma_internal.h wrapper
  15. * provides userland-equivalent functionality for everything vma.c uses.
  16. */
  17. #include "../../../mm/vma.c"
  18. const struct vm_operations_struct vma_dummy_vm_ops;
  19. static struct anon_vma dummy_anon_vma;
  20. #define ASSERT_TRUE(_expr) \
  21. do { \
  22. if (!(_expr)) { \
  23. fprintf(stderr, \
  24. "Assert FAILED at %s:%d:%s(): %s is FALSE.\n", \
  25. __FILE__, __LINE__, __FUNCTION__, #_expr); \
  26. return false; \
  27. } \
  28. } while (0)
  29. #define ASSERT_FALSE(_expr) ASSERT_TRUE(!(_expr))
  30. #define ASSERT_EQ(_val1, _val2) ASSERT_TRUE((_val1) == (_val2))
  31. #define ASSERT_NE(_val1, _val2) ASSERT_TRUE((_val1) != (_val2))
  32. static struct task_struct __current;
  33. struct task_struct *get_current(void)
  34. {
  35. return &__current;
  36. }
  37. /* Helper function to simply allocate a VMA. */
  38. static struct vm_area_struct *alloc_vma(struct mm_struct *mm,
  39. unsigned long start,
  40. unsigned long end,
  41. pgoff_t pgoff,
  42. vm_flags_t flags)
  43. {
  44. struct vm_area_struct *ret = vm_area_alloc(mm);
  45. if (ret == NULL)
  46. return NULL;
  47. ret->vm_start = start;
  48. ret->vm_end = end;
  49. ret->vm_pgoff = pgoff;
  50. ret->__vm_flags = flags;
  51. return ret;
  52. }
  53. /* Helper function to allocate a VMA and link it to the tree. */
  54. static struct vm_area_struct *alloc_and_link_vma(struct mm_struct *mm,
  55. unsigned long start,
  56. unsigned long end,
  57. pgoff_t pgoff,
  58. vm_flags_t flags)
  59. {
  60. struct vm_area_struct *vma = alloc_vma(mm, start, end, pgoff, flags);
  61. if (vma == NULL)
  62. return NULL;
  63. if (vma_link(mm, vma)) {
  64. vm_area_free(vma);
  65. return NULL;
  66. }
  67. /*
  68. * Reset this counter which we use to track whether writes have
  69. * begun. Linking to the tree will have caused this to be incremented,
  70. * which means we will get a false positive otherwise.
  71. */
  72. vma->vm_lock_seq = -1;
  73. return vma;
  74. }
  75. /* Helper function which provides a wrapper around a merge new VMA operation. */
  76. static struct vm_area_struct *merge_new(struct vma_merge_struct *vmg)
  77. {
  78. /*
  79. * For convenience, get prev and next VMAs. Which the new VMA operation
  80. * requires.
  81. */
  82. vmg->next = vma_next(vmg->vmi);
  83. vmg->prev = vma_prev(vmg->vmi);
  84. vma_iter_next_range(vmg->vmi);
  85. return vma_merge_new_range(vmg);
  86. }
  87. /*
  88. * Helper function which provides a wrapper around a merge existing VMA
  89. * operation.
  90. */
  91. static struct vm_area_struct *merge_existing(struct vma_merge_struct *vmg)
  92. {
  93. return vma_merge_existing_range(vmg);
  94. }
  95. /*
  96. * Helper function which provides a wrapper around the expansion of an existing
  97. * VMA.
  98. */
  99. static int expand_existing(struct vma_merge_struct *vmg)
  100. {
  101. return vma_expand(vmg);
  102. }
  103. /*
  104. * Helper function to reset merge state the associated VMA iterator to a
  105. * specified new range.
  106. */
  107. static void vmg_set_range(struct vma_merge_struct *vmg, unsigned long start,
  108. unsigned long end, pgoff_t pgoff, vm_flags_t flags)
  109. {
  110. vma_iter_set(vmg->vmi, start);
  111. vmg->prev = NULL;
  112. vmg->next = NULL;
  113. vmg->vma = NULL;
  114. vmg->start = start;
  115. vmg->end = end;
  116. vmg->pgoff = pgoff;
  117. vmg->flags = flags;
  118. }
  119. /*
  120. * Helper function to try to merge a new VMA.
  121. *
  122. * Update vmg and the iterator for it and try to merge, otherwise allocate a new
  123. * VMA, link it to the maple tree and return it.
  124. */
  125. static struct vm_area_struct *try_merge_new_vma(struct mm_struct *mm,
  126. struct vma_merge_struct *vmg,
  127. unsigned long start, unsigned long end,
  128. pgoff_t pgoff, vm_flags_t flags,
  129. bool *was_merged)
  130. {
  131. struct vm_area_struct *merged;
  132. vmg_set_range(vmg, start, end, pgoff, flags);
  133. merged = merge_new(vmg);
  134. if (merged) {
  135. *was_merged = true;
  136. ASSERT_EQ(vmg->state, VMA_MERGE_SUCCESS);
  137. return merged;
  138. }
  139. *was_merged = false;
  140. ASSERT_EQ(vmg->state, VMA_MERGE_NOMERGE);
  141. return alloc_and_link_vma(mm, start, end, pgoff, flags);
  142. }
  143. /*
  144. * Helper function to reset the dummy anon_vma to indicate it has not been
  145. * duplicated.
  146. */
  147. static void reset_dummy_anon_vma(void)
  148. {
  149. dummy_anon_vma.was_cloned = false;
  150. dummy_anon_vma.was_unlinked = false;
  151. }
  152. /*
  153. * Helper function to remove all VMAs and destroy the maple tree associated with
  154. * a virtual address space. Returns a count of VMAs in the tree.
  155. */
  156. static int cleanup_mm(struct mm_struct *mm, struct vma_iterator *vmi)
  157. {
  158. struct vm_area_struct *vma;
  159. int count = 0;
  160. fail_prealloc = false;
  161. reset_dummy_anon_vma();
  162. vma_iter_set(vmi, 0);
  163. for_each_vma(*vmi, vma) {
  164. vm_area_free(vma);
  165. count++;
  166. }
  167. mtree_destroy(&mm->mm_mt);
  168. mm->map_count = 0;
  169. return count;
  170. }
  171. /* Helper function to determine if VMA has had vma_start_write() performed. */
  172. static bool vma_write_started(struct vm_area_struct *vma)
  173. {
  174. int seq = vma->vm_lock_seq;
  175. /* We reset after each check. */
  176. vma->vm_lock_seq = -1;
  177. /* The vma_start_write() stub simply increments this value. */
  178. return seq > -1;
  179. }
  180. /* Helper function providing a dummy vm_ops->close() method.*/
  181. static void dummy_close(struct vm_area_struct *)
  182. {
  183. }
  184. static bool test_simple_merge(void)
  185. {
  186. struct vm_area_struct *vma;
  187. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  188. struct mm_struct mm = {};
  189. struct vm_area_struct *vma_left = alloc_vma(&mm, 0, 0x1000, 0, flags);
  190. struct vm_area_struct *vma_right = alloc_vma(&mm, 0x2000, 0x3000, 2, flags);
  191. VMA_ITERATOR(vmi, &mm, 0x1000);
  192. struct vma_merge_struct vmg = {
  193. .mm = &mm,
  194. .vmi = &vmi,
  195. .start = 0x1000,
  196. .end = 0x2000,
  197. .flags = flags,
  198. .pgoff = 1,
  199. };
  200. ASSERT_FALSE(vma_link(&mm, vma_left));
  201. ASSERT_FALSE(vma_link(&mm, vma_right));
  202. vma = merge_new(&vmg);
  203. ASSERT_NE(vma, NULL);
  204. ASSERT_EQ(vma->vm_start, 0);
  205. ASSERT_EQ(vma->vm_end, 0x3000);
  206. ASSERT_EQ(vma->vm_pgoff, 0);
  207. ASSERT_EQ(vma->vm_flags, flags);
  208. vm_area_free(vma);
  209. mtree_destroy(&mm.mm_mt);
  210. return true;
  211. }
  212. static bool test_simple_modify(void)
  213. {
  214. struct vm_area_struct *vma;
  215. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  216. struct mm_struct mm = {};
  217. struct vm_area_struct *init_vma = alloc_vma(&mm, 0, 0x3000, 0, flags);
  218. VMA_ITERATOR(vmi, &mm, 0x1000);
  219. ASSERT_FALSE(vma_link(&mm, init_vma));
  220. /*
  221. * The flags will not be changed, the vma_modify_flags() function
  222. * performs the merge/split only.
  223. */
  224. vma = vma_modify_flags(&vmi, init_vma, init_vma,
  225. 0x1000, 0x2000, VM_READ | VM_MAYREAD);
  226. ASSERT_NE(vma, NULL);
  227. /* We modify the provided VMA, and on split allocate new VMAs. */
  228. ASSERT_EQ(vma, init_vma);
  229. ASSERT_EQ(vma->vm_start, 0x1000);
  230. ASSERT_EQ(vma->vm_end, 0x2000);
  231. ASSERT_EQ(vma->vm_pgoff, 1);
  232. /*
  233. * Now walk through the three split VMAs and make sure they are as
  234. * expected.
  235. */
  236. vma_iter_set(&vmi, 0);
  237. vma = vma_iter_load(&vmi);
  238. ASSERT_EQ(vma->vm_start, 0);
  239. ASSERT_EQ(vma->vm_end, 0x1000);
  240. ASSERT_EQ(vma->vm_pgoff, 0);
  241. vm_area_free(vma);
  242. vma_iter_clear(&vmi);
  243. vma = vma_next(&vmi);
  244. ASSERT_EQ(vma->vm_start, 0x1000);
  245. ASSERT_EQ(vma->vm_end, 0x2000);
  246. ASSERT_EQ(vma->vm_pgoff, 1);
  247. vm_area_free(vma);
  248. vma_iter_clear(&vmi);
  249. vma = vma_next(&vmi);
  250. ASSERT_EQ(vma->vm_start, 0x2000);
  251. ASSERT_EQ(vma->vm_end, 0x3000);
  252. ASSERT_EQ(vma->vm_pgoff, 2);
  253. vm_area_free(vma);
  254. mtree_destroy(&mm.mm_mt);
  255. return true;
  256. }
  257. static bool test_simple_expand(void)
  258. {
  259. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  260. struct mm_struct mm = {};
  261. struct vm_area_struct *vma = alloc_vma(&mm, 0, 0x1000, 0, flags);
  262. VMA_ITERATOR(vmi, &mm, 0);
  263. struct vma_merge_struct vmg = {
  264. .vmi = &vmi,
  265. .vma = vma,
  266. .start = 0,
  267. .end = 0x3000,
  268. .pgoff = 0,
  269. };
  270. ASSERT_FALSE(vma_link(&mm, vma));
  271. ASSERT_FALSE(expand_existing(&vmg));
  272. ASSERT_EQ(vma->vm_start, 0);
  273. ASSERT_EQ(vma->vm_end, 0x3000);
  274. ASSERT_EQ(vma->vm_pgoff, 0);
  275. vm_area_free(vma);
  276. mtree_destroy(&mm.mm_mt);
  277. return true;
  278. }
  279. static bool test_simple_shrink(void)
  280. {
  281. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  282. struct mm_struct mm = {};
  283. struct vm_area_struct *vma = alloc_vma(&mm, 0, 0x3000, 0, flags);
  284. VMA_ITERATOR(vmi, &mm, 0);
  285. ASSERT_FALSE(vma_link(&mm, vma));
  286. ASSERT_FALSE(vma_shrink(&vmi, vma, 0, 0x1000, 0));
  287. ASSERT_EQ(vma->vm_start, 0);
  288. ASSERT_EQ(vma->vm_end, 0x1000);
  289. ASSERT_EQ(vma->vm_pgoff, 0);
  290. vm_area_free(vma);
  291. mtree_destroy(&mm.mm_mt);
  292. return true;
  293. }
  294. static bool test_merge_new(void)
  295. {
  296. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  297. struct mm_struct mm = {};
  298. VMA_ITERATOR(vmi, &mm, 0);
  299. struct vma_merge_struct vmg = {
  300. .mm = &mm,
  301. .vmi = &vmi,
  302. };
  303. struct anon_vma_chain dummy_anon_vma_chain_a = {
  304. .anon_vma = &dummy_anon_vma,
  305. };
  306. struct anon_vma_chain dummy_anon_vma_chain_b = {
  307. .anon_vma = &dummy_anon_vma,
  308. };
  309. struct anon_vma_chain dummy_anon_vma_chain_c = {
  310. .anon_vma = &dummy_anon_vma,
  311. };
  312. struct anon_vma_chain dummy_anon_vma_chain_d = {
  313. .anon_vma = &dummy_anon_vma,
  314. };
  315. const struct vm_operations_struct vm_ops = {
  316. .close = dummy_close,
  317. };
  318. int count;
  319. struct vm_area_struct *vma, *vma_a, *vma_b, *vma_c, *vma_d;
  320. bool merged;
  321. /*
  322. * 0123456789abc
  323. * AA B CC
  324. */
  325. vma_a = alloc_and_link_vma(&mm, 0, 0x2000, 0, flags);
  326. ASSERT_NE(vma_a, NULL);
  327. /* We give each VMA a single avc so we can test anon_vma duplication. */
  328. INIT_LIST_HEAD(&vma_a->anon_vma_chain);
  329. list_add(&dummy_anon_vma_chain_a.same_vma, &vma_a->anon_vma_chain);
  330. vma_b = alloc_and_link_vma(&mm, 0x3000, 0x4000, 3, flags);
  331. ASSERT_NE(vma_b, NULL);
  332. INIT_LIST_HEAD(&vma_b->anon_vma_chain);
  333. list_add(&dummy_anon_vma_chain_b.same_vma, &vma_b->anon_vma_chain);
  334. vma_c = alloc_and_link_vma(&mm, 0xb000, 0xc000, 0xb, flags);
  335. ASSERT_NE(vma_c, NULL);
  336. INIT_LIST_HEAD(&vma_c->anon_vma_chain);
  337. list_add(&dummy_anon_vma_chain_c.same_vma, &vma_c->anon_vma_chain);
  338. /*
  339. * NO merge.
  340. *
  341. * 0123456789abc
  342. * AA B ** CC
  343. */
  344. vma_d = try_merge_new_vma(&mm, &vmg, 0x7000, 0x9000, 7, flags, &merged);
  345. ASSERT_NE(vma_d, NULL);
  346. INIT_LIST_HEAD(&vma_d->anon_vma_chain);
  347. list_add(&dummy_anon_vma_chain_d.same_vma, &vma_d->anon_vma_chain);
  348. ASSERT_FALSE(merged);
  349. ASSERT_EQ(mm.map_count, 4);
  350. /*
  351. * Merge BOTH sides.
  352. *
  353. * 0123456789abc
  354. * AA*B DD CC
  355. */
  356. vma_a->vm_ops = &vm_ops; /* This should have no impact. */
  357. vma_b->anon_vma = &dummy_anon_vma;
  358. vma = try_merge_new_vma(&mm, &vmg, 0x2000, 0x3000, 2, flags, &merged);
  359. ASSERT_EQ(vma, vma_a);
  360. /* Merge with A, delete B. */
  361. ASSERT_TRUE(merged);
  362. ASSERT_EQ(vma->vm_start, 0);
  363. ASSERT_EQ(vma->vm_end, 0x4000);
  364. ASSERT_EQ(vma->vm_pgoff, 0);
  365. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  366. ASSERT_TRUE(vma_write_started(vma));
  367. ASSERT_EQ(mm.map_count, 3);
  368. /*
  369. * Merge to PREVIOUS VMA.
  370. *
  371. * 0123456789abc
  372. * AAAA* DD CC
  373. */
  374. vma = try_merge_new_vma(&mm, &vmg, 0x4000, 0x5000, 4, flags, &merged);
  375. ASSERT_EQ(vma, vma_a);
  376. /* Extend A. */
  377. ASSERT_TRUE(merged);
  378. ASSERT_EQ(vma->vm_start, 0);
  379. ASSERT_EQ(vma->vm_end, 0x5000);
  380. ASSERT_EQ(vma->vm_pgoff, 0);
  381. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  382. ASSERT_TRUE(vma_write_started(vma));
  383. ASSERT_EQ(mm.map_count, 3);
  384. /*
  385. * Merge to NEXT VMA.
  386. *
  387. * 0123456789abc
  388. * AAAAA *DD CC
  389. */
  390. vma_d->anon_vma = &dummy_anon_vma;
  391. vma_d->vm_ops = &vm_ops; /* This should have no impact. */
  392. vma = try_merge_new_vma(&mm, &vmg, 0x6000, 0x7000, 6, flags, &merged);
  393. ASSERT_EQ(vma, vma_d);
  394. /* Prepend. */
  395. ASSERT_TRUE(merged);
  396. ASSERT_EQ(vma->vm_start, 0x6000);
  397. ASSERT_EQ(vma->vm_end, 0x9000);
  398. ASSERT_EQ(vma->vm_pgoff, 6);
  399. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  400. ASSERT_TRUE(vma_write_started(vma));
  401. ASSERT_EQ(mm.map_count, 3);
  402. /*
  403. * Merge BOTH sides.
  404. *
  405. * 0123456789abc
  406. * AAAAA*DDD CC
  407. */
  408. vma_d->vm_ops = NULL; /* This would otherwise degrade the merge. */
  409. vma = try_merge_new_vma(&mm, &vmg, 0x5000, 0x6000, 5, flags, &merged);
  410. ASSERT_EQ(vma, vma_a);
  411. /* Merge with A, delete D. */
  412. ASSERT_TRUE(merged);
  413. ASSERT_EQ(vma->vm_start, 0);
  414. ASSERT_EQ(vma->vm_end, 0x9000);
  415. ASSERT_EQ(vma->vm_pgoff, 0);
  416. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  417. ASSERT_TRUE(vma_write_started(vma));
  418. ASSERT_EQ(mm.map_count, 2);
  419. /*
  420. * Merge to NEXT VMA.
  421. *
  422. * 0123456789abc
  423. * AAAAAAAAA *CC
  424. */
  425. vma_c->anon_vma = &dummy_anon_vma;
  426. vma = try_merge_new_vma(&mm, &vmg, 0xa000, 0xb000, 0xa, flags, &merged);
  427. ASSERT_EQ(vma, vma_c);
  428. /* Prepend C. */
  429. ASSERT_TRUE(merged);
  430. ASSERT_EQ(vma->vm_start, 0xa000);
  431. ASSERT_EQ(vma->vm_end, 0xc000);
  432. ASSERT_EQ(vma->vm_pgoff, 0xa);
  433. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  434. ASSERT_TRUE(vma_write_started(vma));
  435. ASSERT_EQ(mm.map_count, 2);
  436. /*
  437. * Merge BOTH sides.
  438. *
  439. * 0123456789abc
  440. * AAAAAAAAA*CCC
  441. */
  442. vma = try_merge_new_vma(&mm, &vmg, 0x9000, 0xa000, 0x9, flags, &merged);
  443. ASSERT_EQ(vma, vma_a);
  444. /* Extend A and delete C. */
  445. ASSERT_TRUE(merged);
  446. ASSERT_EQ(vma->vm_start, 0);
  447. ASSERT_EQ(vma->vm_end, 0xc000);
  448. ASSERT_EQ(vma->vm_pgoff, 0);
  449. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  450. ASSERT_TRUE(vma_write_started(vma));
  451. ASSERT_EQ(mm.map_count, 1);
  452. /*
  453. * Final state.
  454. *
  455. * 0123456789abc
  456. * AAAAAAAAAAAAA
  457. */
  458. count = 0;
  459. vma_iter_set(&vmi, 0);
  460. for_each_vma(vmi, vma) {
  461. ASSERT_NE(vma, NULL);
  462. ASSERT_EQ(vma->vm_start, 0);
  463. ASSERT_EQ(vma->vm_end, 0xc000);
  464. ASSERT_EQ(vma->vm_pgoff, 0);
  465. ASSERT_EQ(vma->anon_vma, &dummy_anon_vma);
  466. vm_area_free(vma);
  467. count++;
  468. }
  469. /* Should only have one VMA left (though freed) after all is done.*/
  470. ASSERT_EQ(count, 1);
  471. mtree_destroy(&mm.mm_mt);
  472. return true;
  473. }
  474. static bool test_vma_merge_special_flags(void)
  475. {
  476. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  477. struct mm_struct mm = {};
  478. VMA_ITERATOR(vmi, &mm, 0);
  479. struct vma_merge_struct vmg = {
  480. .mm = &mm,
  481. .vmi = &vmi,
  482. };
  483. vm_flags_t special_flags[] = { VM_IO, VM_DONTEXPAND, VM_PFNMAP, VM_MIXEDMAP };
  484. vm_flags_t all_special_flags = 0;
  485. int i;
  486. struct vm_area_struct *vma_left, *vma;
  487. /* Make sure there aren't new VM_SPECIAL flags. */
  488. for (i = 0; i < ARRAY_SIZE(special_flags); i++) {
  489. all_special_flags |= special_flags[i];
  490. }
  491. ASSERT_EQ(all_special_flags, VM_SPECIAL);
  492. /*
  493. * 01234
  494. * AAA
  495. */
  496. vma_left = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  497. ASSERT_NE(vma_left, NULL);
  498. /* 1. Set up new VMA with special flag that would otherwise merge. */
  499. /*
  500. * 01234
  501. * AAA*
  502. *
  503. * This should merge if not for the VM_SPECIAL flag.
  504. */
  505. vmg_set_range(&vmg, 0x3000, 0x4000, 3, flags);
  506. for (i = 0; i < ARRAY_SIZE(special_flags); i++) {
  507. vm_flags_t special_flag = special_flags[i];
  508. vma_left->__vm_flags = flags | special_flag;
  509. vmg.flags = flags | special_flag;
  510. vma = merge_new(&vmg);
  511. ASSERT_EQ(vma, NULL);
  512. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  513. }
  514. /* 2. Modify VMA with special flag that would otherwise merge. */
  515. /*
  516. * 01234
  517. * AAAB
  518. *
  519. * Create a VMA to modify.
  520. */
  521. vma = alloc_and_link_vma(&mm, 0x3000, 0x4000, 3, flags);
  522. ASSERT_NE(vma, NULL);
  523. vmg.vma = vma;
  524. for (i = 0; i < ARRAY_SIZE(special_flags); i++) {
  525. vm_flags_t special_flag = special_flags[i];
  526. vma_left->__vm_flags = flags | special_flag;
  527. vmg.flags = flags | special_flag;
  528. vma = merge_existing(&vmg);
  529. ASSERT_EQ(vma, NULL);
  530. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  531. }
  532. cleanup_mm(&mm, &vmi);
  533. return true;
  534. }
  535. static bool test_vma_merge_with_close(void)
  536. {
  537. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  538. struct mm_struct mm = {};
  539. VMA_ITERATOR(vmi, &mm, 0);
  540. struct vma_merge_struct vmg = {
  541. .mm = &mm,
  542. .vmi = &vmi,
  543. };
  544. const struct vm_operations_struct vm_ops = {
  545. .close = dummy_close,
  546. };
  547. struct vm_area_struct *vma_prev, *vma_next, *vma;
  548. /*
  549. * When merging VMAs we are not permitted to remove any VMA that has a
  550. * vm_ops->close() hook.
  551. *
  552. * Considering the two possible adjacent VMAs to which a VMA can be
  553. * merged:
  554. *
  555. * [ prev ][ vma ][ next ]
  556. *
  557. * In no case will we need to delete prev. If the operation is
  558. * mergeable, then prev will be extended with one or both of vma and
  559. * next deleted.
  560. *
  561. * As a result, during initial mergeability checks, only
  562. * can_vma_merge_before() (which implies the VMA being merged with is
  563. * 'next' as shown above) bothers to check to see whether the next VMA
  564. * has a vm_ops->close() callback that will need to be called when
  565. * removed.
  566. *
  567. * If it does, then we cannot merge as the resources that the close()
  568. * operation potentially clears down are tied only to the existing VMA
  569. * range and we have no way of extending those to the nearly merged one.
  570. *
  571. * We must consider two scenarios:
  572. *
  573. * A.
  574. *
  575. * vm_ops->close: - - !NULL
  576. * [ prev ][ vma ][ next ]
  577. *
  578. * Where prev may or may not be present/mergeable.
  579. *
  580. * This is picked up by a specific check in can_vma_merge_before().
  581. *
  582. * B.
  583. *
  584. * vm_ops->close: - !NULL
  585. * [ prev ][ vma ]
  586. *
  587. * Where prev and vma are present and mergeable.
  588. *
  589. * This is picked up by a specific check in the modified VMA merge.
  590. *
  591. * IMPORTANT NOTE: We make the assumption that the following case:
  592. *
  593. * - !NULL NULL
  594. * [ prev ][ vma ][ next ]
  595. *
  596. * Cannot occur, because vma->vm_ops being the same implies the same
  597. * vma->vm_file, and therefore this would mean that next->vm_ops->close
  598. * would be set too, and thus scenario A would pick this up.
  599. */
  600. /*
  601. * The only case of a new VMA merge that results in a VMA being deleted
  602. * is one where both the previous and next VMAs are merged - in this
  603. * instance the next VMA is deleted, and the previous VMA is extended.
  604. *
  605. * If we are unable to do so, we reduce the operation to simply
  606. * extending the prev VMA and not merging next.
  607. *
  608. * 0123456789
  609. * PPP**NNNN
  610. * ->
  611. * 0123456789
  612. * PPPPPPNNN
  613. */
  614. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  615. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x9000, 5, flags);
  616. vma_next->vm_ops = &vm_ops;
  617. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  618. ASSERT_EQ(merge_new(&vmg), vma_prev);
  619. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  620. ASSERT_EQ(vma_prev->vm_start, 0);
  621. ASSERT_EQ(vma_prev->vm_end, 0x5000);
  622. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  623. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  624. /*
  625. * When modifying an existing VMA there are further cases where we
  626. * delete VMAs.
  627. *
  628. * <>
  629. * 0123456789
  630. * PPPVV
  631. *
  632. * In this instance, if vma has a close hook, the merge simply cannot
  633. * proceed.
  634. */
  635. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  636. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  637. vma->vm_ops = &vm_ops;
  638. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  639. vmg.prev = vma_prev;
  640. vmg.vma = vma;
  641. /*
  642. * The VMA being modified in a way that would otherwise merge should
  643. * also fail.
  644. */
  645. ASSERT_EQ(merge_existing(&vmg), NULL);
  646. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  647. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  648. /*
  649. * This case is mirrored if merging with next.
  650. *
  651. * <>
  652. * 0123456789
  653. * VVNNNN
  654. *
  655. * In this instance, if vma has a close hook, the merge simply cannot
  656. * proceed.
  657. */
  658. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  659. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x9000, 5, flags);
  660. vma->vm_ops = &vm_ops;
  661. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  662. vmg.vma = vma;
  663. ASSERT_EQ(merge_existing(&vmg), NULL);
  664. /*
  665. * Initially this is misapprehended as an out of memory report, as the
  666. * close() check is handled in the same way as anon_vma duplication
  667. * failures, however a subsequent patch resolves this.
  668. */
  669. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  670. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  671. /*
  672. * Finally, we consider two variants of the case where we modify a VMA
  673. * to merge with both the previous and next VMAs.
  674. *
  675. * The first variant is where vma has a close hook. In this instance, no
  676. * merge can proceed.
  677. *
  678. * <>
  679. * 0123456789
  680. * PPPVVNNNN
  681. */
  682. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  683. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  684. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x9000, 5, flags);
  685. vma->vm_ops = &vm_ops;
  686. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  687. vmg.prev = vma_prev;
  688. vmg.vma = vma;
  689. ASSERT_EQ(merge_existing(&vmg), NULL);
  690. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  691. ASSERT_EQ(cleanup_mm(&mm, &vmi), 3);
  692. /*
  693. * The second variant is where next has a close hook. In this instance,
  694. * we reduce the operation to a merge between prev and vma.
  695. *
  696. * <>
  697. * 0123456789
  698. * PPPVVNNNN
  699. * ->
  700. * 0123456789
  701. * PPPPPNNNN
  702. */
  703. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  704. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  705. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x9000, 5, flags);
  706. vma_next->vm_ops = &vm_ops;
  707. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  708. vmg.prev = vma_prev;
  709. vmg.vma = vma;
  710. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  711. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  712. ASSERT_EQ(vma_prev->vm_start, 0);
  713. ASSERT_EQ(vma_prev->vm_end, 0x5000);
  714. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  715. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  716. return true;
  717. }
  718. static bool test_vma_merge_new_with_close(void)
  719. {
  720. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  721. struct mm_struct mm = {};
  722. VMA_ITERATOR(vmi, &mm, 0);
  723. struct vma_merge_struct vmg = {
  724. .mm = &mm,
  725. .vmi = &vmi,
  726. };
  727. struct vm_area_struct *vma_prev = alloc_and_link_vma(&mm, 0, 0x2000, 0, flags);
  728. struct vm_area_struct *vma_next = alloc_and_link_vma(&mm, 0x5000, 0x7000, 5, flags);
  729. const struct vm_operations_struct vm_ops = {
  730. .close = dummy_close,
  731. };
  732. struct vm_area_struct *vma;
  733. /*
  734. * We should allow the partial merge of a proposed new VMA if the
  735. * surrounding VMAs have vm_ops->close() hooks (but are otherwise
  736. * compatible), e.g.:
  737. *
  738. * New VMA
  739. * A v-------v B
  740. * |-----| |-----|
  741. * close close
  742. *
  743. * Since the rule is to not DELETE a VMA with a close operation, this
  744. * should be permitted, only rather than expanding A and deleting B, we
  745. * should simply expand A and leave B intact, e.g.:
  746. *
  747. * New VMA
  748. * A B
  749. * |------------||-----|
  750. * close close
  751. */
  752. /* Have prev and next have a vm_ops->close() hook. */
  753. vma_prev->vm_ops = &vm_ops;
  754. vma_next->vm_ops = &vm_ops;
  755. vmg_set_range(&vmg, 0x2000, 0x5000, 2, flags);
  756. vma = merge_new(&vmg);
  757. ASSERT_NE(vma, NULL);
  758. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  759. ASSERT_EQ(vma->vm_start, 0);
  760. ASSERT_EQ(vma->vm_end, 0x5000);
  761. ASSERT_EQ(vma->vm_pgoff, 0);
  762. ASSERT_EQ(vma->vm_ops, &vm_ops);
  763. ASSERT_TRUE(vma_write_started(vma));
  764. ASSERT_EQ(mm.map_count, 2);
  765. cleanup_mm(&mm, &vmi);
  766. return true;
  767. }
  768. static bool test_merge_existing(void)
  769. {
  770. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  771. struct mm_struct mm = {};
  772. VMA_ITERATOR(vmi, &mm, 0);
  773. struct vm_area_struct *vma, *vma_prev, *vma_next;
  774. struct vma_merge_struct vmg = {
  775. .mm = &mm,
  776. .vmi = &vmi,
  777. };
  778. const struct vm_operations_struct vm_ops = {
  779. .close = dummy_close,
  780. };
  781. /*
  782. * Merge right case - partial span.
  783. *
  784. * <->
  785. * 0123456789
  786. * VVVVNNN
  787. * ->
  788. * 0123456789
  789. * VNNNNNN
  790. */
  791. vma = alloc_and_link_vma(&mm, 0x2000, 0x6000, 2, flags);
  792. vma->vm_ops = &vm_ops; /* This should have no impact. */
  793. vma_next = alloc_and_link_vma(&mm, 0x6000, 0x9000, 6, flags);
  794. vma_next->vm_ops = &vm_ops; /* This should have no impact. */
  795. vmg_set_range(&vmg, 0x3000, 0x6000, 3, flags);
  796. vmg.vma = vma;
  797. vmg.prev = vma;
  798. vma->anon_vma = &dummy_anon_vma;
  799. ASSERT_EQ(merge_existing(&vmg), vma_next);
  800. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  801. ASSERT_EQ(vma_next->vm_start, 0x3000);
  802. ASSERT_EQ(vma_next->vm_end, 0x9000);
  803. ASSERT_EQ(vma_next->vm_pgoff, 3);
  804. ASSERT_EQ(vma_next->anon_vma, &dummy_anon_vma);
  805. ASSERT_EQ(vma->vm_start, 0x2000);
  806. ASSERT_EQ(vma->vm_end, 0x3000);
  807. ASSERT_EQ(vma->vm_pgoff, 2);
  808. ASSERT_TRUE(vma_write_started(vma));
  809. ASSERT_TRUE(vma_write_started(vma_next));
  810. ASSERT_EQ(mm.map_count, 2);
  811. /* Clear down and reset. */
  812. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  813. /*
  814. * Merge right case - full span.
  815. *
  816. * <-->
  817. * 0123456789
  818. * VVVVNNN
  819. * ->
  820. * 0123456789
  821. * NNNNNNN
  822. */
  823. vma = alloc_and_link_vma(&mm, 0x2000, 0x6000, 2, flags);
  824. vma_next = alloc_and_link_vma(&mm, 0x6000, 0x9000, 6, flags);
  825. vma_next->vm_ops = &vm_ops; /* This should have no impact. */
  826. vmg_set_range(&vmg, 0x2000, 0x6000, 2, flags);
  827. vmg.vma = vma;
  828. vma->anon_vma = &dummy_anon_vma;
  829. ASSERT_EQ(merge_existing(&vmg), vma_next);
  830. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  831. ASSERT_EQ(vma_next->vm_start, 0x2000);
  832. ASSERT_EQ(vma_next->vm_end, 0x9000);
  833. ASSERT_EQ(vma_next->vm_pgoff, 2);
  834. ASSERT_EQ(vma_next->anon_vma, &dummy_anon_vma);
  835. ASSERT_TRUE(vma_write_started(vma_next));
  836. ASSERT_EQ(mm.map_count, 1);
  837. /* Clear down and reset. We should have deleted vma. */
  838. ASSERT_EQ(cleanup_mm(&mm, &vmi), 1);
  839. /*
  840. * Merge left case - partial span.
  841. *
  842. * <->
  843. * 0123456789
  844. * PPPVVVV
  845. * ->
  846. * 0123456789
  847. * PPPPPPV
  848. */
  849. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  850. vma_prev->vm_ops = &vm_ops; /* This should have no impact. */
  851. vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags);
  852. vma->vm_ops = &vm_ops; /* This should have no impact. */
  853. vmg_set_range(&vmg, 0x3000, 0x6000, 3, flags);
  854. vmg.prev = vma_prev;
  855. vmg.vma = vma;
  856. vma->anon_vma = &dummy_anon_vma;
  857. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  858. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  859. ASSERT_EQ(vma_prev->vm_start, 0);
  860. ASSERT_EQ(vma_prev->vm_end, 0x6000);
  861. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  862. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  863. ASSERT_EQ(vma->vm_start, 0x6000);
  864. ASSERT_EQ(vma->vm_end, 0x7000);
  865. ASSERT_EQ(vma->vm_pgoff, 6);
  866. ASSERT_TRUE(vma_write_started(vma_prev));
  867. ASSERT_TRUE(vma_write_started(vma));
  868. ASSERT_EQ(mm.map_count, 2);
  869. /* Clear down and reset. */
  870. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  871. /*
  872. * Merge left case - full span.
  873. *
  874. * <-->
  875. * 0123456789
  876. * PPPVVVV
  877. * ->
  878. * 0123456789
  879. * PPPPPPP
  880. */
  881. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  882. vma_prev->vm_ops = &vm_ops; /* This should have no impact. */
  883. vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags);
  884. vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags);
  885. vmg.prev = vma_prev;
  886. vmg.vma = vma;
  887. vma->anon_vma = &dummy_anon_vma;
  888. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  889. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  890. ASSERT_EQ(vma_prev->vm_start, 0);
  891. ASSERT_EQ(vma_prev->vm_end, 0x7000);
  892. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  893. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  894. ASSERT_TRUE(vma_write_started(vma_prev));
  895. ASSERT_EQ(mm.map_count, 1);
  896. /* Clear down and reset. We should have deleted vma. */
  897. ASSERT_EQ(cleanup_mm(&mm, &vmi), 1);
  898. /*
  899. * Merge both case.
  900. *
  901. * <-->
  902. * 0123456789
  903. * PPPVVVVNNN
  904. * ->
  905. * 0123456789
  906. * PPPPPPPPPP
  907. */
  908. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  909. vma_prev->vm_ops = &vm_ops; /* This should have no impact. */
  910. vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags);
  911. vma_next = alloc_and_link_vma(&mm, 0x7000, 0x9000, 7, flags);
  912. vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags);
  913. vmg.prev = vma_prev;
  914. vmg.vma = vma;
  915. vma->anon_vma = &dummy_anon_vma;
  916. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  917. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  918. ASSERT_EQ(vma_prev->vm_start, 0);
  919. ASSERT_EQ(vma_prev->vm_end, 0x9000);
  920. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  921. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  922. ASSERT_TRUE(vma_write_started(vma_prev));
  923. ASSERT_EQ(mm.map_count, 1);
  924. /* Clear down and reset. We should have deleted prev and next. */
  925. ASSERT_EQ(cleanup_mm(&mm, &vmi), 1);
  926. /*
  927. * Non-merge ranges. the modified VMA merge operation assumes that the
  928. * caller always specifies ranges within the input VMA so we need only
  929. * examine these cases.
  930. *
  931. * -
  932. * -
  933. * -
  934. * <->
  935. * <>
  936. * <>
  937. * 0123456789a
  938. * PPPVVVVVNNN
  939. */
  940. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  941. vma = alloc_and_link_vma(&mm, 0x3000, 0x8000, 3, flags);
  942. vma_next = alloc_and_link_vma(&mm, 0x8000, 0xa000, 8, flags);
  943. vmg_set_range(&vmg, 0x4000, 0x5000, 4, flags);
  944. vmg.prev = vma;
  945. vmg.vma = vma;
  946. ASSERT_EQ(merge_existing(&vmg), NULL);
  947. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  948. vmg_set_range(&vmg, 0x5000, 0x6000, 5, flags);
  949. vmg.prev = vma;
  950. vmg.vma = vma;
  951. ASSERT_EQ(merge_existing(&vmg), NULL);
  952. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  953. vmg_set_range(&vmg, 0x6000, 0x7000, 6, flags);
  954. vmg.prev = vma;
  955. vmg.vma = vma;
  956. ASSERT_EQ(merge_existing(&vmg), NULL);
  957. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  958. vmg_set_range(&vmg, 0x4000, 0x7000, 4, flags);
  959. vmg.prev = vma;
  960. vmg.vma = vma;
  961. ASSERT_EQ(merge_existing(&vmg), NULL);
  962. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  963. vmg_set_range(&vmg, 0x4000, 0x6000, 4, flags);
  964. vmg.prev = vma;
  965. vmg.vma = vma;
  966. ASSERT_EQ(merge_existing(&vmg), NULL);
  967. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  968. vmg_set_range(&vmg, 0x5000, 0x6000, 5, flags);
  969. vmg.prev = vma;
  970. vmg.vma = vma;
  971. ASSERT_EQ(merge_existing(&vmg), NULL);
  972. ASSERT_EQ(vmg.state, VMA_MERGE_NOMERGE);
  973. ASSERT_EQ(cleanup_mm(&mm, &vmi), 3);
  974. return true;
  975. }
  976. static bool test_anon_vma_non_mergeable(void)
  977. {
  978. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  979. struct mm_struct mm = {};
  980. VMA_ITERATOR(vmi, &mm, 0);
  981. struct vm_area_struct *vma, *vma_prev, *vma_next;
  982. struct vma_merge_struct vmg = {
  983. .mm = &mm,
  984. .vmi = &vmi,
  985. };
  986. struct anon_vma_chain dummy_anon_vma_chain1 = {
  987. .anon_vma = &dummy_anon_vma,
  988. };
  989. struct anon_vma_chain dummy_anon_vma_chain2 = {
  990. .anon_vma = &dummy_anon_vma,
  991. };
  992. /*
  993. * In the case of modified VMA merge, merging both left and right VMAs
  994. * but where prev and next have incompatible anon_vma objects, we revert
  995. * to a merge of prev and VMA:
  996. *
  997. * <-->
  998. * 0123456789
  999. * PPPVVVVNNN
  1000. * ->
  1001. * 0123456789
  1002. * PPPPPPPNNN
  1003. */
  1004. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1005. vma = alloc_and_link_vma(&mm, 0x3000, 0x7000, 3, flags);
  1006. vma_next = alloc_and_link_vma(&mm, 0x7000, 0x9000, 7, flags);
  1007. /*
  1008. * Give both prev and next single anon_vma_chain fields, so they will
  1009. * merge with the NULL vmg->anon_vma.
  1010. *
  1011. * However, when prev is compared to next, the merge should fail.
  1012. */
  1013. INIT_LIST_HEAD(&vma_prev->anon_vma_chain);
  1014. list_add(&dummy_anon_vma_chain1.same_vma, &vma_prev->anon_vma_chain);
  1015. ASSERT_TRUE(list_is_singular(&vma_prev->anon_vma_chain));
  1016. vma_prev->anon_vma = &dummy_anon_vma;
  1017. ASSERT_TRUE(is_mergeable_anon_vma(NULL, vma_prev->anon_vma, vma_prev));
  1018. INIT_LIST_HEAD(&vma_next->anon_vma_chain);
  1019. list_add(&dummy_anon_vma_chain2.same_vma, &vma_next->anon_vma_chain);
  1020. ASSERT_TRUE(list_is_singular(&vma_next->anon_vma_chain));
  1021. vma_next->anon_vma = (struct anon_vma *)2;
  1022. ASSERT_TRUE(is_mergeable_anon_vma(NULL, vma_next->anon_vma, vma_next));
  1023. ASSERT_FALSE(is_mergeable_anon_vma(vma_prev->anon_vma, vma_next->anon_vma, NULL));
  1024. vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags);
  1025. vmg.prev = vma_prev;
  1026. vmg.vma = vma;
  1027. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  1028. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1029. ASSERT_EQ(vma_prev->vm_start, 0);
  1030. ASSERT_EQ(vma_prev->vm_end, 0x7000);
  1031. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  1032. ASSERT_TRUE(vma_write_started(vma_prev));
  1033. ASSERT_FALSE(vma_write_started(vma_next));
  1034. /* Clear down and reset. */
  1035. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  1036. /*
  1037. * Now consider the new VMA case. This is equivalent, only adding a new
  1038. * VMA in a gap between prev and next.
  1039. *
  1040. * <-->
  1041. * 0123456789
  1042. * PPP****NNN
  1043. * ->
  1044. * 0123456789
  1045. * PPPPPPPNNN
  1046. */
  1047. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1048. vma_next = alloc_and_link_vma(&mm, 0x7000, 0x9000, 7, flags);
  1049. INIT_LIST_HEAD(&vma_prev->anon_vma_chain);
  1050. list_add(&dummy_anon_vma_chain1.same_vma, &vma_prev->anon_vma_chain);
  1051. vma_prev->anon_vma = (struct anon_vma *)1;
  1052. INIT_LIST_HEAD(&vma_next->anon_vma_chain);
  1053. list_add(&dummy_anon_vma_chain2.same_vma, &vma_next->anon_vma_chain);
  1054. vma_next->anon_vma = (struct anon_vma *)2;
  1055. vmg_set_range(&vmg, 0x3000, 0x7000, 3, flags);
  1056. vmg.prev = vma_prev;
  1057. ASSERT_EQ(merge_new(&vmg), vma_prev);
  1058. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1059. ASSERT_EQ(vma_prev->vm_start, 0);
  1060. ASSERT_EQ(vma_prev->vm_end, 0x7000);
  1061. ASSERT_EQ(vma_prev->vm_pgoff, 0);
  1062. ASSERT_TRUE(vma_write_started(vma_prev));
  1063. ASSERT_FALSE(vma_write_started(vma_next));
  1064. /* Final cleanup. */
  1065. ASSERT_EQ(cleanup_mm(&mm, &vmi), 2);
  1066. return true;
  1067. }
  1068. static bool test_dup_anon_vma(void)
  1069. {
  1070. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  1071. struct mm_struct mm = {};
  1072. VMA_ITERATOR(vmi, &mm, 0);
  1073. struct vma_merge_struct vmg = {
  1074. .mm = &mm,
  1075. .vmi = &vmi,
  1076. };
  1077. struct anon_vma_chain dummy_anon_vma_chain = {
  1078. .anon_vma = &dummy_anon_vma,
  1079. };
  1080. struct vm_area_struct *vma_prev, *vma_next, *vma;
  1081. reset_dummy_anon_vma();
  1082. /*
  1083. * Expanding a VMA delete the next one duplicates next's anon_vma and
  1084. * assigns it to the expanded VMA.
  1085. *
  1086. * This covers new VMA merging, as these operations amount to a VMA
  1087. * expand.
  1088. */
  1089. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1090. vma_next = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1091. vma_next->anon_vma = &dummy_anon_vma;
  1092. vmg_set_range(&vmg, 0, 0x5000, 0, flags);
  1093. vmg.vma = vma_prev;
  1094. vmg.next = vma_next;
  1095. ASSERT_EQ(expand_existing(&vmg), 0);
  1096. /* Will have been cloned. */
  1097. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  1098. ASSERT_TRUE(vma_prev->anon_vma->was_cloned);
  1099. /* Cleanup ready for next run. */
  1100. cleanup_mm(&mm, &vmi);
  1101. /*
  1102. * next has anon_vma, we assign to prev.
  1103. *
  1104. * |<----->|
  1105. * |-------*********-------|
  1106. * prev vma next
  1107. * extend delete delete
  1108. */
  1109. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1110. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1111. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x8000, 5, flags);
  1112. /* Initialise avc so mergeability check passes. */
  1113. INIT_LIST_HEAD(&vma_next->anon_vma_chain);
  1114. list_add(&dummy_anon_vma_chain.same_vma, &vma_next->anon_vma_chain);
  1115. vma_next->anon_vma = &dummy_anon_vma;
  1116. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  1117. vmg.prev = vma_prev;
  1118. vmg.vma = vma;
  1119. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  1120. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1121. ASSERT_EQ(vma_prev->vm_start, 0);
  1122. ASSERT_EQ(vma_prev->vm_end, 0x8000);
  1123. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  1124. ASSERT_TRUE(vma_prev->anon_vma->was_cloned);
  1125. cleanup_mm(&mm, &vmi);
  1126. /*
  1127. * vma has anon_vma, we assign to prev.
  1128. *
  1129. * |<----->|
  1130. * |-------*********-------|
  1131. * prev vma next
  1132. * extend delete delete
  1133. */
  1134. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1135. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1136. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x8000, 5, flags);
  1137. vma->anon_vma = &dummy_anon_vma;
  1138. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  1139. vmg.prev = vma_prev;
  1140. vmg.vma = vma;
  1141. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  1142. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1143. ASSERT_EQ(vma_prev->vm_start, 0);
  1144. ASSERT_EQ(vma_prev->vm_end, 0x8000);
  1145. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  1146. ASSERT_TRUE(vma_prev->anon_vma->was_cloned);
  1147. cleanup_mm(&mm, &vmi);
  1148. /*
  1149. * vma has anon_vma, we assign to prev.
  1150. *
  1151. * |<----->|
  1152. * |-------*************
  1153. * prev vma
  1154. * extend shrink/delete
  1155. */
  1156. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1157. vma = alloc_and_link_vma(&mm, 0x3000, 0x8000, 3, flags);
  1158. vma->anon_vma = &dummy_anon_vma;
  1159. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  1160. vmg.prev = vma_prev;
  1161. vmg.vma = vma;
  1162. ASSERT_EQ(merge_existing(&vmg), vma_prev);
  1163. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1164. ASSERT_EQ(vma_prev->vm_start, 0);
  1165. ASSERT_EQ(vma_prev->vm_end, 0x5000);
  1166. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  1167. ASSERT_TRUE(vma_prev->anon_vma->was_cloned);
  1168. cleanup_mm(&mm, &vmi);
  1169. /*
  1170. * vma has anon_vma, we assign to next.
  1171. *
  1172. * |<----->|
  1173. * *************-------|
  1174. * vma next
  1175. * shrink/delete extend
  1176. */
  1177. vma = alloc_and_link_vma(&mm, 0, 0x5000, 0, flags);
  1178. vma_next = alloc_and_link_vma(&mm, 0x5000, 0x8000, 5, flags);
  1179. vma->anon_vma = &dummy_anon_vma;
  1180. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  1181. vmg.prev = vma;
  1182. vmg.vma = vma;
  1183. ASSERT_EQ(merge_existing(&vmg), vma_next);
  1184. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1185. ASSERT_EQ(vma_next->vm_start, 0x3000);
  1186. ASSERT_EQ(vma_next->vm_end, 0x8000);
  1187. ASSERT_EQ(vma_next->anon_vma, &dummy_anon_vma);
  1188. ASSERT_TRUE(vma_next->anon_vma->was_cloned);
  1189. cleanup_mm(&mm, &vmi);
  1190. return true;
  1191. }
  1192. static bool test_vmi_prealloc_fail(void)
  1193. {
  1194. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  1195. struct mm_struct mm = {};
  1196. VMA_ITERATOR(vmi, &mm, 0);
  1197. struct vma_merge_struct vmg = {
  1198. .mm = &mm,
  1199. .vmi = &vmi,
  1200. };
  1201. struct vm_area_struct *vma_prev, *vma;
  1202. /*
  1203. * We are merging vma into prev, with vma possessing an anon_vma, which
  1204. * will be duplicated. We cause the vmi preallocation to fail and assert
  1205. * the duplicated anon_vma is unlinked.
  1206. */
  1207. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1208. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1209. vma->anon_vma = &dummy_anon_vma;
  1210. vmg_set_range(&vmg, 0x3000, 0x5000, 3, flags);
  1211. vmg.prev = vma_prev;
  1212. vmg.vma = vma;
  1213. fail_prealloc = true;
  1214. /* This will cause the merge to fail. */
  1215. ASSERT_EQ(merge_existing(&vmg), NULL);
  1216. ASSERT_EQ(vmg.state, VMA_MERGE_ERROR_NOMEM);
  1217. /* We will already have assigned the anon_vma. */
  1218. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  1219. /* And it was both cloned and unlinked. */
  1220. ASSERT_TRUE(dummy_anon_vma.was_cloned);
  1221. ASSERT_TRUE(dummy_anon_vma.was_unlinked);
  1222. cleanup_mm(&mm, &vmi); /* Resets fail_prealloc too. */
  1223. /*
  1224. * We repeat the same operation for expanding a VMA, which is what new
  1225. * VMA merging ultimately uses too. This asserts that unlinking is
  1226. * performed in this case too.
  1227. */
  1228. vma_prev = alloc_and_link_vma(&mm, 0, 0x3000, 0, flags);
  1229. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1230. vma->anon_vma = &dummy_anon_vma;
  1231. vmg_set_range(&vmg, 0, 0x5000, 3, flags);
  1232. vmg.vma = vma_prev;
  1233. vmg.next = vma;
  1234. fail_prealloc = true;
  1235. ASSERT_EQ(expand_existing(&vmg), -ENOMEM);
  1236. ASSERT_EQ(vmg.state, VMA_MERGE_ERROR_NOMEM);
  1237. ASSERT_EQ(vma_prev->anon_vma, &dummy_anon_vma);
  1238. ASSERT_TRUE(dummy_anon_vma.was_cloned);
  1239. ASSERT_TRUE(dummy_anon_vma.was_unlinked);
  1240. cleanup_mm(&mm, &vmi);
  1241. return true;
  1242. }
  1243. static bool test_merge_extend(void)
  1244. {
  1245. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  1246. struct mm_struct mm = {};
  1247. VMA_ITERATOR(vmi, &mm, 0x1000);
  1248. struct vm_area_struct *vma;
  1249. vma = alloc_and_link_vma(&mm, 0, 0x1000, 0, flags);
  1250. alloc_and_link_vma(&mm, 0x3000, 0x4000, 3, flags);
  1251. /*
  1252. * Extend a VMA into the gap between itself and the following VMA.
  1253. * This should result in a merge.
  1254. *
  1255. * <->
  1256. * * *
  1257. *
  1258. */
  1259. ASSERT_EQ(vma_merge_extend(&vmi, vma, 0x2000), vma);
  1260. ASSERT_EQ(vma->vm_start, 0);
  1261. ASSERT_EQ(vma->vm_end, 0x4000);
  1262. ASSERT_EQ(vma->vm_pgoff, 0);
  1263. ASSERT_TRUE(vma_write_started(vma));
  1264. ASSERT_EQ(mm.map_count, 1);
  1265. cleanup_mm(&mm, &vmi);
  1266. return true;
  1267. }
  1268. static bool test_copy_vma(void)
  1269. {
  1270. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  1271. struct mm_struct mm = {};
  1272. bool need_locks = false;
  1273. VMA_ITERATOR(vmi, &mm, 0);
  1274. struct vm_area_struct *vma, *vma_new, *vma_next;
  1275. /* Move backwards and do not merge. */
  1276. vma = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1277. vma_new = copy_vma(&vma, 0, 0x2000, 0, &need_locks);
  1278. ASSERT_NE(vma_new, vma);
  1279. ASSERT_EQ(vma_new->vm_start, 0);
  1280. ASSERT_EQ(vma_new->vm_end, 0x2000);
  1281. ASSERT_EQ(vma_new->vm_pgoff, 0);
  1282. cleanup_mm(&mm, &vmi);
  1283. /* Move a VMA into position next to another and merge the two. */
  1284. vma = alloc_and_link_vma(&mm, 0, 0x2000, 0, flags);
  1285. vma_next = alloc_and_link_vma(&mm, 0x6000, 0x8000, 6, flags);
  1286. vma_new = copy_vma(&vma, 0x4000, 0x2000, 4, &need_locks);
  1287. ASSERT_EQ(vma_new, vma_next);
  1288. cleanup_mm(&mm, &vmi);
  1289. return true;
  1290. }
  1291. static bool test_expand_only_mode(void)
  1292. {
  1293. unsigned long flags = VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE;
  1294. struct mm_struct mm = {};
  1295. VMA_ITERATOR(vmi, &mm, 0);
  1296. struct vm_area_struct *vma_prev, *vma;
  1297. VMG_STATE(vmg, &mm, &vmi, 0x5000, 0x9000, flags, 5);
  1298. /*
  1299. * Place a VMA prior to the one we're expanding so we assert that we do
  1300. * not erroneously try to traverse to the previous VMA even though we
  1301. * have, through the use of VMG_FLAG_JUST_EXPAND, indicated we do not
  1302. * need to do so.
  1303. */
  1304. alloc_and_link_vma(&mm, 0, 0x2000, 0, flags);
  1305. /*
  1306. * We will be positioned at the prev VMA, but looking to expand to
  1307. * 0x9000.
  1308. */
  1309. vma_iter_set(&vmi, 0x3000);
  1310. vma_prev = alloc_and_link_vma(&mm, 0x3000, 0x5000, 3, flags);
  1311. vmg.prev = vma_prev;
  1312. vmg.merge_flags = VMG_FLAG_JUST_EXPAND;
  1313. vma = vma_merge_new_range(&vmg);
  1314. ASSERT_NE(vma, NULL);
  1315. ASSERT_EQ(vma, vma_prev);
  1316. ASSERT_EQ(vmg.state, VMA_MERGE_SUCCESS);
  1317. ASSERT_EQ(vma->vm_start, 0x3000);
  1318. ASSERT_EQ(vma->vm_end, 0x9000);
  1319. ASSERT_EQ(vma->vm_pgoff, 3);
  1320. ASSERT_TRUE(vma_write_started(vma));
  1321. ASSERT_EQ(vma_iter_addr(&vmi), 0x3000);
  1322. cleanup_mm(&mm, &vmi);
  1323. return true;
  1324. }
  1325. int main(void)
  1326. {
  1327. int num_tests = 0, num_fail = 0;
  1328. maple_tree_init();
  1329. #define TEST(name) \
  1330. do { \
  1331. num_tests++; \
  1332. if (!test_##name()) { \
  1333. num_fail++; \
  1334. fprintf(stderr, "Test " #name " FAILED\n"); \
  1335. } \
  1336. } while (0)
  1337. /* Very simple tests to kick the tyres. */
  1338. TEST(simple_merge);
  1339. TEST(simple_modify);
  1340. TEST(simple_expand);
  1341. TEST(simple_shrink);
  1342. TEST(merge_new);
  1343. TEST(vma_merge_special_flags);
  1344. TEST(vma_merge_with_close);
  1345. TEST(vma_merge_new_with_close);
  1346. TEST(merge_existing);
  1347. TEST(anon_vma_non_mergeable);
  1348. TEST(dup_anon_vma);
  1349. TEST(vmi_prealloc_fail);
  1350. TEST(merge_extend);
  1351. TEST(copy_vma);
  1352. TEST(expand_only_mode);
  1353. #undef TEST
  1354. printf("%d tests run, %d passed, %d failed.\n",
  1355. num_tests, num_tests - num_fail, num_fail);
  1356. return num_fail == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
  1357. }