hmm-tests.c 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * HMM stands for Heterogeneous Memory Management, it is a helper layer inside
  4. * the linux kernel to help device drivers mirror a process address space in
  5. * the device. This allows the device to use the same address space which
  6. * makes communication and data exchange a lot easier.
  7. *
  8. * This framework's sole purpose is to exercise various code paths inside
  9. * the kernel to make sure that HMM performs as expected and to flush out any
  10. * bugs.
  11. */
  12. #include "../kselftest_harness.h"
  13. #include <errno.h>
  14. #include <fcntl.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <stdint.h>
  18. #include <unistd.h>
  19. #include <strings.h>
  20. #include <time.h>
  21. #include <pthread.h>
  22. #include <sys/types.h>
  23. #include <sys/stat.h>
  24. #include <sys/mman.h>
  25. #include <sys/ioctl.h>
  26. /*
  27. * This is a private UAPI to the kernel test module so it isn't exported
  28. * in the usual include/uapi/... directory.
  29. */
  30. #include <lib/test_hmm_uapi.h>
  31. #include <mm/gup_test.h>
  32. struct hmm_buffer {
  33. void *ptr;
  34. void *mirror;
  35. unsigned long size;
  36. int fd;
  37. uint64_t cpages;
  38. uint64_t faults;
  39. };
  40. enum {
  41. HMM_PRIVATE_DEVICE_ONE,
  42. HMM_PRIVATE_DEVICE_TWO,
  43. HMM_COHERENCE_DEVICE_ONE,
  44. HMM_COHERENCE_DEVICE_TWO,
  45. };
  46. #define TWOMEG (1 << 21)
  47. #define HMM_BUFFER_SIZE (1024 << 12)
  48. #define HMM_PATH_MAX 64
  49. #define NTIMES 10
  50. #define ALIGN(x, a) (((x) + (a - 1)) & (~((a) - 1)))
  51. /* Just the flags we need, copied from mm.h: */
  52. #ifndef FOLL_WRITE
  53. #define FOLL_WRITE 0x01 /* check pte is writable */
  54. #endif
  55. #ifndef FOLL_LONGTERM
  56. #define FOLL_LONGTERM 0x100 /* mapping lifetime is indefinite */
  57. #endif
  58. FIXTURE(hmm)
  59. {
  60. int fd;
  61. unsigned int page_size;
  62. unsigned int page_shift;
  63. };
  64. FIXTURE_VARIANT(hmm)
  65. {
  66. int device_number;
  67. };
  68. FIXTURE_VARIANT_ADD(hmm, hmm_device_private)
  69. {
  70. .device_number = HMM_PRIVATE_DEVICE_ONE,
  71. };
  72. FIXTURE_VARIANT_ADD(hmm, hmm_device_coherent)
  73. {
  74. .device_number = HMM_COHERENCE_DEVICE_ONE,
  75. };
  76. FIXTURE(hmm2)
  77. {
  78. int fd0;
  79. int fd1;
  80. unsigned int page_size;
  81. unsigned int page_shift;
  82. };
  83. FIXTURE_VARIANT(hmm2)
  84. {
  85. int device_number0;
  86. int device_number1;
  87. };
  88. FIXTURE_VARIANT_ADD(hmm2, hmm2_device_private)
  89. {
  90. .device_number0 = HMM_PRIVATE_DEVICE_ONE,
  91. .device_number1 = HMM_PRIVATE_DEVICE_TWO,
  92. };
  93. FIXTURE_VARIANT_ADD(hmm2, hmm2_device_coherent)
  94. {
  95. .device_number0 = HMM_COHERENCE_DEVICE_ONE,
  96. .device_number1 = HMM_COHERENCE_DEVICE_TWO,
  97. };
  98. static int hmm_open(int unit)
  99. {
  100. char pathname[HMM_PATH_MAX];
  101. int fd;
  102. snprintf(pathname, sizeof(pathname), "/dev/hmm_dmirror%d", unit);
  103. fd = open(pathname, O_RDWR, 0);
  104. if (fd < 0)
  105. fprintf(stderr, "could not open hmm dmirror driver (%s)\n",
  106. pathname);
  107. return fd;
  108. }
  109. static bool hmm_is_coherent_type(int dev_num)
  110. {
  111. return (dev_num >= HMM_COHERENCE_DEVICE_ONE);
  112. }
  113. FIXTURE_SETUP(hmm)
  114. {
  115. self->page_size = sysconf(_SC_PAGE_SIZE);
  116. self->page_shift = ffs(self->page_size) - 1;
  117. self->fd = hmm_open(variant->device_number);
  118. if (self->fd < 0 && hmm_is_coherent_type(variant->device_number))
  119. SKIP(return, "DEVICE_COHERENT not available");
  120. ASSERT_GE(self->fd, 0);
  121. }
  122. FIXTURE_SETUP(hmm2)
  123. {
  124. self->page_size = sysconf(_SC_PAGE_SIZE);
  125. self->page_shift = ffs(self->page_size) - 1;
  126. self->fd0 = hmm_open(variant->device_number0);
  127. if (self->fd0 < 0 && hmm_is_coherent_type(variant->device_number0))
  128. SKIP(return, "DEVICE_COHERENT not available");
  129. ASSERT_GE(self->fd0, 0);
  130. self->fd1 = hmm_open(variant->device_number1);
  131. ASSERT_GE(self->fd1, 0);
  132. }
  133. FIXTURE_TEARDOWN(hmm)
  134. {
  135. int ret = close(self->fd);
  136. ASSERT_EQ(ret, 0);
  137. self->fd = -1;
  138. }
  139. FIXTURE_TEARDOWN(hmm2)
  140. {
  141. int ret = close(self->fd0);
  142. ASSERT_EQ(ret, 0);
  143. self->fd0 = -1;
  144. ret = close(self->fd1);
  145. ASSERT_EQ(ret, 0);
  146. self->fd1 = -1;
  147. }
  148. static int hmm_dmirror_cmd(int fd,
  149. unsigned long request,
  150. struct hmm_buffer *buffer,
  151. unsigned long npages)
  152. {
  153. struct hmm_dmirror_cmd cmd;
  154. int ret;
  155. /* Simulate a device reading system memory. */
  156. cmd.addr = (__u64)buffer->ptr;
  157. cmd.ptr = (__u64)buffer->mirror;
  158. cmd.npages = npages;
  159. for (;;) {
  160. ret = ioctl(fd, request, &cmd);
  161. if (ret == 0)
  162. break;
  163. if (errno == EINTR)
  164. continue;
  165. return -errno;
  166. }
  167. buffer->cpages = cmd.cpages;
  168. buffer->faults = cmd.faults;
  169. return 0;
  170. }
  171. static void hmm_buffer_free(struct hmm_buffer *buffer)
  172. {
  173. if (buffer == NULL)
  174. return;
  175. if (buffer->ptr)
  176. munmap(buffer->ptr, buffer->size);
  177. free(buffer->mirror);
  178. free(buffer);
  179. }
  180. /*
  181. * Create a temporary file that will be deleted on close.
  182. */
  183. static int hmm_create_file(unsigned long size)
  184. {
  185. char path[HMM_PATH_MAX];
  186. int fd;
  187. strcpy(path, "/tmp");
  188. fd = open(path, O_TMPFILE | O_EXCL | O_RDWR, 0600);
  189. if (fd >= 0) {
  190. int r;
  191. do {
  192. r = ftruncate(fd, size);
  193. } while (r == -1 && errno == EINTR);
  194. if (!r)
  195. return fd;
  196. close(fd);
  197. }
  198. return -1;
  199. }
  200. /*
  201. * Return a random unsigned number.
  202. */
  203. static unsigned int hmm_random(void)
  204. {
  205. static int fd = -1;
  206. unsigned int r;
  207. if (fd < 0) {
  208. fd = open("/dev/urandom", O_RDONLY);
  209. if (fd < 0) {
  210. fprintf(stderr, "%s:%d failed to open /dev/urandom\n",
  211. __FILE__, __LINE__);
  212. return ~0U;
  213. }
  214. }
  215. read(fd, &r, sizeof(r));
  216. return r;
  217. }
  218. static void hmm_nanosleep(unsigned int n)
  219. {
  220. struct timespec t;
  221. t.tv_sec = 0;
  222. t.tv_nsec = n;
  223. nanosleep(&t, NULL);
  224. }
  225. static int hmm_migrate_sys_to_dev(int fd,
  226. struct hmm_buffer *buffer,
  227. unsigned long npages)
  228. {
  229. return hmm_dmirror_cmd(fd, HMM_DMIRROR_MIGRATE_TO_DEV, buffer, npages);
  230. }
  231. static int hmm_migrate_dev_to_sys(int fd,
  232. struct hmm_buffer *buffer,
  233. unsigned long npages)
  234. {
  235. return hmm_dmirror_cmd(fd, HMM_DMIRROR_MIGRATE_TO_SYS, buffer, npages);
  236. }
  237. /*
  238. * Simple NULL test of device open/close.
  239. */
  240. TEST_F(hmm, open_close)
  241. {
  242. }
  243. /*
  244. * Read private anonymous memory.
  245. */
  246. TEST_F(hmm, anon_read)
  247. {
  248. struct hmm_buffer *buffer;
  249. unsigned long npages;
  250. unsigned long size;
  251. unsigned long i;
  252. int *ptr;
  253. int ret;
  254. int val;
  255. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  256. ASSERT_NE(npages, 0);
  257. size = npages << self->page_shift;
  258. buffer = malloc(sizeof(*buffer));
  259. ASSERT_NE(buffer, NULL);
  260. buffer->fd = -1;
  261. buffer->size = size;
  262. buffer->mirror = malloc(size);
  263. ASSERT_NE(buffer->mirror, NULL);
  264. buffer->ptr = mmap(NULL, size,
  265. PROT_READ | PROT_WRITE,
  266. MAP_PRIVATE | MAP_ANONYMOUS,
  267. buffer->fd, 0);
  268. ASSERT_NE(buffer->ptr, MAP_FAILED);
  269. /*
  270. * Initialize buffer in system memory but leave the first two pages
  271. * zero (pte_none and pfn_zero).
  272. */
  273. i = 2 * self->page_size / sizeof(*ptr);
  274. for (ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  275. ptr[i] = i;
  276. /* Set buffer permission to read-only. */
  277. ret = mprotect(buffer->ptr, size, PROT_READ);
  278. ASSERT_EQ(ret, 0);
  279. /* Populate the CPU page table with a special zero page. */
  280. val = *(int *)(buffer->ptr + self->page_size);
  281. ASSERT_EQ(val, 0);
  282. /* Simulate a device reading system memory. */
  283. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_READ, buffer, npages);
  284. ASSERT_EQ(ret, 0);
  285. ASSERT_EQ(buffer->cpages, npages);
  286. ASSERT_EQ(buffer->faults, 1);
  287. /* Check what the device read. */
  288. ptr = buffer->mirror;
  289. for (i = 0; i < 2 * self->page_size / sizeof(*ptr); ++i)
  290. ASSERT_EQ(ptr[i], 0);
  291. for (; i < size / sizeof(*ptr); ++i)
  292. ASSERT_EQ(ptr[i], i);
  293. hmm_buffer_free(buffer);
  294. }
  295. /*
  296. * Read private anonymous memory which has been protected with
  297. * mprotect() PROT_NONE.
  298. */
  299. TEST_F(hmm, anon_read_prot)
  300. {
  301. struct hmm_buffer *buffer;
  302. unsigned long npages;
  303. unsigned long size;
  304. unsigned long i;
  305. int *ptr;
  306. int ret;
  307. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  308. ASSERT_NE(npages, 0);
  309. size = npages << self->page_shift;
  310. buffer = malloc(sizeof(*buffer));
  311. ASSERT_NE(buffer, NULL);
  312. buffer->fd = -1;
  313. buffer->size = size;
  314. buffer->mirror = malloc(size);
  315. ASSERT_NE(buffer->mirror, NULL);
  316. buffer->ptr = mmap(NULL, size,
  317. PROT_READ | PROT_WRITE,
  318. MAP_PRIVATE | MAP_ANONYMOUS,
  319. buffer->fd, 0);
  320. ASSERT_NE(buffer->ptr, MAP_FAILED);
  321. /* Initialize buffer in system memory. */
  322. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  323. ptr[i] = i;
  324. /* Initialize mirror buffer so we can verify it isn't written. */
  325. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  326. ptr[i] = -i;
  327. /* Protect buffer from reading. */
  328. ret = mprotect(buffer->ptr, size, PROT_NONE);
  329. ASSERT_EQ(ret, 0);
  330. /* Simulate a device reading system memory. */
  331. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_READ, buffer, npages);
  332. ASSERT_EQ(ret, -EFAULT);
  333. /* Allow CPU to read the buffer so we can check it. */
  334. ret = mprotect(buffer->ptr, size, PROT_READ);
  335. ASSERT_EQ(ret, 0);
  336. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  337. ASSERT_EQ(ptr[i], i);
  338. /* Check what the device read. */
  339. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  340. ASSERT_EQ(ptr[i], -i);
  341. hmm_buffer_free(buffer);
  342. }
  343. /*
  344. * Write private anonymous memory.
  345. */
  346. TEST_F(hmm, anon_write)
  347. {
  348. struct hmm_buffer *buffer;
  349. unsigned long npages;
  350. unsigned long size;
  351. unsigned long i;
  352. int *ptr;
  353. int ret;
  354. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  355. ASSERT_NE(npages, 0);
  356. size = npages << self->page_shift;
  357. buffer = malloc(sizeof(*buffer));
  358. ASSERT_NE(buffer, NULL);
  359. buffer->fd = -1;
  360. buffer->size = size;
  361. buffer->mirror = malloc(size);
  362. ASSERT_NE(buffer->mirror, NULL);
  363. buffer->ptr = mmap(NULL, size,
  364. PROT_READ | PROT_WRITE,
  365. MAP_PRIVATE | MAP_ANONYMOUS,
  366. buffer->fd, 0);
  367. ASSERT_NE(buffer->ptr, MAP_FAILED);
  368. /* Initialize data that the device will write to buffer->ptr. */
  369. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  370. ptr[i] = i;
  371. /* Simulate a device writing system memory. */
  372. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  373. ASSERT_EQ(ret, 0);
  374. ASSERT_EQ(buffer->cpages, npages);
  375. ASSERT_EQ(buffer->faults, 1);
  376. /* Check what the device wrote. */
  377. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  378. ASSERT_EQ(ptr[i], i);
  379. hmm_buffer_free(buffer);
  380. }
  381. /*
  382. * Write private anonymous memory which has been protected with
  383. * mprotect() PROT_READ.
  384. */
  385. TEST_F(hmm, anon_write_prot)
  386. {
  387. struct hmm_buffer *buffer;
  388. unsigned long npages;
  389. unsigned long size;
  390. unsigned long i;
  391. int *ptr;
  392. int ret;
  393. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  394. ASSERT_NE(npages, 0);
  395. size = npages << self->page_shift;
  396. buffer = malloc(sizeof(*buffer));
  397. ASSERT_NE(buffer, NULL);
  398. buffer->fd = -1;
  399. buffer->size = size;
  400. buffer->mirror = malloc(size);
  401. ASSERT_NE(buffer->mirror, NULL);
  402. buffer->ptr = mmap(NULL, size,
  403. PROT_READ,
  404. MAP_PRIVATE | MAP_ANONYMOUS,
  405. buffer->fd, 0);
  406. ASSERT_NE(buffer->ptr, MAP_FAILED);
  407. /* Simulate a device reading a zero page of memory. */
  408. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_READ, buffer, 1);
  409. ASSERT_EQ(ret, 0);
  410. ASSERT_EQ(buffer->cpages, 1);
  411. ASSERT_EQ(buffer->faults, 1);
  412. /* Initialize data that the device will write to buffer->ptr. */
  413. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  414. ptr[i] = i;
  415. /* Simulate a device writing system memory. */
  416. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  417. ASSERT_EQ(ret, -EPERM);
  418. /* Check what the device wrote. */
  419. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  420. ASSERT_EQ(ptr[i], 0);
  421. /* Now allow writing and see that the zero page is replaced. */
  422. ret = mprotect(buffer->ptr, size, PROT_WRITE | PROT_READ);
  423. ASSERT_EQ(ret, 0);
  424. /* Simulate a device writing system memory. */
  425. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  426. ASSERT_EQ(ret, 0);
  427. ASSERT_EQ(buffer->cpages, npages);
  428. ASSERT_EQ(buffer->faults, 1);
  429. /* Check what the device wrote. */
  430. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  431. ASSERT_EQ(ptr[i], i);
  432. hmm_buffer_free(buffer);
  433. }
  434. /*
  435. * Check that a device writing an anonymous private mapping
  436. * will copy-on-write if a child process inherits the mapping.
  437. */
  438. TEST_F(hmm, anon_write_child)
  439. {
  440. struct hmm_buffer *buffer;
  441. unsigned long npages;
  442. unsigned long size;
  443. unsigned long i;
  444. int *ptr;
  445. pid_t pid;
  446. int child_fd;
  447. int ret;
  448. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  449. ASSERT_NE(npages, 0);
  450. size = npages << self->page_shift;
  451. buffer = malloc(sizeof(*buffer));
  452. ASSERT_NE(buffer, NULL);
  453. buffer->fd = -1;
  454. buffer->size = size;
  455. buffer->mirror = malloc(size);
  456. ASSERT_NE(buffer->mirror, NULL);
  457. buffer->ptr = mmap(NULL, size,
  458. PROT_READ | PROT_WRITE,
  459. MAP_PRIVATE | MAP_ANONYMOUS,
  460. buffer->fd, 0);
  461. ASSERT_NE(buffer->ptr, MAP_FAILED);
  462. /* Initialize buffer->ptr so we can tell if it is written. */
  463. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  464. ptr[i] = i;
  465. /* Initialize data that the device will write to buffer->ptr. */
  466. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  467. ptr[i] = -i;
  468. pid = fork();
  469. if (pid == -1)
  470. ASSERT_EQ(pid, 0);
  471. if (pid != 0) {
  472. waitpid(pid, &ret, 0);
  473. ASSERT_EQ(WIFEXITED(ret), 1);
  474. /* Check that the parent's buffer did not change. */
  475. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  476. ASSERT_EQ(ptr[i], i);
  477. return;
  478. }
  479. /* Check that we see the parent's values. */
  480. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  481. ASSERT_EQ(ptr[i], i);
  482. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  483. ASSERT_EQ(ptr[i], -i);
  484. /* The child process needs its own mirror to its own mm. */
  485. child_fd = hmm_open(0);
  486. ASSERT_GE(child_fd, 0);
  487. /* Simulate a device writing system memory. */
  488. ret = hmm_dmirror_cmd(child_fd, HMM_DMIRROR_WRITE, buffer, npages);
  489. ASSERT_EQ(ret, 0);
  490. ASSERT_EQ(buffer->cpages, npages);
  491. ASSERT_EQ(buffer->faults, 1);
  492. /* Check what the device wrote. */
  493. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  494. ASSERT_EQ(ptr[i], -i);
  495. close(child_fd);
  496. exit(0);
  497. }
  498. /*
  499. * Check that a device writing an anonymous shared mapping
  500. * will not copy-on-write if a child process inherits the mapping.
  501. */
  502. TEST_F(hmm, anon_write_child_shared)
  503. {
  504. struct hmm_buffer *buffer;
  505. unsigned long npages;
  506. unsigned long size;
  507. unsigned long i;
  508. int *ptr;
  509. pid_t pid;
  510. int child_fd;
  511. int ret;
  512. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  513. ASSERT_NE(npages, 0);
  514. size = npages << self->page_shift;
  515. buffer = malloc(sizeof(*buffer));
  516. ASSERT_NE(buffer, NULL);
  517. buffer->fd = -1;
  518. buffer->size = size;
  519. buffer->mirror = malloc(size);
  520. ASSERT_NE(buffer->mirror, NULL);
  521. buffer->ptr = mmap(NULL, size,
  522. PROT_READ | PROT_WRITE,
  523. MAP_SHARED | MAP_ANONYMOUS,
  524. buffer->fd, 0);
  525. ASSERT_NE(buffer->ptr, MAP_FAILED);
  526. /* Initialize buffer->ptr so we can tell if it is written. */
  527. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  528. ptr[i] = i;
  529. /* Initialize data that the device will write to buffer->ptr. */
  530. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  531. ptr[i] = -i;
  532. pid = fork();
  533. if (pid == -1)
  534. ASSERT_EQ(pid, 0);
  535. if (pid != 0) {
  536. waitpid(pid, &ret, 0);
  537. ASSERT_EQ(WIFEXITED(ret), 1);
  538. /* Check that the parent's buffer did change. */
  539. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  540. ASSERT_EQ(ptr[i], -i);
  541. return;
  542. }
  543. /* Check that we see the parent's values. */
  544. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  545. ASSERT_EQ(ptr[i], i);
  546. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  547. ASSERT_EQ(ptr[i], -i);
  548. /* The child process needs its own mirror to its own mm. */
  549. child_fd = hmm_open(0);
  550. ASSERT_GE(child_fd, 0);
  551. /* Simulate a device writing system memory. */
  552. ret = hmm_dmirror_cmd(child_fd, HMM_DMIRROR_WRITE, buffer, npages);
  553. ASSERT_EQ(ret, 0);
  554. ASSERT_EQ(buffer->cpages, npages);
  555. ASSERT_EQ(buffer->faults, 1);
  556. /* Check what the device wrote. */
  557. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  558. ASSERT_EQ(ptr[i], -i);
  559. close(child_fd);
  560. exit(0);
  561. }
  562. /*
  563. * Write private anonymous huge page.
  564. */
  565. TEST_F(hmm, anon_write_huge)
  566. {
  567. struct hmm_buffer *buffer;
  568. unsigned long npages;
  569. unsigned long size;
  570. unsigned long i;
  571. void *old_ptr;
  572. void *map;
  573. int *ptr;
  574. int ret;
  575. size = 2 * TWOMEG;
  576. buffer = malloc(sizeof(*buffer));
  577. ASSERT_NE(buffer, NULL);
  578. buffer->fd = -1;
  579. buffer->size = size;
  580. buffer->mirror = malloc(size);
  581. ASSERT_NE(buffer->mirror, NULL);
  582. buffer->ptr = mmap(NULL, size,
  583. PROT_READ | PROT_WRITE,
  584. MAP_PRIVATE | MAP_ANONYMOUS,
  585. buffer->fd, 0);
  586. ASSERT_NE(buffer->ptr, MAP_FAILED);
  587. size = TWOMEG;
  588. npages = size >> self->page_shift;
  589. map = (void *)ALIGN((uintptr_t)buffer->ptr, size);
  590. ret = madvise(map, size, MADV_HUGEPAGE);
  591. ASSERT_EQ(ret, 0);
  592. old_ptr = buffer->ptr;
  593. buffer->ptr = map;
  594. /* Initialize data that the device will write to buffer->ptr. */
  595. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  596. ptr[i] = i;
  597. /* Simulate a device writing system memory. */
  598. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  599. ASSERT_EQ(ret, 0);
  600. ASSERT_EQ(buffer->cpages, npages);
  601. ASSERT_EQ(buffer->faults, 1);
  602. /* Check what the device wrote. */
  603. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  604. ASSERT_EQ(ptr[i], i);
  605. buffer->ptr = old_ptr;
  606. hmm_buffer_free(buffer);
  607. }
  608. /*
  609. * Read numeric data from raw and tagged kernel status files. Used to read
  610. * /proc and /sys data (without a tag) and from /proc/meminfo (with a tag).
  611. */
  612. static long file_read_ulong(char *file, const char *tag)
  613. {
  614. int fd;
  615. char buf[2048];
  616. int len;
  617. char *p, *q;
  618. long val;
  619. fd = open(file, O_RDONLY);
  620. if (fd < 0) {
  621. /* Error opening the file */
  622. return -1;
  623. }
  624. len = read(fd, buf, sizeof(buf));
  625. close(fd);
  626. if (len < 0) {
  627. /* Error in reading the file */
  628. return -1;
  629. }
  630. if (len == sizeof(buf)) {
  631. /* Error file is too large */
  632. return -1;
  633. }
  634. buf[len] = '\0';
  635. /* Search for a tag if provided */
  636. if (tag) {
  637. p = strstr(buf, tag);
  638. if (!p)
  639. return -1; /* looks like the line we want isn't there */
  640. p += strlen(tag);
  641. } else
  642. p = buf;
  643. val = strtol(p, &q, 0);
  644. if (*q != ' ') {
  645. /* Error parsing the file */
  646. return -1;
  647. }
  648. return val;
  649. }
  650. /*
  651. * Write huge TLBFS page.
  652. */
  653. TEST_F(hmm, anon_write_hugetlbfs)
  654. {
  655. struct hmm_buffer *buffer;
  656. unsigned long npages;
  657. unsigned long size;
  658. unsigned long default_hsize;
  659. unsigned long i;
  660. int *ptr;
  661. int ret;
  662. default_hsize = file_read_ulong("/proc/meminfo", "Hugepagesize:");
  663. if (default_hsize < 0 || default_hsize*1024 < default_hsize)
  664. SKIP(return, "Huge page size could not be determined");
  665. default_hsize = default_hsize*1024; /* KB to B */
  666. size = ALIGN(TWOMEG, default_hsize);
  667. npages = size >> self->page_shift;
  668. buffer = malloc(sizeof(*buffer));
  669. ASSERT_NE(buffer, NULL);
  670. buffer->ptr = mmap(NULL, size,
  671. PROT_READ | PROT_WRITE,
  672. MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
  673. -1, 0);
  674. if (buffer->ptr == MAP_FAILED) {
  675. free(buffer);
  676. SKIP(return, "Huge page could not be allocated");
  677. }
  678. buffer->fd = -1;
  679. buffer->size = size;
  680. buffer->mirror = malloc(size);
  681. ASSERT_NE(buffer->mirror, NULL);
  682. /* Initialize data that the device will write to buffer->ptr. */
  683. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  684. ptr[i] = i;
  685. /* Simulate a device writing system memory. */
  686. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  687. ASSERT_EQ(ret, 0);
  688. ASSERT_EQ(buffer->cpages, npages);
  689. ASSERT_EQ(buffer->faults, 1);
  690. /* Check what the device wrote. */
  691. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  692. ASSERT_EQ(ptr[i], i);
  693. munmap(buffer->ptr, buffer->size);
  694. buffer->ptr = NULL;
  695. hmm_buffer_free(buffer);
  696. }
  697. /*
  698. * Read mmap'ed file memory.
  699. */
  700. TEST_F(hmm, file_read)
  701. {
  702. struct hmm_buffer *buffer;
  703. unsigned long npages;
  704. unsigned long size;
  705. unsigned long i;
  706. int *ptr;
  707. int ret;
  708. int fd;
  709. ssize_t len;
  710. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  711. ASSERT_NE(npages, 0);
  712. size = npages << self->page_shift;
  713. fd = hmm_create_file(size);
  714. ASSERT_GE(fd, 0);
  715. buffer = malloc(sizeof(*buffer));
  716. ASSERT_NE(buffer, NULL);
  717. buffer->fd = fd;
  718. buffer->size = size;
  719. buffer->mirror = malloc(size);
  720. ASSERT_NE(buffer->mirror, NULL);
  721. /* Write initial contents of the file. */
  722. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  723. ptr[i] = i;
  724. len = pwrite(fd, buffer->mirror, size, 0);
  725. ASSERT_EQ(len, size);
  726. memset(buffer->mirror, 0, size);
  727. buffer->ptr = mmap(NULL, size,
  728. PROT_READ,
  729. MAP_SHARED,
  730. buffer->fd, 0);
  731. ASSERT_NE(buffer->ptr, MAP_FAILED);
  732. /* Simulate a device reading system memory. */
  733. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_READ, buffer, npages);
  734. ASSERT_EQ(ret, 0);
  735. ASSERT_EQ(buffer->cpages, npages);
  736. ASSERT_EQ(buffer->faults, 1);
  737. /* Check what the device read. */
  738. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  739. ASSERT_EQ(ptr[i], i);
  740. hmm_buffer_free(buffer);
  741. }
  742. /*
  743. * Write mmap'ed file memory.
  744. */
  745. TEST_F(hmm, file_write)
  746. {
  747. struct hmm_buffer *buffer;
  748. unsigned long npages;
  749. unsigned long size;
  750. unsigned long i;
  751. int *ptr;
  752. int ret;
  753. int fd;
  754. ssize_t len;
  755. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  756. ASSERT_NE(npages, 0);
  757. size = npages << self->page_shift;
  758. fd = hmm_create_file(size);
  759. ASSERT_GE(fd, 0);
  760. buffer = malloc(sizeof(*buffer));
  761. ASSERT_NE(buffer, NULL);
  762. buffer->fd = fd;
  763. buffer->size = size;
  764. buffer->mirror = malloc(size);
  765. ASSERT_NE(buffer->mirror, NULL);
  766. buffer->ptr = mmap(NULL, size,
  767. PROT_READ | PROT_WRITE,
  768. MAP_SHARED,
  769. buffer->fd, 0);
  770. ASSERT_NE(buffer->ptr, MAP_FAILED);
  771. /* Initialize data that the device will write to buffer->ptr. */
  772. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  773. ptr[i] = i;
  774. /* Simulate a device writing system memory. */
  775. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  776. ASSERT_EQ(ret, 0);
  777. ASSERT_EQ(buffer->cpages, npages);
  778. ASSERT_EQ(buffer->faults, 1);
  779. /* Check what the device wrote. */
  780. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  781. ASSERT_EQ(ptr[i], i);
  782. /* Check that the device also wrote the file. */
  783. len = pread(fd, buffer->mirror, size, 0);
  784. ASSERT_EQ(len, size);
  785. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  786. ASSERT_EQ(ptr[i], i);
  787. hmm_buffer_free(buffer);
  788. }
  789. /*
  790. * Migrate anonymous memory to device private memory.
  791. */
  792. TEST_F(hmm, migrate)
  793. {
  794. struct hmm_buffer *buffer;
  795. unsigned long npages;
  796. unsigned long size;
  797. unsigned long i;
  798. int *ptr;
  799. int ret;
  800. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  801. ASSERT_NE(npages, 0);
  802. size = npages << self->page_shift;
  803. buffer = malloc(sizeof(*buffer));
  804. ASSERT_NE(buffer, NULL);
  805. buffer->fd = -1;
  806. buffer->size = size;
  807. buffer->mirror = malloc(size);
  808. ASSERT_NE(buffer->mirror, NULL);
  809. buffer->ptr = mmap(NULL, size,
  810. PROT_READ | PROT_WRITE,
  811. MAP_PRIVATE | MAP_ANONYMOUS,
  812. buffer->fd, 0);
  813. ASSERT_NE(buffer->ptr, MAP_FAILED);
  814. /* Initialize buffer in system memory. */
  815. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  816. ptr[i] = i;
  817. /* Migrate memory to device. */
  818. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  819. ASSERT_EQ(ret, 0);
  820. ASSERT_EQ(buffer->cpages, npages);
  821. /* Check what the device read. */
  822. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  823. ASSERT_EQ(ptr[i], i);
  824. hmm_buffer_free(buffer);
  825. }
  826. /*
  827. * Migrate anonymous memory to device private memory and fault some of it back
  828. * to system memory, then try migrating the resulting mix of system and device
  829. * private memory to the device.
  830. */
  831. TEST_F(hmm, migrate_fault)
  832. {
  833. struct hmm_buffer *buffer;
  834. unsigned long npages;
  835. unsigned long size;
  836. unsigned long i;
  837. int *ptr;
  838. int ret;
  839. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  840. ASSERT_NE(npages, 0);
  841. size = npages << self->page_shift;
  842. buffer = malloc(sizeof(*buffer));
  843. ASSERT_NE(buffer, NULL);
  844. buffer->fd = -1;
  845. buffer->size = size;
  846. buffer->mirror = malloc(size);
  847. ASSERT_NE(buffer->mirror, NULL);
  848. buffer->ptr = mmap(NULL, size,
  849. PROT_READ | PROT_WRITE,
  850. MAP_PRIVATE | MAP_ANONYMOUS,
  851. buffer->fd, 0);
  852. ASSERT_NE(buffer->ptr, MAP_FAILED);
  853. /* Initialize buffer in system memory. */
  854. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  855. ptr[i] = i;
  856. /* Migrate memory to device. */
  857. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  858. ASSERT_EQ(ret, 0);
  859. ASSERT_EQ(buffer->cpages, npages);
  860. /* Check what the device read. */
  861. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  862. ASSERT_EQ(ptr[i], i);
  863. /* Fault half the pages back to system memory and check them. */
  864. for (i = 0, ptr = buffer->ptr; i < size / (2 * sizeof(*ptr)); ++i)
  865. ASSERT_EQ(ptr[i], i);
  866. /* Migrate memory to the device again. */
  867. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  868. ASSERT_EQ(ret, 0);
  869. ASSERT_EQ(buffer->cpages, npages);
  870. /* Check what the device read. */
  871. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  872. ASSERT_EQ(ptr[i], i);
  873. hmm_buffer_free(buffer);
  874. }
  875. TEST_F(hmm, migrate_release)
  876. {
  877. struct hmm_buffer *buffer;
  878. unsigned long npages;
  879. unsigned long size;
  880. unsigned long i;
  881. int *ptr;
  882. int ret;
  883. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  884. ASSERT_NE(npages, 0);
  885. size = npages << self->page_shift;
  886. buffer = malloc(sizeof(*buffer));
  887. ASSERT_NE(buffer, NULL);
  888. buffer->fd = -1;
  889. buffer->size = size;
  890. buffer->mirror = malloc(size);
  891. ASSERT_NE(buffer->mirror, NULL);
  892. buffer->ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
  893. MAP_PRIVATE | MAP_ANONYMOUS, buffer->fd, 0);
  894. ASSERT_NE(buffer->ptr, MAP_FAILED);
  895. /* Initialize buffer in system memory. */
  896. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  897. ptr[i] = i;
  898. /* Migrate memory to device. */
  899. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  900. ASSERT_EQ(ret, 0);
  901. ASSERT_EQ(buffer->cpages, npages);
  902. /* Check what the device read. */
  903. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  904. ASSERT_EQ(ptr[i], i);
  905. /* Release device memory. */
  906. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_RELEASE, buffer, npages);
  907. ASSERT_EQ(ret, 0);
  908. /* Fault pages back to system memory and check them. */
  909. for (i = 0, ptr = buffer->ptr; i < size / (2 * sizeof(*ptr)); ++i)
  910. ASSERT_EQ(ptr[i], i);
  911. hmm_buffer_free(buffer);
  912. }
  913. /*
  914. * Migrate anonymous shared memory to device private memory.
  915. */
  916. TEST_F(hmm, migrate_shared)
  917. {
  918. struct hmm_buffer *buffer;
  919. unsigned long npages;
  920. unsigned long size;
  921. int ret;
  922. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  923. ASSERT_NE(npages, 0);
  924. size = npages << self->page_shift;
  925. buffer = malloc(sizeof(*buffer));
  926. ASSERT_NE(buffer, NULL);
  927. buffer->fd = -1;
  928. buffer->size = size;
  929. buffer->mirror = malloc(size);
  930. ASSERT_NE(buffer->mirror, NULL);
  931. buffer->ptr = mmap(NULL, size,
  932. PROT_READ | PROT_WRITE,
  933. MAP_SHARED | MAP_ANONYMOUS,
  934. buffer->fd, 0);
  935. ASSERT_NE(buffer->ptr, MAP_FAILED);
  936. /* Migrate memory to device. */
  937. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  938. ASSERT_EQ(ret, -ENOENT);
  939. hmm_buffer_free(buffer);
  940. }
  941. /*
  942. * Try to migrate various memory types to device private memory.
  943. */
  944. TEST_F(hmm2, migrate_mixed)
  945. {
  946. struct hmm_buffer *buffer;
  947. unsigned long npages;
  948. unsigned long size;
  949. int *ptr;
  950. unsigned char *p;
  951. int ret;
  952. int val;
  953. npages = 6;
  954. size = npages << self->page_shift;
  955. buffer = malloc(sizeof(*buffer));
  956. ASSERT_NE(buffer, NULL);
  957. buffer->fd = -1;
  958. buffer->size = size;
  959. buffer->mirror = malloc(size);
  960. ASSERT_NE(buffer->mirror, NULL);
  961. /* Reserve a range of addresses. */
  962. buffer->ptr = mmap(NULL, size,
  963. PROT_NONE,
  964. MAP_PRIVATE | MAP_ANONYMOUS,
  965. buffer->fd, 0);
  966. ASSERT_NE(buffer->ptr, MAP_FAILED);
  967. p = buffer->ptr;
  968. /* Migrating a protected area should be an error. */
  969. ret = hmm_migrate_sys_to_dev(self->fd1, buffer, npages);
  970. ASSERT_EQ(ret, -EINVAL);
  971. /* Punch a hole after the first page address. */
  972. ret = munmap(buffer->ptr + self->page_size, self->page_size);
  973. ASSERT_EQ(ret, 0);
  974. /* We expect an error if the vma doesn't cover the range. */
  975. ret = hmm_migrate_sys_to_dev(self->fd1, buffer, 3);
  976. ASSERT_EQ(ret, -EINVAL);
  977. /* Page 2 will be a read-only zero page. */
  978. ret = mprotect(buffer->ptr + 2 * self->page_size, self->page_size,
  979. PROT_READ);
  980. ASSERT_EQ(ret, 0);
  981. ptr = (int *)(buffer->ptr + 2 * self->page_size);
  982. val = *ptr + 3;
  983. ASSERT_EQ(val, 3);
  984. /* Page 3 will be read-only. */
  985. ret = mprotect(buffer->ptr + 3 * self->page_size, self->page_size,
  986. PROT_READ | PROT_WRITE);
  987. ASSERT_EQ(ret, 0);
  988. ptr = (int *)(buffer->ptr + 3 * self->page_size);
  989. *ptr = val;
  990. ret = mprotect(buffer->ptr + 3 * self->page_size, self->page_size,
  991. PROT_READ);
  992. ASSERT_EQ(ret, 0);
  993. /* Page 4-5 will be read-write. */
  994. ret = mprotect(buffer->ptr + 4 * self->page_size, 2 * self->page_size,
  995. PROT_READ | PROT_WRITE);
  996. ASSERT_EQ(ret, 0);
  997. ptr = (int *)(buffer->ptr + 4 * self->page_size);
  998. *ptr = val;
  999. ptr = (int *)(buffer->ptr + 5 * self->page_size);
  1000. *ptr = val;
  1001. /* Now try to migrate pages 2-5 to device 1. */
  1002. buffer->ptr = p + 2 * self->page_size;
  1003. ret = hmm_migrate_sys_to_dev(self->fd1, buffer, 4);
  1004. ASSERT_EQ(ret, 0);
  1005. ASSERT_EQ(buffer->cpages, 4);
  1006. /* Page 5 won't be migrated to device 0 because it's on device 1. */
  1007. buffer->ptr = p + 5 * self->page_size;
  1008. ret = hmm_migrate_sys_to_dev(self->fd0, buffer, 1);
  1009. ASSERT_EQ(ret, -ENOENT);
  1010. buffer->ptr = p;
  1011. buffer->ptr = p;
  1012. hmm_buffer_free(buffer);
  1013. }
  1014. /*
  1015. * Migrate anonymous memory to device memory and back to system memory
  1016. * multiple times. In case of private zone configuration, this is done
  1017. * through fault pages accessed by CPU. In case of coherent zone configuration,
  1018. * the pages from the device should be explicitly migrated back to system memory.
  1019. * The reason is Coherent device zone has coherent access by CPU, therefore
  1020. * it will not generate any page fault.
  1021. */
  1022. TEST_F(hmm, migrate_multiple)
  1023. {
  1024. struct hmm_buffer *buffer;
  1025. unsigned long npages;
  1026. unsigned long size;
  1027. unsigned long i;
  1028. unsigned long c;
  1029. int *ptr;
  1030. int ret;
  1031. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  1032. ASSERT_NE(npages, 0);
  1033. size = npages << self->page_shift;
  1034. for (c = 0; c < NTIMES; c++) {
  1035. buffer = malloc(sizeof(*buffer));
  1036. ASSERT_NE(buffer, NULL);
  1037. buffer->fd = -1;
  1038. buffer->size = size;
  1039. buffer->mirror = malloc(size);
  1040. ASSERT_NE(buffer->mirror, NULL);
  1041. buffer->ptr = mmap(NULL, size,
  1042. PROT_READ | PROT_WRITE,
  1043. MAP_PRIVATE | MAP_ANONYMOUS,
  1044. buffer->fd, 0);
  1045. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1046. /* Initialize buffer in system memory. */
  1047. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1048. ptr[i] = i;
  1049. /* Migrate memory to device. */
  1050. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  1051. ASSERT_EQ(ret, 0);
  1052. ASSERT_EQ(buffer->cpages, npages);
  1053. /* Check what the device read. */
  1054. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1055. ASSERT_EQ(ptr[i], i);
  1056. /* Migrate back to system memory and check them. */
  1057. if (hmm_is_coherent_type(variant->device_number)) {
  1058. ret = hmm_migrate_dev_to_sys(self->fd, buffer, npages);
  1059. ASSERT_EQ(ret, 0);
  1060. ASSERT_EQ(buffer->cpages, npages);
  1061. }
  1062. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1063. ASSERT_EQ(ptr[i], i);
  1064. hmm_buffer_free(buffer);
  1065. }
  1066. }
  1067. /*
  1068. * Read anonymous memory multiple times.
  1069. */
  1070. TEST_F(hmm, anon_read_multiple)
  1071. {
  1072. struct hmm_buffer *buffer;
  1073. unsigned long npages;
  1074. unsigned long size;
  1075. unsigned long i;
  1076. unsigned long c;
  1077. int *ptr;
  1078. int ret;
  1079. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  1080. ASSERT_NE(npages, 0);
  1081. size = npages << self->page_shift;
  1082. for (c = 0; c < NTIMES; c++) {
  1083. buffer = malloc(sizeof(*buffer));
  1084. ASSERT_NE(buffer, NULL);
  1085. buffer->fd = -1;
  1086. buffer->size = size;
  1087. buffer->mirror = malloc(size);
  1088. ASSERT_NE(buffer->mirror, NULL);
  1089. buffer->ptr = mmap(NULL, size,
  1090. PROT_READ | PROT_WRITE,
  1091. MAP_PRIVATE | MAP_ANONYMOUS,
  1092. buffer->fd, 0);
  1093. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1094. /* Initialize buffer in system memory. */
  1095. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1096. ptr[i] = i + c;
  1097. /* Simulate a device reading system memory. */
  1098. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_READ, buffer,
  1099. npages);
  1100. ASSERT_EQ(ret, 0);
  1101. ASSERT_EQ(buffer->cpages, npages);
  1102. ASSERT_EQ(buffer->faults, 1);
  1103. /* Check what the device read. */
  1104. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1105. ASSERT_EQ(ptr[i], i + c);
  1106. hmm_buffer_free(buffer);
  1107. }
  1108. }
  1109. void *unmap_buffer(void *p)
  1110. {
  1111. struct hmm_buffer *buffer = p;
  1112. /* Delay for a bit and then unmap buffer while it is being read. */
  1113. hmm_nanosleep(hmm_random() % 32000);
  1114. munmap(buffer->ptr + buffer->size / 2, buffer->size / 2);
  1115. buffer->ptr = NULL;
  1116. return NULL;
  1117. }
  1118. /*
  1119. * Try reading anonymous memory while it is being unmapped.
  1120. */
  1121. TEST_F(hmm, anon_teardown)
  1122. {
  1123. unsigned long npages;
  1124. unsigned long size;
  1125. unsigned long c;
  1126. void *ret;
  1127. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  1128. ASSERT_NE(npages, 0);
  1129. size = npages << self->page_shift;
  1130. for (c = 0; c < NTIMES; ++c) {
  1131. pthread_t thread;
  1132. struct hmm_buffer *buffer;
  1133. unsigned long i;
  1134. int *ptr;
  1135. int rc;
  1136. buffer = malloc(sizeof(*buffer));
  1137. ASSERT_NE(buffer, NULL);
  1138. buffer->fd = -1;
  1139. buffer->size = size;
  1140. buffer->mirror = malloc(size);
  1141. ASSERT_NE(buffer->mirror, NULL);
  1142. buffer->ptr = mmap(NULL, size,
  1143. PROT_READ | PROT_WRITE,
  1144. MAP_PRIVATE | MAP_ANONYMOUS,
  1145. buffer->fd, 0);
  1146. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1147. /* Initialize buffer in system memory. */
  1148. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1149. ptr[i] = i + c;
  1150. rc = pthread_create(&thread, NULL, unmap_buffer, buffer);
  1151. ASSERT_EQ(rc, 0);
  1152. /* Simulate a device reading system memory. */
  1153. rc = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_READ, buffer,
  1154. npages);
  1155. if (rc == 0) {
  1156. ASSERT_EQ(buffer->cpages, npages);
  1157. ASSERT_EQ(buffer->faults, 1);
  1158. /* Check what the device read. */
  1159. for (i = 0, ptr = buffer->mirror;
  1160. i < size / sizeof(*ptr);
  1161. ++i)
  1162. ASSERT_EQ(ptr[i], i + c);
  1163. }
  1164. pthread_join(thread, &ret);
  1165. hmm_buffer_free(buffer);
  1166. }
  1167. }
  1168. /*
  1169. * Test memory snapshot without faulting in pages accessed by the device.
  1170. */
  1171. TEST_F(hmm, mixedmap)
  1172. {
  1173. struct hmm_buffer *buffer;
  1174. unsigned long npages;
  1175. unsigned long size;
  1176. unsigned char *m;
  1177. int ret;
  1178. npages = 1;
  1179. size = npages << self->page_shift;
  1180. buffer = malloc(sizeof(*buffer));
  1181. ASSERT_NE(buffer, NULL);
  1182. buffer->fd = -1;
  1183. buffer->size = size;
  1184. buffer->mirror = malloc(npages);
  1185. ASSERT_NE(buffer->mirror, NULL);
  1186. /* Reserve a range of addresses. */
  1187. buffer->ptr = mmap(NULL, size,
  1188. PROT_READ | PROT_WRITE,
  1189. MAP_PRIVATE,
  1190. self->fd, 0);
  1191. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1192. /* Simulate a device snapshotting CPU pagetables. */
  1193. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, buffer, npages);
  1194. ASSERT_EQ(ret, 0);
  1195. ASSERT_EQ(buffer->cpages, npages);
  1196. /* Check what the device saw. */
  1197. m = buffer->mirror;
  1198. ASSERT_EQ(m[0], HMM_DMIRROR_PROT_READ);
  1199. hmm_buffer_free(buffer);
  1200. }
  1201. /*
  1202. * Test memory snapshot without faulting in pages accessed by the device.
  1203. */
  1204. TEST_F(hmm2, snapshot)
  1205. {
  1206. struct hmm_buffer *buffer;
  1207. unsigned long npages;
  1208. unsigned long size;
  1209. int *ptr;
  1210. unsigned char *p;
  1211. unsigned char *m;
  1212. int ret;
  1213. int val;
  1214. npages = 7;
  1215. size = npages << self->page_shift;
  1216. buffer = malloc(sizeof(*buffer));
  1217. ASSERT_NE(buffer, NULL);
  1218. buffer->fd = -1;
  1219. buffer->size = size;
  1220. buffer->mirror = malloc(npages);
  1221. ASSERT_NE(buffer->mirror, NULL);
  1222. /* Reserve a range of addresses. */
  1223. buffer->ptr = mmap(NULL, size,
  1224. PROT_NONE,
  1225. MAP_PRIVATE | MAP_ANONYMOUS,
  1226. buffer->fd, 0);
  1227. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1228. p = buffer->ptr;
  1229. /* Punch a hole after the first page address. */
  1230. ret = munmap(buffer->ptr + self->page_size, self->page_size);
  1231. ASSERT_EQ(ret, 0);
  1232. /* Page 2 will be read-only zero page. */
  1233. ret = mprotect(buffer->ptr + 2 * self->page_size, self->page_size,
  1234. PROT_READ);
  1235. ASSERT_EQ(ret, 0);
  1236. ptr = (int *)(buffer->ptr + 2 * self->page_size);
  1237. val = *ptr + 3;
  1238. ASSERT_EQ(val, 3);
  1239. /* Page 3 will be read-only. */
  1240. ret = mprotect(buffer->ptr + 3 * self->page_size, self->page_size,
  1241. PROT_READ | PROT_WRITE);
  1242. ASSERT_EQ(ret, 0);
  1243. ptr = (int *)(buffer->ptr + 3 * self->page_size);
  1244. *ptr = val;
  1245. ret = mprotect(buffer->ptr + 3 * self->page_size, self->page_size,
  1246. PROT_READ);
  1247. ASSERT_EQ(ret, 0);
  1248. /* Page 4-6 will be read-write. */
  1249. ret = mprotect(buffer->ptr + 4 * self->page_size, 3 * self->page_size,
  1250. PROT_READ | PROT_WRITE);
  1251. ASSERT_EQ(ret, 0);
  1252. ptr = (int *)(buffer->ptr + 4 * self->page_size);
  1253. *ptr = val;
  1254. /* Page 5 will be migrated to device 0. */
  1255. buffer->ptr = p + 5 * self->page_size;
  1256. ret = hmm_migrate_sys_to_dev(self->fd0, buffer, 1);
  1257. ASSERT_EQ(ret, 0);
  1258. ASSERT_EQ(buffer->cpages, 1);
  1259. /* Page 6 will be migrated to device 1. */
  1260. buffer->ptr = p + 6 * self->page_size;
  1261. ret = hmm_migrate_sys_to_dev(self->fd1, buffer, 1);
  1262. ASSERT_EQ(ret, 0);
  1263. ASSERT_EQ(buffer->cpages, 1);
  1264. /* Simulate a device snapshotting CPU pagetables. */
  1265. buffer->ptr = p;
  1266. ret = hmm_dmirror_cmd(self->fd0, HMM_DMIRROR_SNAPSHOT, buffer, npages);
  1267. ASSERT_EQ(ret, 0);
  1268. ASSERT_EQ(buffer->cpages, npages);
  1269. /* Check what the device saw. */
  1270. m = buffer->mirror;
  1271. ASSERT_EQ(m[0], HMM_DMIRROR_PROT_ERROR);
  1272. ASSERT_EQ(m[1], HMM_DMIRROR_PROT_ERROR);
  1273. ASSERT_EQ(m[2], HMM_DMIRROR_PROT_ZERO | HMM_DMIRROR_PROT_READ);
  1274. ASSERT_EQ(m[3], HMM_DMIRROR_PROT_READ);
  1275. ASSERT_EQ(m[4], HMM_DMIRROR_PROT_WRITE);
  1276. if (!hmm_is_coherent_type(variant->device_number0)) {
  1277. ASSERT_EQ(m[5], HMM_DMIRROR_PROT_DEV_PRIVATE_LOCAL |
  1278. HMM_DMIRROR_PROT_WRITE);
  1279. ASSERT_EQ(m[6], HMM_DMIRROR_PROT_NONE);
  1280. } else {
  1281. ASSERT_EQ(m[5], HMM_DMIRROR_PROT_DEV_COHERENT_LOCAL |
  1282. HMM_DMIRROR_PROT_WRITE);
  1283. ASSERT_EQ(m[6], HMM_DMIRROR_PROT_DEV_COHERENT_REMOTE |
  1284. HMM_DMIRROR_PROT_WRITE);
  1285. }
  1286. hmm_buffer_free(buffer);
  1287. }
  1288. /*
  1289. * Test the hmm_range_fault() HMM_PFN_PMD flag for large pages that
  1290. * should be mapped by a large page table entry.
  1291. */
  1292. TEST_F(hmm, compound)
  1293. {
  1294. struct hmm_buffer *buffer;
  1295. unsigned long npages;
  1296. unsigned long size;
  1297. unsigned long default_hsize;
  1298. int *ptr;
  1299. unsigned char *m;
  1300. int ret;
  1301. unsigned long i;
  1302. /* Skip test if we can't allocate a hugetlbfs page. */
  1303. default_hsize = file_read_ulong("/proc/meminfo", "Hugepagesize:");
  1304. if (default_hsize < 0 || default_hsize*1024 < default_hsize)
  1305. SKIP(return, "Huge page size could not be determined");
  1306. default_hsize = default_hsize*1024; /* KB to B */
  1307. size = ALIGN(TWOMEG, default_hsize);
  1308. npages = size >> self->page_shift;
  1309. buffer = malloc(sizeof(*buffer));
  1310. ASSERT_NE(buffer, NULL);
  1311. buffer->ptr = mmap(NULL, size,
  1312. PROT_READ | PROT_WRITE,
  1313. MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB,
  1314. -1, 0);
  1315. if (buffer->ptr == MAP_FAILED) {
  1316. free(buffer);
  1317. return;
  1318. }
  1319. buffer->size = size;
  1320. buffer->mirror = malloc(npages);
  1321. ASSERT_NE(buffer->mirror, NULL);
  1322. /* Initialize the pages the device will snapshot in buffer->ptr. */
  1323. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1324. ptr[i] = i;
  1325. /* Simulate a device snapshotting CPU pagetables. */
  1326. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, buffer, npages);
  1327. ASSERT_EQ(ret, 0);
  1328. ASSERT_EQ(buffer->cpages, npages);
  1329. /* Check what the device saw. */
  1330. m = buffer->mirror;
  1331. for (i = 0; i < npages; ++i)
  1332. ASSERT_EQ(m[i], HMM_DMIRROR_PROT_WRITE |
  1333. HMM_DMIRROR_PROT_PMD);
  1334. /* Make the region read-only. */
  1335. ret = mprotect(buffer->ptr, size, PROT_READ);
  1336. ASSERT_EQ(ret, 0);
  1337. /* Simulate a device snapshotting CPU pagetables. */
  1338. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, buffer, npages);
  1339. ASSERT_EQ(ret, 0);
  1340. ASSERT_EQ(buffer->cpages, npages);
  1341. /* Check what the device saw. */
  1342. m = buffer->mirror;
  1343. for (i = 0; i < npages; ++i)
  1344. ASSERT_EQ(m[i], HMM_DMIRROR_PROT_READ |
  1345. HMM_DMIRROR_PROT_PMD);
  1346. munmap(buffer->ptr, buffer->size);
  1347. buffer->ptr = NULL;
  1348. hmm_buffer_free(buffer);
  1349. }
  1350. /*
  1351. * Test two devices reading the same memory (double mapped).
  1352. */
  1353. TEST_F(hmm2, double_map)
  1354. {
  1355. struct hmm_buffer *buffer;
  1356. unsigned long npages;
  1357. unsigned long size;
  1358. unsigned long i;
  1359. int *ptr;
  1360. int ret;
  1361. npages = 6;
  1362. size = npages << self->page_shift;
  1363. buffer = malloc(sizeof(*buffer));
  1364. ASSERT_NE(buffer, NULL);
  1365. buffer->fd = -1;
  1366. buffer->size = size;
  1367. buffer->mirror = malloc(size);
  1368. ASSERT_NE(buffer->mirror, NULL);
  1369. /* Reserve a range of addresses. */
  1370. buffer->ptr = mmap(NULL, size,
  1371. PROT_READ | PROT_WRITE,
  1372. MAP_PRIVATE | MAP_ANONYMOUS,
  1373. buffer->fd, 0);
  1374. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1375. /* Initialize buffer in system memory. */
  1376. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1377. ptr[i] = i;
  1378. /* Make region read-only. */
  1379. ret = mprotect(buffer->ptr, size, PROT_READ);
  1380. ASSERT_EQ(ret, 0);
  1381. /* Simulate device 0 reading system memory. */
  1382. ret = hmm_dmirror_cmd(self->fd0, HMM_DMIRROR_READ, buffer, npages);
  1383. ASSERT_EQ(ret, 0);
  1384. ASSERT_EQ(buffer->cpages, npages);
  1385. ASSERT_EQ(buffer->faults, 1);
  1386. /* Check what the device read. */
  1387. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1388. ASSERT_EQ(ptr[i], i);
  1389. /* Simulate device 1 reading system memory. */
  1390. ret = hmm_dmirror_cmd(self->fd1, HMM_DMIRROR_READ, buffer, npages);
  1391. ASSERT_EQ(ret, 0);
  1392. ASSERT_EQ(buffer->cpages, npages);
  1393. ASSERT_EQ(buffer->faults, 1);
  1394. /* Check what the device read. */
  1395. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1396. ASSERT_EQ(ptr[i], i);
  1397. /* Migrate pages to device 1 and try to read from device 0. */
  1398. ret = hmm_migrate_sys_to_dev(self->fd1, buffer, npages);
  1399. ASSERT_EQ(ret, 0);
  1400. ASSERT_EQ(buffer->cpages, npages);
  1401. ret = hmm_dmirror_cmd(self->fd0, HMM_DMIRROR_READ, buffer, npages);
  1402. ASSERT_EQ(ret, 0);
  1403. ASSERT_EQ(buffer->cpages, npages);
  1404. ASSERT_EQ(buffer->faults, 1);
  1405. /* Check what device 0 read. */
  1406. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1407. ASSERT_EQ(ptr[i], i);
  1408. hmm_buffer_free(buffer);
  1409. }
  1410. /*
  1411. * Basic check of exclusive faulting.
  1412. */
  1413. TEST_F(hmm, exclusive)
  1414. {
  1415. struct hmm_buffer *buffer;
  1416. unsigned long npages;
  1417. unsigned long size;
  1418. unsigned long i;
  1419. int *ptr;
  1420. int ret;
  1421. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  1422. ASSERT_NE(npages, 0);
  1423. size = npages << self->page_shift;
  1424. buffer = malloc(sizeof(*buffer));
  1425. ASSERT_NE(buffer, NULL);
  1426. buffer->fd = -1;
  1427. buffer->size = size;
  1428. buffer->mirror = malloc(size);
  1429. ASSERT_NE(buffer->mirror, NULL);
  1430. buffer->ptr = mmap(NULL, size,
  1431. PROT_READ | PROT_WRITE,
  1432. MAP_PRIVATE | MAP_ANONYMOUS,
  1433. buffer->fd, 0);
  1434. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1435. /* Initialize buffer in system memory. */
  1436. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1437. ptr[i] = i;
  1438. /* Map memory exclusively for device access. */
  1439. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_EXCLUSIVE, buffer, npages);
  1440. ASSERT_EQ(ret, 0);
  1441. ASSERT_EQ(buffer->cpages, npages);
  1442. /* Check what the device read. */
  1443. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1444. ASSERT_EQ(ptr[i], i);
  1445. /* Fault pages back to system memory and check them. */
  1446. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1447. ASSERT_EQ(ptr[i]++, i);
  1448. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1449. ASSERT_EQ(ptr[i], i+1);
  1450. /* Check atomic access revoked */
  1451. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_CHECK_EXCLUSIVE, buffer, npages);
  1452. ASSERT_EQ(ret, 0);
  1453. hmm_buffer_free(buffer);
  1454. }
  1455. TEST_F(hmm, exclusive_mprotect)
  1456. {
  1457. struct hmm_buffer *buffer;
  1458. unsigned long npages;
  1459. unsigned long size;
  1460. unsigned long i;
  1461. int *ptr;
  1462. int ret;
  1463. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  1464. ASSERT_NE(npages, 0);
  1465. size = npages << self->page_shift;
  1466. buffer = malloc(sizeof(*buffer));
  1467. ASSERT_NE(buffer, NULL);
  1468. buffer->fd = -1;
  1469. buffer->size = size;
  1470. buffer->mirror = malloc(size);
  1471. ASSERT_NE(buffer->mirror, NULL);
  1472. buffer->ptr = mmap(NULL, size,
  1473. PROT_READ | PROT_WRITE,
  1474. MAP_PRIVATE | MAP_ANONYMOUS,
  1475. buffer->fd, 0);
  1476. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1477. /* Initialize buffer in system memory. */
  1478. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1479. ptr[i] = i;
  1480. /* Map memory exclusively for device access. */
  1481. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_EXCLUSIVE, buffer, npages);
  1482. ASSERT_EQ(ret, 0);
  1483. ASSERT_EQ(buffer->cpages, npages);
  1484. /* Check what the device read. */
  1485. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1486. ASSERT_EQ(ptr[i], i);
  1487. ret = mprotect(buffer->ptr, size, PROT_READ);
  1488. ASSERT_EQ(ret, 0);
  1489. /* Simulate a device writing system memory. */
  1490. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_WRITE, buffer, npages);
  1491. ASSERT_EQ(ret, -EPERM);
  1492. hmm_buffer_free(buffer);
  1493. }
  1494. /*
  1495. * Check copy-on-write works.
  1496. */
  1497. TEST_F(hmm, exclusive_cow)
  1498. {
  1499. struct hmm_buffer *buffer;
  1500. unsigned long npages;
  1501. unsigned long size;
  1502. unsigned long i;
  1503. int *ptr;
  1504. int ret;
  1505. npages = ALIGN(HMM_BUFFER_SIZE, self->page_size) >> self->page_shift;
  1506. ASSERT_NE(npages, 0);
  1507. size = npages << self->page_shift;
  1508. buffer = malloc(sizeof(*buffer));
  1509. ASSERT_NE(buffer, NULL);
  1510. buffer->fd = -1;
  1511. buffer->size = size;
  1512. buffer->mirror = malloc(size);
  1513. ASSERT_NE(buffer->mirror, NULL);
  1514. buffer->ptr = mmap(NULL, size,
  1515. PROT_READ | PROT_WRITE,
  1516. MAP_PRIVATE | MAP_ANONYMOUS,
  1517. buffer->fd, 0);
  1518. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1519. /* Initialize buffer in system memory. */
  1520. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1521. ptr[i] = i;
  1522. /* Map memory exclusively for device access. */
  1523. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_EXCLUSIVE, buffer, npages);
  1524. ASSERT_EQ(ret, 0);
  1525. ASSERT_EQ(buffer->cpages, npages);
  1526. fork();
  1527. /* Fault pages back to system memory and check them. */
  1528. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1529. ASSERT_EQ(ptr[i]++, i);
  1530. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1531. ASSERT_EQ(ptr[i], i+1);
  1532. hmm_buffer_free(buffer);
  1533. }
  1534. static int gup_test_exec(int gup_fd, unsigned long addr, int cmd,
  1535. int npages, int size, int flags)
  1536. {
  1537. struct gup_test gup = {
  1538. .nr_pages_per_call = npages,
  1539. .addr = addr,
  1540. .gup_flags = FOLL_WRITE | flags,
  1541. .size = size,
  1542. };
  1543. if (ioctl(gup_fd, cmd, &gup)) {
  1544. perror("ioctl on error\n");
  1545. return errno;
  1546. }
  1547. return 0;
  1548. }
  1549. /*
  1550. * Test get user device pages through gup_test. Setting PIN_LONGTERM flag.
  1551. * This should trigger a migration back to system memory for both, private
  1552. * and coherent type pages.
  1553. * This test makes use of gup_test module. Make sure GUP_TEST_CONFIG is added
  1554. * to your configuration before you run it.
  1555. */
  1556. TEST_F(hmm, hmm_gup_test)
  1557. {
  1558. struct hmm_buffer *buffer;
  1559. int gup_fd;
  1560. unsigned long npages;
  1561. unsigned long size;
  1562. unsigned long i;
  1563. int *ptr;
  1564. int ret;
  1565. unsigned char *m;
  1566. gup_fd = open("/sys/kernel/debug/gup_test", O_RDWR);
  1567. if (gup_fd == -1)
  1568. SKIP(return, "Skipping test, could not find gup_test driver");
  1569. npages = 4;
  1570. size = npages << self->page_shift;
  1571. buffer = malloc(sizeof(*buffer));
  1572. ASSERT_NE(buffer, NULL);
  1573. buffer->fd = -1;
  1574. buffer->size = size;
  1575. buffer->mirror = malloc(size);
  1576. ASSERT_NE(buffer->mirror, NULL);
  1577. buffer->ptr = mmap(NULL, size,
  1578. PROT_READ | PROT_WRITE,
  1579. MAP_PRIVATE | MAP_ANONYMOUS,
  1580. buffer->fd, 0);
  1581. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1582. /* Initialize buffer in system memory. */
  1583. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1584. ptr[i] = i;
  1585. /* Migrate memory to device. */
  1586. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  1587. ASSERT_EQ(ret, 0);
  1588. ASSERT_EQ(buffer->cpages, npages);
  1589. /* Check what the device read. */
  1590. for (i = 0, ptr = buffer->mirror; i < size / sizeof(*ptr); ++i)
  1591. ASSERT_EQ(ptr[i], i);
  1592. ASSERT_EQ(gup_test_exec(gup_fd,
  1593. (unsigned long)buffer->ptr,
  1594. GUP_BASIC_TEST, 1, self->page_size, 0), 0);
  1595. ASSERT_EQ(gup_test_exec(gup_fd,
  1596. (unsigned long)buffer->ptr + 1 * self->page_size,
  1597. GUP_FAST_BENCHMARK, 1, self->page_size, 0), 0);
  1598. ASSERT_EQ(gup_test_exec(gup_fd,
  1599. (unsigned long)buffer->ptr + 2 * self->page_size,
  1600. PIN_FAST_BENCHMARK, 1, self->page_size, FOLL_LONGTERM), 0);
  1601. ASSERT_EQ(gup_test_exec(gup_fd,
  1602. (unsigned long)buffer->ptr + 3 * self->page_size,
  1603. PIN_LONGTERM_BENCHMARK, 1, self->page_size, 0), 0);
  1604. /* Take snapshot to CPU pagetables */
  1605. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, buffer, npages);
  1606. ASSERT_EQ(ret, 0);
  1607. ASSERT_EQ(buffer->cpages, npages);
  1608. m = buffer->mirror;
  1609. if (hmm_is_coherent_type(variant->device_number)) {
  1610. ASSERT_EQ(HMM_DMIRROR_PROT_DEV_COHERENT_LOCAL | HMM_DMIRROR_PROT_WRITE, m[0]);
  1611. ASSERT_EQ(HMM_DMIRROR_PROT_DEV_COHERENT_LOCAL | HMM_DMIRROR_PROT_WRITE, m[1]);
  1612. } else {
  1613. ASSERT_EQ(HMM_DMIRROR_PROT_WRITE, m[0]);
  1614. ASSERT_EQ(HMM_DMIRROR_PROT_WRITE, m[1]);
  1615. }
  1616. ASSERT_EQ(HMM_DMIRROR_PROT_WRITE, m[2]);
  1617. ASSERT_EQ(HMM_DMIRROR_PROT_WRITE, m[3]);
  1618. /*
  1619. * Check again the content on the pages. Make sure there's no
  1620. * corrupted data.
  1621. */
  1622. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1623. ASSERT_EQ(ptr[i], i);
  1624. close(gup_fd);
  1625. hmm_buffer_free(buffer);
  1626. }
  1627. /*
  1628. * Test copy-on-write in device pages.
  1629. * In case of writing to COW private page(s), a page fault will migrate pages
  1630. * back to system memory first. Then, these pages will be duplicated. In case
  1631. * of COW device coherent type, pages are duplicated directly from device
  1632. * memory.
  1633. */
  1634. TEST_F(hmm, hmm_cow_in_device)
  1635. {
  1636. struct hmm_buffer *buffer;
  1637. unsigned long npages;
  1638. unsigned long size;
  1639. unsigned long i;
  1640. int *ptr;
  1641. int ret;
  1642. unsigned char *m;
  1643. pid_t pid;
  1644. int status;
  1645. npages = 4;
  1646. size = npages << self->page_shift;
  1647. buffer = malloc(sizeof(*buffer));
  1648. ASSERT_NE(buffer, NULL);
  1649. buffer->fd = -1;
  1650. buffer->size = size;
  1651. buffer->mirror = malloc(size);
  1652. ASSERT_NE(buffer->mirror, NULL);
  1653. buffer->ptr = mmap(NULL, size,
  1654. PROT_READ | PROT_WRITE,
  1655. MAP_PRIVATE | MAP_ANONYMOUS,
  1656. buffer->fd, 0);
  1657. ASSERT_NE(buffer->ptr, MAP_FAILED);
  1658. /* Initialize buffer in system memory. */
  1659. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1660. ptr[i] = i;
  1661. /* Migrate memory to device. */
  1662. ret = hmm_migrate_sys_to_dev(self->fd, buffer, npages);
  1663. ASSERT_EQ(ret, 0);
  1664. ASSERT_EQ(buffer->cpages, npages);
  1665. pid = fork();
  1666. if (pid == -1)
  1667. ASSERT_EQ(pid, 0);
  1668. if (!pid) {
  1669. /* Child process waitd for SIGTERM from the parent. */
  1670. while (1) {
  1671. }
  1672. perror("Should not reach this\n");
  1673. exit(0);
  1674. }
  1675. /* Parent process writes to COW pages(s) and gets a
  1676. * new copy in system. In case of device private pages,
  1677. * this write causes a migration to system mem first.
  1678. */
  1679. for (i = 0, ptr = buffer->ptr; i < size / sizeof(*ptr); ++i)
  1680. ptr[i] = i;
  1681. /* Terminate child and wait */
  1682. EXPECT_EQ(0, kill(pid, SIGTERM));
  1683. EXPECT_EQ(pid, waitpid(pid, &status, 0));
  1684. EXPECT_NE(0, WIFSIGNALED(status));
  1685. EXPECT_EQ(SIGTERM, WTERMSIG(status));
  1686. /* Take snapshot to CPU pagetables */
  1687. ret = hmm_dmirror_cmd(self->fd, HMM_DMIRROR_SNAPSHOT, buffer, npages);
  1688. ASSERT_EQ(ret, 0);
  1689. ASSERT_EQ(buffer->cpages, npages);
  1690. m = buffer->mirror;
  1691. for (i = 0; i < npages; i++)
  1692. ASSERT_EQ(HMM_DMIRROR_PROT_WRITE, m[i]);
  1693. hmm_buffer_free(buffer);
  1694. }
  1695. TEST_HARNESS_MAIN