kfd_svm.c 117 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239
  1. // SPDX-License-Identifier: GPL-2.0 OR MIT
  2. /*
  3. * Copyright 2020-2021 Advanced Micro Devices, Inc.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be included in
  13. * all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21. * OTHER DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <linux/types.h>
  24. #include <linux/sched/task.h>
  25. #include <linux/dynamic_debug.h>
  26. #include <drm/ttm/ttm_tt.h>
  27. #include <drm/drm_exec.h>
  28. #include "amdgpu_sync.h"
  29. #include "amdgpu_object.h"
  30. #include "amdgpu_vm.h"
  31. #include "amdgpu_hmm.h"
  32. #include "amdgpu.h"
  33. #include "amdgpu_xgmi.h"
  34. #include "kfd_priv.h"
  35. #include "kfd_svm.h"
  36. #include "kfd_migrate.h"
  37. #include "kfd_smi_events.h"
  38. #ifdef dev_fmt
  39. #undef dev_fmt
  40. #endif
  41. #define dev_fmt(fmt) "kfd_svm: %s: " fmt, __func__
  42. #define AMDGPU_SVM_RANGE_RESTORE_DELAY_MS 1
  43. /* Long enough to ensure no retry fault comes after svm range is restored and
  44. * page table is updated.
  45. */
  46. #define AMDGPU_SVM_RANGE_RETRY_FAULT_PENDING (2UL * NSEC_PER_MSEC)
  47. #if IS_ENABLED(CONFIG_DYNAMIC_DEBUG)
  48. #define dynamic_svm_range_dump(svms) \
  49. _dynamic_func_call_no_desc("svm_range_dump", svm_range_debug_dump, svms)
  50. #else
  51. #define dynamic_svm_range_dump(svms) \
  52. do { if (0) svm_range_debug_dump(svms); } while (0)
  53. #endif
  54. /* Giant svm range split into smaller ranges based on this, it is decided using
  55. * minimum of all dGPU/APU 1/32 VRAM size, between 2MB to 1GB and alignment to
  56. * power of 2MB.
  57. */
  58. static uint64_t max_svm_range_pages;
  59. struct criu_svm_metadata {
  60. struct list_head list;
  61. struct kfd_criu_svm_range_priv_data data;
  62. };
  63. static void svm_range_evict_svm_bo_worker(struct work_struct *work);
  64. static bool
  65. svm_range_cpu_invalidate_pagetables(struct mmu_interval_notifier *mni,
  66. const struct mmu_notifier_range *range,
  67. unsigned long cur_seq);
  68. static int
  69. svm_range_check_vm(struct kfd_process *p, uint64_t start, uint64_t last,
  70. uint64_t *bo_s, uint64_t *bo_l);
  71. static const struct mmu_interval_notifier_ops svm_range_mn_ops = {
  72. .invalidate = svm_range_cpu_invalidate_pagetables,
  73. };
  74. /**
  75. * svm_range_unlink - unlink svm_range from lists and interval tree
  76. * @prange: svm range structure to be removed
  77. *
  78. * Remove the svm_range from the svms and svm_bo lists and the svms
  79. * interval tree.
  80. *
  81. * Context: The caller must hold svms->lock
  82. */
  83. static void svm_range_unlink(struct svm_range *prange)
  84. {
  85. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx]\n", prange->svms,
  86. prange, prange->start, prange->last);
  87. if (prange->svm_bo) {
  88. spin_lock(&prange->svm_bo->list_lock);
  89. list_del(&prange->svm_bo_list);
  90. spin_unlock(&prange->svm_bo->list_lock);
  91. }
  92. list_del(&prange->list);
  93. if (prange->it_node.start != 0 && prange->it_node.last != 0)
  94. interval_tree_remove(&prange->it_node, &prange->svms->objects);
  95. }
  96. static void
  97. svm_range_add_notifier_locked(struct mm_struct *mm, struct svm_range *prange)
  98. {
  99. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx]\n", prange->svms,
  100. prange, prange->start, prange->last);
  101. mmu_interval_notifier_insert_locked(&prange->notifier, mm,
  102. prange->start << PAGE_SHIFT,
  103. prange->npages << PAGE_SHIFT,
  104. &svm_range_mn_ops);
  105. }
  106. /**
  107. * svm_range_add_to_svms - add svm range to svms
  108. * @prange: svm range structure to be added
  109. *
  110. * Add the svm range to svms interval tree and link list
  111. *
  112. * Context: The caller must hold svms->lock
  113. */
  114. static void svm_range_add_to_svms(struct svm_range *prange)
  115. {
  116. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx]\n", prange->svms,
  117. prange, prange->start, prange->last);
  118. list_move_tail(&prange->list, &prange->svms->list);
  119. prange->it_node.start = prange->start;
  120. prange->it_node.last = prange->last;
  121. interval_tree_insert(&prange->it_node, &prange->svms->objects);
  122. }
  123. static void svm_range_remove_notifier(struct svm_range *prange)
  124. {
  125. pr_debug("remove notifier svms 0x%p prange 0x%p [0x%lx 0x%lx]\n",
  126. prange->svms, prange,
  127. prange->notifier.interval_tree.start >> PAGE_SHIFT,
  128. prange->notifier.interval_tree.last >> PAGE_SHIFT);
  129. if (prange->notifier.interval_tree.start != 0 &&
  130. prange->notifier.interval_tree.last != 0)
  131. mmu_interval_notifier_remove(&prange->notifier);
  132. }
  133. static bool
  134. svm_is_valid_dma_mapping_addr(struct device *dev, dma_addr_t dma_addr)
  135. {
  136. return dma_addr && !dma_mapping_error(dev, dma_addr) &&
  137. !(dma_addr & SVM_RANGE_VRAM_DOMAIN);
  138. }
  139. static int
  140. svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange,
  141. unsigned long offset, unsigned long npages,
  142. unsigned long *hmm_pfns, uint32_t gpuidx)
  143. {
  144. enum dma_data_direction dir = DMA_BIDIRECTIONAL;
  145. dma_addr_t *addr = prange->dma_addr[gpuidx];
  146. struct device *dev = adev->dev;
  147. struct page *page;
  148. int i, r;
  149. if (!addr) {
  150. addr = kvcalloc(prange->npages, sizeof(*addr), GFP_KERNEL);
  151. if (!addr)
  152. return -ENOMEM;
  153. prange->dma_addr[gpuidx] = addr;
  154. }
  155. addr += offset;
  156. for (i = 0; i < npages; i++) {
  157. if (svm_is_valid_dma_mapping_addr(dev, addr[i]))
  158. dma_unmap_page(dev, addr[i], PAGE_SIZE, dir);
  159. page = hmm_pfn_to_page(hmm_pfns[i]);
  160. if (is_zone_device_page(page)) {
  161. struct amdgpu_device *bo_adev = prange->svm_bo->node->adev;
  162. addr[i] = (hmm_pfns[i] << PAGE_SHIFT) +
  163. bo_adev->vm_manager.vram_base_offset -
  164. bo_adev->kfd.pgmap.range.start;
  165. addr[i] |= SVM_RANGE_VRAM_DOMAIN;
  166. pr_debug_ratelimited("vram address: 0x%llx\n", addr[i]);
  167. continue;
  168. }
  169. addr[i] = dma_map_page(dev, page, 0, PAGE_SIZE, dir);
  170. r = dma_mapping_error(dev, addr[i]);
  171. if (r) {
  172. dev_err(dev, "failed %d dma_map_page\n", r);
  173. return r;
  174. }
  175. pr_debug_ratelimited("dma mapping 0x%llx for page addr 0x%lx\n",
  176. addr[i] >> PAGE_SHIFT, page_to_pfn(page));
  177. }
  178. return 0;
  179. }
  180. static int
  181. svm_range_dma_map(struct svm_range *prange, unsigned long *bitmap,
  182. unsigned long offset, unsigned long npages,
  183. unsigned long *hmm_pfns)
  184. {
  185. struct kfd_process *p;
  186. uint32_t gpuidx;
  187. int r;
  188. p = container_of(prange->svms, struct kfd_process, svms);
  189. for_each_set_bit(gpuidx, bitmap, MAX_GPU_INSTANCE) {
  190. struct kfd_process_device *pdd;
  191. pr_debug("mapping to gpu idx 0x%x\n", gpuidx);
  192. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  193. if (!pdd) {
  194. pr_debug("failed to find device idx %d\n", gpuidx);
  195. return -EINVAL;
  196. }
  197. r = svm_range_dma_map_dev(pdd->dev->adev, prange, offset, npages,
  198. hmm_pfns, gpuidx);
  199. if (r)
  200. break;
  201. }
  202. return r;
  203. }
  204. void svm_range_dma_unmap_dev(struct device *dev, dma_addr_t *dma_addr,
  205. unsigned long offset, unsigned long npages)
  206. {
  207. enum dma_data_direction dir = DMA_BIDIRECTIONAL;
  208. int i;
  209. if (!dma_addr)
  210. return;
  211. for (i = offset; i < offset + npages; i++) {
  212. if (!svm_is_valid_dma_mapping_addr(dev, dma_addr[i]))
  213. continue;
  214. pr_debug_ratelimited("unmap 0x%llx\n", dma_addr[i] >> PAGE_SHIFT);
  215. dma_unmap_page(dev, dma_addr[i], PAGE_SIZE, dir);
  216. dma_addr[i] = 0;
  217. }
  218. }
  219. void svm_range_dma_unmap(struct svm_range *prange)
  220. {
  221. struct kfd_process_device *pdd;
  222. dma_addr_t *dma_addr;
  223. struct device *dev;
  224. struct kfd_process *p;
  225. uint32_t gpuidx;
  226. p = container_of(prange->svms, struct kfd_process, svms);
  227. for (gpuidx = 0; gpuidx < MAX_GPU_INSTANCE; gpuidx++) {
  228. dma_addr = prange->dma_addr[gpuidx];
  229. if (!dma_addr)
  230. continue;
  231. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  232. if (!pdd) {
  233. pr_debug("failed to find device idx %d\n", gpuidx);
  234. continue;
  235. }
  236. dev = &pdd->dev->adev->pdev->dev;
  237. svm_range_dma_unmap_dev(dev, dma_addr, 0, prange->npages);
  238. }
  239. }
  240. static void svm_range_free(struct svm_range *prange, bool do_unmap)
  241. {
  242. uint64_t size = (prange->last - prange->start + 1) << PAGE_SHIFT;
  243. struct kfd_process *p = container_of(prange->svms, struct kfd_process, svms);
  244. uint32_t gpuidx;
  245. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx]\n", prange->svms, prange,
  246. prange->start, prange->last);
  247. svm_range_vram_node_free(prange);
  248. if (do_unmap)
  249. svm_range_dma_unmap(prange);
  250. if (do_unmap && !p->xnack_enabled) {
  251. pr_debug("unreserve prange 0x%p size: 0x%llx\n", prange, size);
  252. amdgpu_amdkfd_unreserve_mem_limit(NULL, size,
  253. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);
  254. }
  255. /* free dma_addr array for each gpu */
  256. for (gpuidx = 0; gpuidx < MAX_GPU_INSTANCE; gpuidx++) {
  257. if (prange->dma_addr[gpuidx]) {
  258. kvfree(prange->dma_addr[gpuidx]);
  259. prange->dma_addr[gpuidx] = NULL;
  260. }
  261. }
  262. mutex_destroy(&prange->lock);
  263. mutex_destroy(&prange->migrate_mutex);
  264. kfree(prange);
  265. }
  266. static void
  267. svm_range_set_default_attributes(struct svm_range_list *svms, int32_t *location,
  268. int32_t *prefetch_loc, uint8_t *granularity,
  269. uint32_t *flags)
  270. {
  271. *location = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
  272. *prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
  273. *granularity = svms->default_granularity;
  274. *flags =
  275. KFD_IOCTL_SVM_FLAG_HOST_ACCESS | KFD_IOCTL_SVM_FLAG_COHERENT;
  276. }
  277. static struct
  278. svm_range *svm_range_new(struct svm_range_list *svms, uint64_t start,
  279. uint64_t last, bool update_mem_usage)
  280. {
  281. uint64_t size = last - start + 1;
  282. struct svm_range *prange;
  283. struct kfd_process *p;
  284. prange = kzalloc(sizeof(*prange), GFP_KERNEL);
  285. if (!prange)
  286. return NULL;
  287. p = container_of(svms, struct kfd_process, svms);
  288. if (!p->xnack_enabled && update_mem_usage &&
  289. amdgpu_amdkfd_reserve_mem_limit(NULL, size << PAGE_SHIFT,
  290. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0)) {
  291. pr_info("SVM mapping failed, exceeds resident system memory limit\n");
  292. kfree(prange);
  293. return NULL;
  294. }
  295. prange->npages = size;
  296. prange->svms = svms;
  297. prange->start = start;
  298. prange->last = last;
  299. INIT_LIST_HEAD(&prange->list);
  300. INIT_LIST_HEAD(&prange->update_list);
  301. INIT_LIST_HEAD(&prange->svm_bo_list);
  302. INIT_LIST_HEAD(&prange->deferred_list);
  303. INIT_LIST_HEAD(&prange->child_list);
  304. atomic_set(&prange->invalid, 0);
  305. prange->validate_timestamp = 0;
  306. prange->vram_pages = 0;
  307. mutex_init(&prange->migrate_mutex);
  308. mutex_init(&prange->lock);
  309. if (p->xnack_enabled)
  310. bitmap_copy(prange->bitmap_access, svms->bitmap_supported,
  311. MAX_GPU_INSTANCE);
  312. svm_range_set_default_attributes(svms, &prange->preferred_loc,
  313. &prange->prefetch_loc,
  314. &prange->granularity, &prange->flags);
  315. pr_debug("svms 0x%p [0x%llx 0x%llx]\n", svms, start, last);
  316. return prange;
  317. }
  318. static bool svm_bo_ref_unless_zero(struct svm_range_bo *svm_bo)
  319. {
  320. if (!svm_bo || !kref_get_unless_zero(&svm_bo->kref))
  321. return false;
  322. return true;
  323. }
  324. static void svm_range_bo_release(struct kref *kref)
  325. {
  326. struct svm_range_bo *svm_bo;
  327. svm_bo = container_of(kref, struct svm_range_bo, kref);
  328. pr_debug("svm_bo 0x%p\n", svm_bo);
  329. spin_lock(&svm_bo->list_lock);
  330. while (!list_empty(&svm_bo->range_list)) {
  331. struct svm_range *prange =
  332. list_first_entry(&svm_bo->range_list,
  333. struct svm_range, svm_bo_list);
  334. /* list_del_init tells a concurrent svm_range_vram_node_new when
  335. * it's safe to reuse the svm_bo pointer and svm_bo_list head.
  336. */
  337. list_del_init(&prange->svm_bo_list);
  338. spin_unlock(&svm_bo->list_lock);
  339. pr_debug("svms 0x%p [0x%lx 0x%lx]\n", prange->svms,
  340. prange->start, prange->last);
  341. mutex_lock(&prange->lock);
  342. prange->svm_bo = NULL;
  343. /* prange should not hold vram page now */
  344. WARN_ONCE(prange->actual_loc, "prange should not hold vram page");
  345. mutex_unlock(&prange->lock);
  346. spin_lock(&svm_bo->list_lock);
  347. }
  348. spin_unlock(&svm_bo->list_lock);
  349. if (mmget_not_zero(svm_bo->eviction_fence->mm)) {
  350. struct kfd_process_device *pdd;
  351. struct kfd_process *p;
  352. struct mm_struct *mm;
  353. mm = svm_bo->eviction_fence->mm;
  354. /*
  355. * The forked child process takes svm_bo device pages ref, svm_bo could be
  356. * released after parent process is gone.
  357. */
  358. p = kfd_lookup_process_by_mm(mm);
  359. if (p) {
  360. pdd = kfd_get_process_device_data(svm_bo->node, p);
  361. if (pdd)
  362. atomic64_sub(amdgpu_bo_size(svm_bo->bo), &pdd->vram_usage);
  363. kfd_unref_process(p);
  364. }
  365. mmput(mm);
  366. }
  367. if (!dma_fence_is_signaled(&svm_bo->eviction_fence->base))
  368. /* We're not in the eviction worker. Signal the fence. */
  369. dma_fence_signal(&svm_bo->eviction_fence->base);
  370. dma_fence_put(&svm_bo->eviction_fence->base);
  371. amdgpu_bo_unref(&svm_bo->bo);
  372. kfree(svm_bo);
  373. }
  374. static void svm_range_bo_wq_release(struct work_struct *work)
  375. {
  376. struct svm_range_bo *svm_bo;
  377. svm_bo = container_of(work, struct svm_range_bo, release_work);
  378. svm_range_bo_release(&svm_bo->kref);
  379. }
  380. static void svm_range_bo_release_async(struct kref *kref)
  381. {
  382. struct svm_range_bo *svm_bo;
  383. svm_bo = container_of(kref, struct svm_range_bo, kref);
  384. pr_debug("svm_bo 0x%p\n", svm_bo);
  385. INIT_WORK(&svm_bo->release_work, svm_range_bo_wq_release);
  386. schedule_work(&svm_bo->release_work);
  387. }
  388. void svm_range_bo_unref_async(struct svm_range_bo *svm_bo)
  389. {
  390. kref_put(&svm_bo->kref, svm_range_bo_release_async);
  391. }
  392. static void svm_range_bo_unref(struct svm_range_bo *svm_bo)
  393. {
  394. if (svm_bo)
  395. kref_put(&svm_bo->kref, svm_range_bo_release);
  396. }
  397. static bool
  398. svm_range_validate_svm_bo(struct kfd_node *node, struct svm_range *prange)
  399. {
  400. mutex_lock(&prange->lock);
  401. if (!prange->svm_bo) {
  402. mutex_unlock(&prange->lock);
  403. return false;
  404. }
  405. if (prange->ttm_res) {
  406. /* We still have a reference, all is well */
  407. mutex_unlock(&prange->lock);
  408. return true;
  409. }
  410. if (svm_bo_ref_unless_zero(prange->svm_bo)) {
  411. /*
  412. * Migrate from GPU to GPU, remove range from source svm_bo->node
  413. * range list, and return false to allocate svm_bo from destination
  414. * node.
  415. */
  416. if (prange->svm_bo->node != node) {
  417. mutex_unlock(&prange->lock);
  418. spin_lock(&prange->svm_bo->list_lock);
  419. list_del_init(&prange->svm_bo_list);
  420. spin_unlock(&prange->svm_bo->list_lock);
  421. svm_range_bo_unref(prange->svm_bo);
  422. return false;
  423. }
  424. if (READ_ONCE(prange->svm_bo->evicting)) {
  425. struct dma_fence *f;
  426. struct svm_range_bo *svm_bo;
  427. /* The BO is getting evicted,
  428. * we need to get a new one
  429. */
  430. mutex_unlock(&prange->lock);
  431. svm_bo = prange->svm_bo;
  432. f = dma_fence_get(&svm_bo->eviction_fence->base);
  433. svm_range_bo_unref(prange->svm_bo);
  434. /* wait for the fence to avoid long spin-loop
  435. * at list_empty_careful
  436. */
  437. dma_fence_wait(f, false);
  438. dma_fence_put(f);
  439. } else {
  440. /* The BO was still around and we got
  441. * a new reference to it
  442. */
  443. mutex_unlock(&prange->lock);
  444. pr_debug("reuse old bo svms 0x%p [0x%lx 0x%lx]\n",
  445. prange->svms, prange->start, prange->last);
  446. prange->ttm_res = prange->svm_bo->bo->tbo.resource;
  447. return true;
  448. }
  449. } else {
  450. mutex_unlock(&prange->lock);
  451. }
  452. /* We need a new svm_bo. Spin-loop to wait for concurrent
  453. * svm_range_bo_release to finish removing this range from
  454. * its range list and set prange->svm_bo to null. After this,
  455. * it is safe to reuse the svm_bo pointer and svm_bo_list head.
  456. */
  457. while (!list_empty_careful(&prange->svm_bo_list) || prange->svm_bo)
  458. cond_resched();
  459. return false;
  460. }
  461. static struct svm_range_bo *svm_range_bo_new(void)
  462. {
  463. struct svm_range_bo *svm_bo;
  464. svm_bo = kzalloc(sizeof(*svm_bo), GFP_KERNEL);
  465. if (!svm_bo)
  466. return NULL;
  467. kref_init(&svm_bo->kref);
  468. INIT_LIST_HEAD(&svm_bo->range_list);
  469. spin_lock_init(&svm_bo->list_lock);
  470. return svm_bo;
  471. }
  472. int
  473. svm_range_vram_node_new(struct kfd_node *node, struct svm_range *prange,
  474. bool clear)
  475. {
  476. struct kfd_process_device *pdd;
  477. struct amdgpu_bo_param bp;
  478. struct svm_range_bo *svm_bo;
  479. struct amdgpu_bo_user *ubo;
  480. struct amdgpu_bo *bo;
  481. struct kfd_process *p;
  482. struct mm_struct *mm;
  483. int r;
  484. p = container_of(prange->svms, struct kfd_process, svms);
  485. pr_debug("pasid: %x svms 0x%p [0x%lx 0x%lx]\n", p->pasid, prange->svms,
  486. prange->start, prange->last);
  487. if (svm_range_validate_svm_bo(node, prange))
  488. return 0;
  489. svm_bo = svm_range_bo_new();
  490. if (!svm_bo) {
  491. pr_debug("failed to alloc svm bo\n");
  492. return -ENOMEM;
  493. }
  494. mm = get_task_mm(p->lead_thread);
  495. if (!mm) {
  496. pr_debug("failed to get mm\n");
  497. kfree(svm_bo);
  498. return -ESRCH;
  499. }
  500. svm_bo->node = node;
  501. svm_bo->eviction_fence =
  502. amdgpu_amdkfd_fence_create(dma_fence_context_alloc(1),
  503. mm,
  504. svm_bo);
  505. mmput(mm);
  506. INIT_WORK(&svm_bo->eviction_work, svm_range_evict_svm_bo_worker);
  507. svm_bo->evicting = 0;
  508. memset(&bp, 0, sizeof(bp));
  509. bp.size = prange->npages * PAGE_SIZE;
  510. bp.byte_align = PAGE_SIZE;
  511. bp.domain = AMDGPU_GEM_DOMAIN_VRAM;
  512. bp.flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS;
  513. bp.flags |= clear ? AMDGPU_GEM_CREATE_VRAM_CLEARED : 0;
  514. bp.flags |= AMDGPU_GEM_CREATE_DISCARDABLE;
  515. bp.type = ttm_bo_type_device;
  516. bp.resv = NULL;
  517. if (node->xcp)
  518. bp.xcp_id_plus1 = node->xcp->id + 1;
  519. r = amdgpu_bo_create_user(node->adev, &bp, &ubo);
  520. if (r) {
  521. pr_debug("failed %d to create bo\n", r);
  522. goto create_bo_failed;
  523. }
  524. bo = &ubo->bo;
  525. pr_debug("alloc bo at offset 0x%lx size 0x%lx on partition %d\n",
  526. bo->tbo.resource->start << PAGE_SHIFT, bp.size,
  527. bp.xcp_id_plus1 - 1);
  528. r = amdgpu_bo_reserve(bo, true);
  529. if (r) {
  530. pr_debug("failed %d to reserve bo\n", r);
  531. goto reserve_bo_failed;
  532. }
  533. if (clear) {
  534. r = amdgpu_bo_sync_wait(bo, AMDGPU_FENCE_OWNER_KFD, false);
  535. if (r) {
  536. pr_debug("failed %d to sync bo\n", r);
  537. amdgpu_bo_unreserve(bo);
  538. goto reserve_bo_failed;
  539. }
  540. }
  541. r = dma_resv_reserve_fences(bo->tbo.base.resv, 1);
  542. if (r) {
  543. pr_debug("failed %d to reserve bo\n", r);
  544. amdgpu_bo_unreserve(bo);
  545. goto reserve_bo_failed;
  546. }
  547. amdgpu_bo_fence(bo, &svm_bo->eviction_fence->base, true);
  548. amdgpu_bo_unreserve(bo);
  549. svm_bo->bo = bo;
  550. prange->svm_bo = svm_bo;
  551. prange->ttm_res = bo->tbo.resource;
  552. prange->offset = 0;
  553. spin_lock(&svm_bo->list_lock);
  554. list_add(&prange->svm_bo_list, &svm_bo->range_list);
  555. spin_unlock(&svm_bo->list_lock);
  556. pdd = svm_range_get_pdd_by_node(prange, node);
  557. if (pdd)
  558. atomic64_add(amdgpu_bo_size(bo), &pdd->vram_usage);
  559. return 0;
  560. reserve_bo_failed:
  561. amdgpu_bo_unref(&bo);
  562. create_bo_failed:
  563. dma_fence_put(&svm_bo->eviction_fence->base);
  564. kfree(svm_bo);
  565. prange->ttm_res = NULL;
  566. return r;
  567. }
  568. void svm_range_vram_node_free(struct svm_range *prange)
  569. {
  570. /* serialize prange->svm_bo unref */
  571. mutex_lock(&prange->lock);
  572. /* prange->svm_bo has not been unref */
  573. if (prange->ttm_res) {
  574. prange->ttm_res = NULL;
  575. mutex_unlock(&prange->lock);
  576. svm_range_bo_unref(prange->svm_bo);
  577. } else
  578. mutex_unlock(&prange->lock);
  579. }
  580. struct kfd_node *
  581. svm_range_get_node_by_id(struct svm_range *prange, uint32_t gpu_id)
  582. {
  583. struct kfd_process *p;
  584. struct kfd_process_device *pdd;
  585. p = container_of(prange->svms, struct kfd_process, svms);
  586. pdd = kfd_process_device_data_by_id(p, gpu_id);
  587. if (!pdd) {
  588. pr_debug("failed to get kfd process device by id 0x%x\n", gpu_id);
  589. return NULL;
  590. }
  591. return pdd->dev;
  592. }
  593. struct kfd_process_device *
  594. svm_range_get_pdd_by_node(struct svm_range *prange, struct kfd_node *node)
  595. {
  596. struct kfd_process *p;
  597. p = container_of(prange->svms, struct kfd_process, svms);
  598. return kfd_get_process_device_data(node, p);
  599. }
  600. static int svm_range_bo_validate(void *param, struct amdgpu_bo *bo)
  601. {
  602. struct ttm_operation_ctx ctx = { false, false };
  603. amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM);
  604. return ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
  605. }
  606. static int
  607. svm_range_check_attr(struct kfd_process *p,
  608. uint32_t nattr, struct kfd_ioctl_svm_attribute *attrs)
  609. {
  610. uint32_t i;
  611. for (i = 0; i < nattr; i++) {
  612. uint32_t val = attrs[i].value;
  613. int gpuidx = MAX_GPU_INSTANCE;
  614. switch (attrs[i].type) {
  615. case KFD_IOCTL_SVM_ATTR_PREFERRED_LOC:
  616. if (val != KFD_IOCTL_SVM_LOCATION_SYSMEM &&
  617. val != KFD_IOCTL_SVM_LOCATION_UNDEFINED)
  618. gpuidx = kfd_process_gpuidx_from_gpuid(p, val);
  619. break;
  620. case KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:
  621. if (val != KFD_IOCTL_SVM_LOCATION_SYSMEM)
  622. gpuidx = kfd_process_gpuidx_from_gpuid(p, val);
  623. break;
  624. case KFD_IOCTL_SVM_ATTR_ACCESS:
  625. case KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE:
  626. case KFD_IOCTL_SVM_ATTR_NO_ACCESS:
  627. gpuidx = kfd_process_gpuidx_from_gpuid(p, val);
  628. break;
  629. case KFD_IOCTL_SVM_ATTR_SET_FLAGS:
  630. break;
  631. case KFD_IOCTL_SVM_ATTR_CLR_FLAGS:
  632. break;
  633. case KFD_IOCTL_SVM_ATTR_GRANULARITY:
  634. break;
  635. default:
  636. pr_debug("unknown attr type 0x%x\n", attrs[i].type);
  637. return -EINVAL;
  638. }
  639. if (gpuidx < 0) {
  640. pr_debug("no GPU 0x%x found\n", val);
  641. return -EINVAL;
  642. } else if (gpuidx < MAX_GPU_INSTANCE &&
  643. !test_bit(gpuidx, p->svms.bitmap_supported)) {
  644. pr_debug("GPU 0x%x not supported\n", val);
  645. return -EINVAL;
  646. }
  647. }
  648. return 0;
  649. }
  650. static void
  651. svm_range_apply_attrs(struct kfd_process *p, struct svm_range *prange,
  652. uint32_t nattr, struct kfd_ioctl_svm_attribute *attrs,
  653. bool *update_mapping)
  654. {
  655. uint32_t i;
  656. int gpuidx;
  657. for (i = 0; i < nattr; i++) {
  658. switch (attrs[i].type) {
  659. case KFD_IOCTL_SVM_ATTR_PREFERRED_LOC:
  660. prange->preferred_loc = attrs[i].value;
  661. break;
  662. case KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:
  663. prange->prefetch_loc = attrs[i].value;
  664. break;
  665. case KFD_IOCTL_SVM_ATTR_ACCESS:
  666. case KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE:
  667. case KFD_IOCTL_SVM_ATTR_NO_ACCESS:
  668. if (!p->xnack_enabled)
  669. *update_mapping = true;
  670. gpuidx = kfd_process_gpuidx_from_gpuid(p,
  671. attrs[i].value);
  672. if (attrs[i].type == KFD_IOCTL_SVM_ATTR_NO_ACCESS) {
  673. bitmap_clear(prange->bitmap_access, gpuidx, 1);
  674. bitmap_clear(prange->bitmap_aip, gpuidx, 1);
  675. } else if (attrs[i].type == KFD_IOCTL_SVM_ATTR_ACCESS) {
  676. bitmap_set(prange->bitmap_access, gpuidx, 1);
  677. bitmap_clear(prange->bitmap_aip, gpuidx, 1);
  678. } else {
  679. bitmap_clear(prange->bitmap_access, gpuidx, 1);
  680. bitmap_set(prange->bitmap_aip, gpuidx, 1);
  681. }
  682. break;
  683. case KFD_IOCTL_SVM_ATTR_SET_FLAGS:
  684. *update_mapping = true;
  685. prange->flags |= attrs[i].value;
  686. break;
  687. case KFD_IOCTL_SVM_ATTR_CLR_FLAGS:
  688. *update_mapping = true;
  689. prange->flags &= ~attrs[i].value;
  690. break;
  691. case KFD_IOCTL_SVM_ATTR_GRANULARITY:
  692. prange->granularity = min_t(uint32_t, attrs[i].value, 0x3F);
  693. break;
  694. default:
  695. WARN_ONCE(1, "svm_range_check_attrs wasn't called?");
  696. }
  697. }
  698. }
  699. static bool
  700. svm_range_is_same_attrs(struct kfd_process *p, struct svm_range *prange,
  701. uint32_t nattr, struct kfd_ioctl_svm_attribute *attrs)
  702. {
  703. uint32_t i;
  704. int gpuidx;
  705. for (i = 0; i < nattr; i++) {
  706. switch (attrs[i].type) {
  707. case KFD_IOCTL_SVM_ATTR_PREFERRED_LOC:
  708. if (prange->preferred_loc != attrs[i].value)
  709. return false;
  710. break;
  711. case KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:
  712. /* Prefetch should always trigger a migration even
  713. * if the value of the attribute didn't change.
  714. */
  715. return false;
  716. case KFD_IOCTL_SVM_ATTR_ACCESS:
  717. case KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE:
  718. case KFD_IOCTL_SVM_ATTR_NO_ACCESS:
  719. gpuidx = kfd_process_gpuidx_from_gpuid(p,
  720. attrs[i].value);
  721. if (attrs[i].type == KFD_IOCTL_SVM_ATTR_NO_ACCESS) {
  722. if (test_bit(gpuidx, prange->bitmap_access) ||
  723. test_bit(gpuidx, prange->bitmap_aip))
  724. return false;
  725. } else if (attrs[i].type == KFD_IOCTL_SVM_ATTR_ACCESS) {
  726. if (!test_bit(gpuidx, prange->bitmap_access))
  727. return false;
  728. } else {
  729. if (!test_bit(gpuidx, prange->bitmap_aip))
  730. return false;
  731. }
  732. break;
  733. case KFD_IOCTL_SVM_ATTR_SET_FLAGS:
  734. if ((prange->flags & attrs[i].value) != attrs[i].value)
  735. return false;
  736. break;
  737. case KFD_IOCTL_SVM_ATTR_CLR_FLAGS:
  738. if ((prange->flags & attrs[i].value) != 0)
  739. return false;
  740. break;
  741. case KFD_IOCTL_SVM_ATTR_GRANULARITY:
  742. if (prange->granularity != attrs[i].value)
  743. return false;
  744. break;
  745. default:
  746. WARN_ONCE(1, "svm_range_check_attrs wasn't called?");
  747. }
  748. }
  749. return true;
  750. }
  751. /**
  752. * svm_range_debug_dump - print all range information from svms
  753. * @svms: svm range list header
  754. *
  755. * debug output svm range start, end, prefetch location from svms
  756. * interval tree and link list
  757. *
  758. * Context: The caller must hold svms->lock
  759. */
  760. static void svm_range_debug_dump(struct svm_range_list *svms)
  761. {
  762. struct interval_tree_node *node;
  763. struct svm_range *prange;
  764. pr_debug("dump svms 0x%p list\n", svms);
  765. pr_debug("range\tstart\tpage\tend\t\tlocation\n");
  766. list_for_each_entry(prange, &svms->list, list) {
  767. pr_debug("0x%p 0x%lx\t0x%llx\t0x%llx\t0x%x\n",
  768. prange, prange->start, prange->npages,
  769. prange->start + prange->npages - 1,
  770. prange->actual_loc);
  771. }
  772. pr_debug("dump svms 0x%p interval tree\n", svms);
  773. pr_debug("range\tstart\tpage\tend\t\tlocation\n");
  774. node = interval_tree_iter_first(&svms->objects, 0, ~0ULL);
  775. while (node) {
  776. prange = container_of(node, struct svm_range, it_node);
  777. pr_debug("0x%p 0x%lx\t0x%llx\t0x%llx\t0x%x\n",
  778. prange, prange->start, prange->npages,
  779. prange->start + prange->npages - 1,
  780. prange->actual_loc);
  781. node = interval_tree_iter_next(node, 0, ~0ULL);
  782. }
  783. }
  784. static void *
  785. svm_range_copy_array(void *psrc, size_t size, uint64_t num_elements,
  786. uint64_t offset, uint64_t *vram_pages)
  787. {
  788. unsigned char *src = (unsigned char *)psrc + offset;
  789. unsigned char *dst;
  790. uint64_t i;
  791. dst = kvmalloc_array(num_elements, size, GFP_KERNEL);
  792. if (!dst)
  793. return NULL;
  794. if (!vram_pages) {
  795. memcpy(dst, src, num_elements * size);
  796. return (void *)dst;
  797. }
  798. *vram_pages = 0;
  799. for (i = 0; i < num_elements; i++) {
  800. dma_addr_t *temp;
  801. temp = (dma_addr_t *)dst + i;
  802. *temp = *((dma_addr_t *)src + i);
  803. if (*temp&SVM_RANGE_VRAM_DOMAIN)
  804. (*vram_pages)++;
  805. }
  806. return (void *)dst;
  807. }
  808. static int
  809. svm_range_copy_dma_addrs(struct svm_range *dst, struct svm_range *src)
  810. {
  811. int i;
  812. for (i = 0; i < MAX_GPU_INSTANCE; i++) {
  813. if (!src->dma_addr[i])
  814. continue;
  815. dst->dma_addr[i] = svm_range_copy_array(src->dma_addr[i],
  816. sizeof(*src->dma_addr[i]), src->npages, 0, NULL);
  817. if (!dst->dma_addr[i])
  818. return -ENOMEM;
  819. }
  820. return 0;
  821. }
  822. static int
  823. svm_range_split_array(void *ppnew, void *ppold, size_t size,
  824. uint64_t old_start, uint64_t old_n,
  825. uint64_t new_start, uint64_t new_n, uint64_t *new_vram_pages)
  826. {
  827. unsigned char *new, *old, *pold;
  828. uint64_t d;
  829. if (!ppold)
  830. return 0;
  831. pold = *(unsigned char **)ppold;
  832. if (!pold)
  833. return 0;
  834. d = (new_start - old_start) * size;
  835. /* get dma addr array for new range and calculte its vram page number */
  836. new = svm_range_copy_array(pold, size, new_n, d, new_vram_pages);
  837. if (!new)
  838. return -ENOMEM;
  839. d = (new_start == old_start) ? new_n * size : 0;
  840. old = svm_range_copy_array(pold, size, old_n, d, NULL);
  841. if (!old) {
  842. kvfree(new);
  843. return -ENOMEM;
  844. }
  845. kvfree(pold);
  846. *(void **)ppold = old;
  847. *(void **)ppnew = new;
  848. return 0;
  849. }
  850. static int
  851. svm_range_split_pages(struct svm_range *new, struct svm_range *old,
  852. uint64_t start, uint64_t last)
  853. {
  854. uint64_t npages = last - start + 1;
  855. int i, r;
  856. for (i = 0; i < MAX_GPU_INSTANCE; i++) {
  857. r = svm_range_split_array(&new->dma_addr[i], &old->dma_addr[i],
  858. sizeof(*old->dma_addr[i]), old->start,
  859. npages, new->start, new->npages,
  860. old->actual_loc ? &new->vram_pages : NULL);
  861. if (r)
  862. return r;
  863. }
  864. if (old->actual_loc)
  865. old->vram_pages -= new->vram_pages;
  866. return 0;
  867. }
  868. static int
  869. svm_range_split_nodes(struct svm_range *new, struct svm_range *old,
  870. uint64_t start, uint64_t last)
  871. {
  872. uint64_t npages = last - start + 1;
  873. pr_debug("svms 0x%p new prange 0x%p start 0x%lx [0x%llx 0x%llx]\n",
  874. new->svms, new, new->start, start, last);
  875. if (new->start == old->start) {
  876. new->offset = old->offset;
  877. old->offset += new->npages;
  878. } else {
  879. new->offset = old->offset + npages;
  880. }
  881. new->svm_bo = svm_range_bo_ref(old->svm_bo);
  882. new->ttm_res = old->ttm_res;
  883. spin_lock(&new->svm_bo->list_lock);
  884. list_add(&new->svm_bo_list, &new->svm_bo->range_list);
  885. spin_unlock(&new->svm_bo->list_lock);
  886. return 0;
  887. }
  888. /**
  889. * svm_range_split_adjust - split range and adjust
  890. *
  891. * @new: new range
  892. * @old: the old range
  893. * @start: the old range adjust to start address in pages
  894. * @last: the old range adjust to last address in pages
  895. *
  896. * Copy system memory dma_addr or vram ttm_res in old range to new
  897. * range from new_start up to size new->npages, the remaining old range is from
  898. * start to last
  899. *
  900. * Return:
  901. * 0 - OK, -ENOMEM - out of memory
  902. */
  903. static int
  904. svm_range_split_adjust(struct svm_range *new, struct svm_range *old,
  905. uint64_t start, uint64_t last)
  906. {
  907. int r;
  908. pr_debug("svms 0x%p new 0x%lx old [0x%lx 0x%lx] => [0x%llx 0x%llx]\n",
  909. new->svms, new->start, old->start, old->last, start, last);
  910. if (new->start < old->start ||
  911. new->last > old->last) {
  912. WARN_ONCE(1, "invalid new range start or last\n");
  913. return -EINVAL;
  914. }
  915. r = svm_range_split_pages(new, old, start, last);
  916. if (r)
  917. return r;
  918. if (old->actual_loc && old->ttm_res) {
  919. r = svm_range_split_nodes(new, old, start, last);
  920. if (r)
  921. return r;
  922. }
  923. old->npages = last - start + 1;
  924. old->start = start;
  925. old->last = last;
  926. new->flags = old->flags;
  927. new->preferred_loc = old->preferred_loc;
  928. new->prefetch_loc = old->prefetch_loc;
  929. new->actual_loc = old->actual_loc;
  930. new->granularity = old->granularity;
  931. new->mapped_to_gpu = old->mapped_to_gpu;
  932. bitmap_copy(new->bitmap_access, old->bitmap_access, MAX_GPU_INSTANCE);
  933. bitmap_copy(new->bitmap_aip, old->bitmap_aip, MAX_GPU_INSTANCE);
  934. atomic_set(&new->queue_refcount, atomic_read(&old->queue_refcount));
  935. return 0;
  936. }
  937. /**
  938. * svm_range_split - split a range in 2 ranges
  939. *
  940. * @prange: the svm range to split
  941. * @start: the remaining range start address in pages
  942. * @last: the remaining range last address in pages
  943. * @new: the result new range generated
  944. *
  945. * Two cases only:
  946. * case 1: if start == prange->start
  947. * prange ==> prange[start, last]
  948. * new range [last + 1, prange->last]
  949. *
  950. * case 2: if last == prange->last
  951. * prange ==> prange[start, last]
  952. * new range [prange->start, start - 1]
  953. *
  954. * Return:
  955. * 0 - OK, -ENOMEM - out of memory, -EINVAL - invalid start, last
  956. */
  957. static int
  958. svm_range_split(struct svm_range *prange, uint64_t start, uint64_t last,
  959. struct svm_range **new)
  960. {
  961. uint64_t old_start = prange->start;
  962. uint64_t old_last = prange->last;
  963. struct svm_range_list *svms;
  964. int r = 0;
  965. pr_debug("svms 0x%p [0x%llx 0x%llx] to [0x%llx 0x%llx]\n", prange->svms,
  966. old_start, old_last, start, last);
  967. if (old_start != start && old_last != last)
  968. return -EINVAL;
  969. if (start < old_start || last > old_last)
  970. return -EINVAL;
  971. svms = prange->svms;
  972. if (old_start == start)
  973. *new = svm_range_new(svms, last + 1, old_last, false);
  974. else
  975. *new = svm_range_new(svms, old_start, start - 1, false);
  976. if (!*new)
  977. return -ENOMEM;
  978. r = svm_range_split_adjust(*new, prange, start, last);
  979. if (r) {
  980. pr_debug("failed %d split [0x%llx 0x%llx] to [0x%llx 0x%llx]\n",
  981. r, old_start, old_last, start, last);
  982. svm_range_free(*new, false);
  983. *new = NULL;
  984. }
  985. return r;
  986. }
  987. static int
  988. svm_range_split_tail(struct svm_range *prange, uint64_t new_last,
  989. struct list_head *insert_list, struct list_head *remap_list)
  990. {
  991. struct svm_range *tail = NULL;
  992. int r = svm_range_split(prange, prange->start, new_last, &tail);
  993. if (!r) {
  994. list_add(&tail->list, insert_list);
  995. if (!IS_ALIGNED(new_last + 1, 1UL << prange->granularity))
  996. list_add(&tail->update_list, remap_list);
  997. }
  998. return r;
  999. }
  1000. static int
  1001. svm_range_split_head(struct svm_range *prange, uint64_t new_start,
  1002. struct list_head *insert_list, struct list_head *remap_list)
  1003. {
  1004. struct svm_range *head = NULL;
  1005. int r = svm_range_split(prange, new_start, prange->last, &head);
  1006. if (!r) {
  1007. list_add(&head->list, insert_list);
  1008. if (!IS_ALIGNED(new_start, 1UL << prange->granularity))
  1009. list_add(&head->update_list, remap_list);
  1010. }
  1011. return r;
  1012. }
  1013. static void
  1014. svm_range_add_child(struct svm_range *prange, struct svm_range *pchild, enum svm_work_list_ops op)
  1015. {
  1016. pr_debug("add child 0x%p [0x%lx 0x%lx] to prange 0x%p child list %d\n",
  1017. pchild, pchild->start, pchild->last, prange, op);
  1018. pchild->work_item.mm = NULL;
  1019. pchild->work_item.op = op;
  1020. list_add_tail(&pchild->child_list, &prange->child_list);
  1021. }
  1022. static bool
  1023. svm_nodes_in_same_hive(struct kfd_node *node_a, struct kfd_node *node_b)
  1024. {
  1025. return (node_a->adev == node_b->adev ||
  1026. amdgpu_xgmi_same_hive(node_a->adev, node_b->adev));
  1027. }
  1028. static uint64_t
  1029. svm_range_get_pte_flags(struct kfd_node *node,
  1030. struct svm_range *prange, int domain)
  1031. {
  1032. struct kfd_node *bo_node;
  1033. uint32_t flags = prange->flags;
  1034. uint32_t mapping_flags = 0;
  1035. uint64_t pte_flags;
  1036. bool snoop = (domain != SVM_RANGE_VRAM_DOMAIN);
  1037. bool coherent = flags & (KFD_IOCTL_SVM_FLAG_COHERENT | KFD_IOCTL_SVM_FLAG_EXT_COHERENT);
  1038. bool ext_coherent = flags & KFD_IOCTL_SVM_FLAG_EXT_COHERENT;
  1039. unsigned int mtype_local;
  1040. if (domain == SVM_RANGE_VRAM_DOMAIN)
  1041. bo_node = prange->svm_bo->node;
  1042. switch (amdgpu_ip_version(node->adev, GC_HWIP, 0)) {
  1043. case IP_VERSION(9, 4, 1):
  1044. if (domain == SVM_RANGE_VRAM_DOMAIN) {
  1045. if (bo_node == node) {
  1046. mapping_flags |= coherent ?
  1047. AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW;
  1048. } else {
  1049. mapping_flags |= coherent ?
  1050. AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
  1051. if (svm_nodes_in_same_hive(node, bo_node))
  1052. snoop = true;
  1053. }
  1054. } else {
  1055. mapping_flags |= coherent ?
  1056. AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
  1057. }
  1058. break;
  1059. case IP_VERSION(9, 4, 2):
  1060. if (domain == SVM_RANGE_VRAM_DOMAIN) {
  1061. if (bo_node == node) {
  1062. mapping_flags |= coherent ?
  1063. AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW;
  1064. if (node->adev->gmc.xgmi.connected_to_cpu)
  1065. snoop = true;
  1066. } else {
  1067. mapping_flags |= coherent ?
  1068. AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
  1069. if (svm_nodes_in_same_hive(node, bo_node))
  1070. snoop = true;
  1071. }
  1072. } else {
  1073. mapping_flags |= coherent ?
  1074. AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
  1075. }
  1076. break;
  1077. case IP_VERSION(9, 4, 3):
  1078. case IP_VERSION(9, 4, 4):
  1079. if (ext_coherent)
  1080. mtype_local = node->adev->rev_id ? AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_UC;
  1081. else
  1082. mtype_local = amdgpu_mtype_local == 1 ? AMDGPU_VM_MTYPE_NC :
  1083. amdgpu_mtype_local == 2 ? AMDGPU_VM_MTYPE_CC : AMDGPU_VM_MTYPE_RW;
  1084. snoop = true;
  1085. if (domain == SVM_RANGE_VRAM_DOMAIN) {
  1086. /* local HBM region close to partition */
  1087. if (bo_node->adev == node->adev &&
  1088. (!bo_node->xcp || !node->xcp || bo_node->xcp->mem_id == node->xcp->mem_id))
  1089. mapping_flags |= mtype_local;
  1090. /* local HBM region far from partition or remote XGMI GPU
  1091. * with regular system scope coherence
  1092. */
  1093. else if (svm_nodes_in_same_hive(bo_node, node) && !ext_coherent)
  1094. mapping_flags |= AMDGPU_VM_MTYPE_NC;
  1095. /* PCIe P2P or extended system scope coherence */
  1096. else
  1097. mapping_flags |= AMDGPU_VM_MTYPE_UC;
  1098. /* system memory accessed by the APU */
  1099. } else if (node->adev->flags & AMD_IS_APU) {
  1100. /* On NUMA systems, locality is determined per-page
  1101. * in amdgpu_gmc_override_vm_pte_flags
  1102. */
  1103. if (num_possible_nodes() <= 1)
  1104. mapping_flags |= mtype_local;
  1105. else
  1106. mapping_flags |= ext_coherent ? AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
  1107. /* system memory accessed by the dGPU */
  1108. } else {
  1109. mapping_flags |= AMDGPU_VM_MTYPE_UC;
  1110. }
  1111. break;
  1112. case IP_VERSION(12, 0, 0):
  1113. case IP_VERSION(12, 0, 1):
  1114. mapping_flags |= AMDGPU_VM_MTYPE_NC;
  1115. break;
  1116. default:
  1117. mapping_flags |= coherent ?
  1118. AMDGPU_VM_MTYPE_UC : AMDGPU_VM_MTYPE_NC;
  1119. }
  1120. mapping_flags |= AMDGPU_VM_PAGE_READABLE | AMDGPU_VM_PAGE_WRITEABLE;
  1121. if (flags & KFD_IOCTL_SVM_FLAG_GPU_RO)
  1122. mapping_flags &= ~AMDGPU_VM_PAGE_WRITEABLE;
  1123. if (flags & KFD_IOCTL_SVM_FLAG_GPU_EXEC)
  1124. mapping_flags |= AMDGPU_VM_PAGE_EXECUTABLE;
  1125. pte_flags = AMDGPU_PTE_VALID;
  1126. pte_flags |= (domain == SVM_RANGE_VRAM_DOMAIN) ? 0 : AMDGPU_PTE_SYSTEM;
  1127. pte_flags |= snoop ? AMDGPU_PTE_SNOOPED : 0;
  1128. if (KFD_GC_VERSION(node) >= IP_VERSION(12, 0, 0))
  1129. pte_flags |= AMDGPU_PTE_IS_PTE;
  1130. pte_flags |= amdgpu_gem_va_map_flags(node->adev, mapping_flags);
  1131. return pte_flags;
  1132. }
  1133. static int
  1134. svm_range_unmap_from_gpu(struct amdgpu_device *adev, struct amdgpu_vm *vm,
  1135. uint64_t start, uint64_t last,
  1136. struct dma_fence **fence)
  1137. {
  1138. uint64_t init_pte_value = 0;
  1139. pr_debug("[0x%llx 0x%llx]\n", start, last);
  1140. return amdgpu_vm_update_range(adev, vm, false, true, true, false, NULL, start,
  1141. last, init_pte_value, 0, 0, NULL, NULL,
  1142. fence);
  1143. }
  1144. static int
  1145. svm_range_unmap_from_gpus(struct svm_range *prange, unsigned long start,
  1146. unsigned long last, uint32_t trigger)
  1147. {
  1148. DECLARE_BITMAP(bitmap, MAX_GPU_INSTANCE);
  1149. struct kfd_process_device *pdd;
  1150. struct dma_fence *fence = NULL;
  1151. struct kfd_process *p;
  1152. uint32_t gpuidx;
  1153. int r = 0;
  1154. if (!prange->mapped_to_gpu) {
  1155. pr_debug("prange 0x%p [0x%lx 0x%lx] not mapped to GPU\n",
  1156. prange, prange->start, prange->last);
  1157. return 0;
  1158. }
  1159. if (prange->start == start && prange->last == last) {
  1160. pr_debug("unmap svms 0x%p prange 0x%p\n", prange->svms, prange);
  1161. prange->mapped_to_gpu = false;
  1162. }
  1163. bitmap_or(bitmap, prange->bitmap_access, prange->bitmap_aip,
  1164. MAX_GPU_INSTANCE);
  1165. p = container_of(prange->svms, struct kfd_process, svms);
  1166. for_each_set_bit(gpuidx, bitmap, MAX_GPU_INSTANCE) {
  1167. pr_debug("unmap from gpu idx 0x%x\n", gpuidx);
  1168. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  1169. if (!pdd) {
  1170. pr_debug("failed to find device idx %d\n", gpuidx);
  1171. return -EINVAL;
  1172. }
  1173. kfd_smi_event_unmap_from_gpu(pdd->dev, p->lead_thread->pid,
  1174. start, last, trigger);
  1175. r = svm_range_unmap_from_gpu(pdd->dev->adev,
  1176. drm_priv_to_vm(pdd->drm_priv),
  1177. start, last, &fence);
  1178. if (r)
  1179. break;
  1180. if (fence) {
  1181. r = dma_fence_wait(fence, false);
  1182. dma_fence_put(fence);
  1183. fence = NULL;
  1184. if (r)
  1185. break;
  1186. }
  1187. kfd_flush_tlb(pdd, TLB_FLUSH_HEAVYWEIGHT);
  1188. }
  1189. return r;
  1190. }
  1191. static int
  1192. svm_range_map_to_gpu(struct kfd_process_device *pdd, struct svm_range *prange,
  1193. unsigned long offset, unsigned long npages, bool readonly,
  1194. dma_addr_t *dma_addr, struct amdgpu_device *bo_adev,
  1195. struct dma_fence **fence, bool flush_tlb)
  1196. {
  1197. struct amdgpu_device *adev = pdd->dev->adev;
  1198. struct amdgpu_vm *vm = drm_priv_to_vm(pdd->drm_priv);
  1199. uint64_t pte_flags;
  1200. unsigned long last_start;
  1201. int last_domain;
  1202. int r = 0;
  1203. int64_t i, j;
  1204. last_start = prange->start + offset;
  1205. pr_debug("svms 0x%p [0x%lx 0x%lx] readonly %d\n", prange->svms,
  1206. last_start, last_start + npages - 1, readonly);
  1207. for (i = offset; i < offset + npages; i++) {
  1208. last_domain = dma_addr[i] & SVM_RANGE_VRAM_DOMAIN;
  1209. dma_addr[i] &= ~SVM_RANGE_VRAM_DOMAIN;
  1210. /* Collect all pages in the same address range and memory domain
  1211. * that can be mapped with a single call to update mapping.
  1212. */
  1213. if (i < offset + npages - 1 &&
  1214. last_domain == (dma_addr[i + 1] & SVM_RANGE_VRAM_DOMAIN))
  1215. continue;
  1216. pr_debug("Mapping range [0x%lx 0x%llx] on domain: %s\n",
  1217. last_start, prange->start + i, last_domain ? "GPU" : "CPU");
  1218. pte_flags = svm_range_get_pte_flags(pdd->dev, prange, last_domain);
  1219. if (readonly)
  1220. pte_flags &= ~AMDGPU_PTE_WRITEABLE;
  1221. pr_debug("svms 0x%p map [0x%lx 0x%llx] vram %d PTE 0x%llx\n",
  1222. prange->svms, last_start, prange->start + i,
  1223. (last_domain == SVM_RANGE_VRAM_DOMAIN) ? 1 : 0,
  1224. pte_flags);
  1225. /* For dGPU mode, we use same vm_manager to allocate VRAM for
  1226. * different memory partition based on fpfn/lpfn, we should use
  1227. * same vm_manager.vram_base_offset regardless memory partition.
  1228. */
  1229. r = amdgpu_vm_update_range(adev, vm, false, false, flush_tlb, true,
  1230. NULL, last_start, prange->start + i,
  1231. pte_flags,
  1232. (last_start - prange->start) << PAGE_SHIFT,
  1233. bo_adev ? bo_adev->vm_manager.vram_base_offset : 0,
  1234. NULL, dma_addr, &vm->last_update);
  1235. for (j = last_start - prange->start; j <= i; j++)
  1236. dma_addr[j] |= last_domain;
  1237. if (r) {
  1238. pr_debug("failed %d to map to gpu 0x%lx\n", r, prange->start);
  1239. goto out;
  1240. }
  1241. last_start = prange->start + i + 1;
  1242. }
  1243. r = amdgpu_vm_update_pdes(adev, vm, false);
  1244. if (r) {
  1245. pr_debug("failed %d to update directories 0x%lx\n", r,
  1246. prange->start);
  1247. goto out;
  1248. }
  1249. if (fence)
  1250. *fence = dma_fence_get(vm->last_update);
  1251. out:
  1252. return r;
  1253. }
  1254. static int
  1255. svm_range_map_to_gpus(struct svm_range *prange, unsigned long offset,
  1256. unsigned long npages, bool readonly,
  1257. unsigned long *bitmap, bool wait, bool flush_tlb)
  1258. {
  1259. struct kfd_process_device *pdd;
  1260. struct amdgpu_device *bo_adev = NULL;
  1261. struct kfd_process *p;
  1262. struct dma_fence *fence = NULL;
  1263. uint32_t gpuidx;
  1264. int r = 0;
  1265. if (prange->svm_bo && prange->ttm_res)
  1266. bo_adev = prange->svm_bo->node->adev;
  1267. p = container_of(prange->svms, struct kfd_process, svms);
  1268. for_each_set_bit(gpuidx, bitmap, MAX_GPU_INSTANCE) {
  1269. pr_debug("mapping to gpu idx 0x%x\n", gpuidx);
  1270. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  1271. if (!pdd) {
  1272. pr_debug("failed to find device idx %d\n", gpuidx);
  1273. return -EINVAL;
  1274. }
  1275. pdd = kfd_bind_process_to_device(pdd->dev, p);
  1276. if (IS_ERR(pdd))
  1277. return -EINVAL;
  1278. if (bo_adev && pdd->dev->adev != bo_adev &&
  1279. !amdgpu_xgmi_same_hive(pdd->dev->adev, bo_adev)) {
  1280. pr_debug("cannot map to device idx %d\n", gpuidx);
  1281. continue;
  1282. }
  1283. r = svm_range_map_to_gpu(pdd, prange, offset, npages, readonly,
  1284. prange->dma_addr[gpuidx],
  1285. bo_adev, wait ? &fence : NULL,
  1286. flush_tlb);
  1287. if (r)
  1288. break;
  1289. if (fence) {
  1290. r = dma_fence_wait(fence, false);
  1291. dma_fence_put(fence);
  1292. fence = NULL;
  1293. if (r) {
  1294. pr_debug("failed %d to dma fence wait\n", r);
  1295. break;
  1296. }
  1297. }
  1298. kfd_flush_tlb(pdd, TLB_FLUSH_LEGACY);
  1299. }
  1300. return r;
  1301. }
  1302. struct svm_validate_context {
  1303. struct kfd_process *process;
  1304. struct svm_range *prange;
  1305. bool intr;
  1306. DECLARE_BITMAP(bitmap, MAX_GPU_INSTANCE);
  1307. struct drm_exec exec;
  1308. };
  1309. static int svm_range_reserve_bos(struct svm_validate_context *ctx, bool intr)
  1310. {
  1311. struct kfd_process_device *pdd;
  1312. struct amdgpu_vm *vm;
  1313. uint32_t gpuidx;
  1314. int r;
  1315. drm_exec_init(&ctx->exec, intr ? DRM_EXEC_INTERRUPTIBLE_WAIT: 0, 0);
  1316. drm_exec_until_all_locked(&ctx->exec) {
  1317. for_each_set_bit(gpuidx, ctx->bitmap, MAX_GPU_INSTANCE) {
  1318. pdd = kfd_process_device_from_gpuidx(ctx->process, gpuidx);
  1319. if (!pdd) {
  1320. pr_debug("failed to find device idx %d\n", gpuidx);
  1321. r = -EINVAL;
  1322. goto unreserve_out;
  1323. }
  1324. vm = drm_priv_to_vm(pdd->drm_priv);
  1325. r = amdgpu_vm_lock_pd(vm, &ctx->exec, 2);
  1326. drm_exec_retry_on_contention(&ctx->exec);
  1327. if (unlikely(r)) {
  1328. pr_debug("failed %d to reserve bo\n", r);
  1329. goto unreserve_out;
  1330. }
  1331. }
  1332. }
  1333. for_each_set_bit(gpuidx, ctx->bitmap, MAX_GPU_INSTANCE) {
  1334. pdd = kfd_process_device_from_gpuidx(ctx->process, gpuidx);
  1335. if (!pdd) {
  1336. pr_debug("failed to find device idx %d\n", gpuidx);
  1337. r = -EINVAL;
  1338. goto unreserve_out;
  1339. }
  1340. r = amdgpu_vm_validate(pdd->dev->adev,
  1341. drm_priv_to_vm(pdd->drm_priv), NULL,
  1342. svm_range_bo_validate, NULL);
  1343. if (r) {
  1344. pr_debug("failed %d validate pt bos\n", r);
  1345. goto unreserve_out;
  1346. }
  1347. }
  1348. return 0;
  1349. unreserve_out:
  1350. drm_exec_fini(&ctx->exec);
  1351. return r;
  1352. }
  1353. static void svm_range_unreserve_bos(struct svm_validate_context *ctx)
  1354. {
  1355. drm_exec_fini(&ctx->exec);
  1356. }
  1357. static void *kfd_svm_page_owner(struct kfd_process *p, int32_t gpuidx)
  1358. {
  1359. struct kfd_process_device *pdd;
  1360. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  1361. if (!pdd)
  1362. return NULL;
  1363. return SVM_ADEV_PGMAP_OWNER(pdd->dev->adev);
  1364. }
  1365. /*
  1366. * Validation+GPU mapping with concurrent invalidation (MMU notifiers)
  1367. *
  1368. * To prevent concurrent destruction or change of range attributes, the
  1369. * svm_read_lock must be held. The caller must not hold the svm_write_lock
  1370. * because that would block concurrent evictions and lead to deadlocks. To
  1371. * serialize concurrent migrations or validations of the same range, the
  1372. * prange->migrate_mutex must be held.
  1373. *
  1374. * For VRAM ranges, the SVM BO must be allocated and valid (protected by its
  1375. * eviction fence.
  1376. *
  1377. * The following sequence ensures race-free validation and GPU mapping:
  1378. *
  1379. * 1. Reserve page table (and SVM BO if range is in VRAM)
  1380. * 2. hmm_range_fault to get page addresses (if system memory)
  1381. * 3. DMA-map pages (if system memory)
  1382. * 4-a. Take notifier lock
  1383. * 4-b. Check that pages still valid (mmu_interval_read_retry)
  1384. * 4-c. Check that the range was not split or otherwise invalidated
  1385. * 4-d. Update GPU page table
  1386. * 4.e. Release notifier lock
  1387. * 5. Release page table (and SVM BO) reservation
  1388. */
  1389. static int svm_range_validate_and_map(struct mm_struct *mm,
  1390. unsigned long map_start, unsigned long map_last,
  1391. struct svm_range *prange, int32_t gpuidx,
  1392. bool intr, bool wait, bool flush_tlb)
  1393. {
  1394. struct svm_validate_context *ctx;
  1395. unsigned long start, end, addr;
  1396. struct kfd_process *p;
  1397. void *owner;
  1398. int32_t idx;
  1399. int r = 0;
  1400. ctx = kzalloc(sizeof(struct svm_validate_context), GFP_KERNEL);
  1401. if (!ctx)
  1402. return -ENOMEM;
  1403. ctx->process = container_of(prange->svms, struct kfd_process, svms);
  1404. ctx->prange = prange;
  1405. ctx->intr = intr;
  1406. if (gpuidx < MAX_GPU_INSTANCE) {
  1407. bitmap_zero(ctx->bitmap, MAX_GPU_INSTANCE);
  1408. bitmap_set(ctx->bitmap, gpuidx, 1);
  1409. } else if (ctx->process->xnack_enabled) {
  1410. bitmap_copy(ctx->bitmap, prange->bitmap_aip, MAX_GPU_INSTANCE);
  1411. /* If prefetch range to GPU, or GPU retry fault migrate range to
  1412. * GPU, which has ACCESS attribute to the range, create mapping
  1413. * on that GPU.
  1414. */
  1415. if (prange->actual_loc) {
  1416. gpuidx = kfd_process_gpuidx_from_gpuid(ctx->process,
  1417. prange->actual_loc);
  1418. if (gpuidx < 0) {
  1419. WARN_ONCE(1, "failed get device by id 0x%x\n",
  1420. prange->actual_loc);
  1421. r = -EINVAL;
  1422. goto free_ctx;
  1423. }
  1424. if (test_bit(gpuidx, prange->bitmap_access))
  1425. bitmap_set(ctx->bitmap, gpuidx, 1);
  1426. }
  1427. /*
  1428. * If prange is already mapped or with always mapped flag,
  1429. * update mapping on GPUs with ACCESS attribute
  1430. */
  1431. if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
  1432. if (prange->mapped_to_gpu ||
  1433. prange->flags & KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED)
  1434. bitmap_copy(ctx->bitmap, prange->bitmap_access, MAX_GPU_INSTANCE);
  1435. }
  1436. } else {
  1437. bitmap_or(ctx->bitmap, prange->bitmap_access,
  1438. prange->bitmap_aip, MAX_GPU_INSTANCE);
  1439. }
  1440. if (bitmap_empty(ctx->bitmap, MAX_GPU_INSTANCE)) {
  1441. r = 0;
  1442. goto free_ctx;
  1443. }
  1444. if (prange->actual_loc && !prange->ttm_res) {
  1445. /* This should never happen. actual_loc gets set by
  1446. * svm_migrate_ram_to_vram after allocating a BO.
  1447. */
  1448. WARN_ONCE(1, "VRAM BO missing during validation\n");
  1449. r = -EINVAL;
  1450. goto free_ctx;
  1451. }
  1452. r = svm_range_reserve_bos(ctx, intr);
  1453. if (r)
  1454. goto free_ctx;
  1455. p = container_of(prange->svms, struct kfd_process, svms);
  1456. owner = kfd_svm_page_owner(p, find_first_bit(ctx->bitmap,
  1457. MAX_GPU_INSTANCE));
  1458. for_each_set_bit(idx, ctx->bitmap, MAX_GPU_INSTANCE) {
  1459. if (kfd_svm_page_owner(p, idx) != owner) {
  1460. owner = NULL;
  1461. break;
  1462. }
  1463. }
  1464. start = map_start << PAGE_SHIFT;
  1465. end = (map_last + 1) << PAGE_SHIFT;
  1466. for (addr = start; !r && addr < end; ) {
  1467. struct hmm_range *hmm_range = NULL;
  1468. unsigned long map_start_vma;
  1469. unsigned long map_last_vma;
  1470. struct vm_area_struct *vma;
  1471. unsigned long next = 0;
  1472. unsigned long offset;
  1473. unsigned long npages;
  1474. bool readonly;
  1475. vma = vma_lookup(mm, addr);
  1476. if (vma) {
  1477. readonly = !(vma->vm_flags & VM_WRITE);
  1478. next = min(vma->vm_end, end);
  1479. npages = (next - addr) >> PAGE_SHIFT;
  1480. WRITE_ONCE(p->svms.faulting_task, current);
  1481. r = amdgpu_hmm_range_get_pages(&prange->notifier, addr, npages,
  1482. readonly, owner, NULL,
  1483. &hmm_range);
  1484. WRITE_ONCE(p->svms.faulting_task, NULL);
  1485. if (r)
  1486. pr_debug("failed %d to get svm range pages\n", r);
  1487. } else {
  1488. r = -EFAULT;
  1489. }
  1490. if (!r) {
  1491. offset = (addr >> PAGE_SHIFT) - prange->start;
  1492. r = svm_range_dma_map(prange, ctx->bitmap, offset, npages,
  1493. hmm_range->hmm_pfns);
  1494. if (r)
  1495. pr_debug("failed %d to dma map range\n", r);
  1496. }
  1497. svm_range_lock(prange);
  1498. /* Free backing memory of hmm_range if it was initialized
  1499. * Overrride return value to TRY AGAIN only if prior returns
  1500. * were successful
  1501. */
  1502. if (hmm_range && amdgpu_hmm_range_get_pages_done(hmm_range) && !r) {
  1503. pr_debug("hmm update the range, need validate again\n");
  1504. r = -EAGAIN;
  1505. }
  1506. if (!r && !list_empty(&prange->child_list)) {
  1507. pr_debug("range split by unmap in parallel, validate again\n");
  1508. r = -EAGAIN;
  1509. }
  1510. if (!r) {
  1511. map_start_vma = max(map_start, prange->start + offset);
  1512. map_last_vma = min(map_last, prange->start + offset + npages - 1);
  1513. if (map_start_vma <= map_last_vma) {
  1514. offset = map_start_vma - prange->start;
  1515. npages = map_last_vma - map_start_vma + 1;
  1516. r = svm_range_map_to_gpus(prange, offset, npages, readonly,
  1517. ctx->bitmap, wait, flush_tlb);
  1518. }
  1519. }
  1520. if (!r && next == end)
  1521. prange->mapped_to_gpu = true;
  1522. svm_range_unlock(prange);
  1523. addr = next;
  1524. }
  1525. svm_range_unreserve_bos(ctx);
  1526. if (!r)
  1527. prange->validate_timestamp = ktime_get_boottime();
  1528. free_ctx:
  1529. kfree(ctx);
  1530. return r;
  1531. }
  1532. /**
  1533. * svm_range_list_lock_and_flush_work - flush pending deferred work
  1534. *
  1535. * @svms: the svm range list
  1536. * @mm: the mm structure
  1537. *
  1538. * Context: Returns with mmap write lock held, pending deferred work flushed
  1539. *
  1540. */
  1541. void
  1542. svm_range_list_lock_and_flush_work(struct svm_range_list *svms,
  1543. struct mm_struct *mm)
  1544. {
  1545. retry_flush_work:
  1546. flush_work(&svms->deferred_list_work);
  1547. mmap_write_lock(mm);
  1548. if (list_empty(&svms->deferred_range_list))
  1549. return;
  1550. mmap_write_unlock(mm);
  1551. pr_debug("retry flush\n");
  1552. goto retry_flush_work;
  1553. }
  1554. static void svm_range_restore_work(struct work_struct *work)
  1555. {
  1556. struct delayed_work *dwork = to_delayed_work(work);
  1557. struct amdkfd_process_info *process_info;
  1558. struct svm_range_list *svms;
  1559. struct svm_range *prange;
  1560. struct kfd_process *p;
  1561. struct mm_struct *mm;
  1562. int evicted_ranges;
  1563. int invalid;
  1564. int r;
  1565. svms = container_of(dwork, struct svm_range_list, restore_work);
  1566. evicted_ranges = atomic_read(&svms->evicted_ranges);
  1567. if (!evicted_ranges)
  1568. return;
  1569. pr_debug("restore svm ranges\n");
  1570. p = container_of(svms, struct kfd_process, svms);
  1571. process_info = p->kgd_process_info;
  1572. /* Keep mm reference when svm_range_validate_and_map ranges */
  1573. mm = get_task_mm(p->lead_thread);
  1574. if (!mm) {
  1575. pr_debug("svms 0x%p process mm gone\n", svms);
  1576. return;
  1577. }
  1578. mutex_lock(&process_info->lock);
  1579. svm_range_list_lock_and_flush_work(svms, mm);
  1580. mutex_lock(&svms->lock);
  1581. evicted_ranges = atomic_read(&svms->evicted_ranges);
  1582. list_for_each_entry(prange, &svms->list, list) {
  1583. invalid = atomic_read(&prange->invalid);
  1584. if (!invalid)
  1585. continue;
  1586. pr_debug("restoring svms 0x%p prange 0x%p [0x%lx %lx] inv %d\n",
  1587. prange->svms, prange, prange->start, prange->last,
  1588. invalid);
  1589. /*
  1590. * If range is migrating, wait for migration is done.
  1591. */
  1592. mutex_lock(&prange->migrate_mutex);
  1593. r = svm_range_validate_and_map(mm, prange->start, prange->last, prange,
  1594. MAX_GPU_INSTANCE, false, true, false);
  1595. if (r)
  1596. pr_debug("failed %d to map 0x%lx to gpus\n", r,
  1597. prange->start);
  1598. mutex_unlock(&prange->migrate_mutex);
  1599. if (r)
  1600. goto out_reschedule;
  1601. if (atomic_cmpxchg(&prange->invalid, invalid, 0) != invalid)
  1602. goto out_reschedule;
  1603. }
  1604. if (atomic_cmpxchg(&svms->evicted_ranges, evicted_ranges, 0) !=
  1605. evicted_ranges)
  1606. goto out_reschedule;
  1607. evicted_ranges = 0;
  1608. r = kgd2kfd_resume_mm(mm);
  1609. if (r) {
  1610. /* No recovery from this failure. Probably the CP is
  1611. * hanging. No point trying again.
  1612. */
  1613. pr_debug("failed %d to resume KFD\n", r);
  1614. }
  1615. pr_debug("restore svm ranges successfully\n");
  1616. out_reschedule:
  1617. mutex_unlock(&svms->lock);
  1618. mmap_write_unlock(mm);
  1619. mutex_unlock(&process_info->lock);
  1620. /* If validation failed, reschedule another attempt */
  1621. if (evicted_ranges) {
  1622. pr_debug("reschedule to restore svm range\n");
  1623. queue_delayed_work(system_freezable_wq, &svms->restore_work,
  1624. msecs_to_jiffies(AMDGPU_SVM_RANGE_RESTORE_DELAY_MS));
  1625. kfd_smi_event_queue_restore_rescheduled(mm);
  1626. }
  1627. mmput(mm);
  1628. }
  1629. /**
  1630. * svm_range_evict - evict svm range
  1631. * @prange: svm range structure
  1632. * @mm: current process mm_struct
  1633. * @start: starting process queue number
  1634. * @last: last process queue number
  1635. * @event: mmu notifier event when range is evicted or migrated
  1636. *
  1637. * Stop all queues of the process to ensure GPU doesn't access the memory, then
  1638. * return to let CPU evict the buffer and proceed CPU pagetable update.
  1639. *
  1640. * Don't need use lock to sync cpu pagetable invalidation with GPU execution.
  1641. * If invalidation happens while restore work is running, restore work will
  1642. * restart to ensure to get the latest CPU pages mapping to GPU, then start
  1643. * the queues.
  1644. */
  1645. static int
  1646. svm_range_evict(struct svm_range *prange, struct mm_struct *mm,
  1647. unsigned long start, unsigned long last,
  1648. enum mmu_notifier_event event)
  1649. {
  1650. struct svm_range_list *svms = prange->svms;
  1651. struct svm_range *pchild;
  1652. struct kfd_process *p;
  1653. int r = 0;
  1654. p = container_of(svms, struct kfd_process, svms);
  1655. pr_debug("invalidate svms 0x%p prange [0x%lx 0x%lx] [0x%lx 0x%lx]\n",
  1656. svms, prange->start, prange->last, start, last);
  1657. if (!p->xnack_enabled ||
  1658. (prange->flags & KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED)) {
  1659. int evicted_ranges;
  1660. bool mapped = prange->mapped_to_gpu;
  1661. list_for_each_entry(pchild, &prange->child_list, child_list) {
  1662. if (!pchild->mapped_to_gpu)
  1663. continue;
  1664. mapped = true;
  1665. mutex_lock_nested(&pchild->lock, 1);
  1666. if (pchild->start <= last && pchild->last >= start) {
  1667. pr_debug("increment pchild invalid [0x%lx 0x%lx]\n",
  1668. pchild->start, pchild->last);
  1669. atomic_inc(&pchild->invalid);
  1670. }
  1671. mutex_unlock(&pchild->lock);
  1672. }
  1673. if (!mapped)
  1674. return r;
  1675. if (prange->start <= last && prange->last >= start)
  1676. atomic_inc(&prange->invalid);
  1677. evicted_ranges = atomic_inc_return(&svms->evicted_ranges);
  1678. if (evicted_ranges != 1)
  1679. return r;
  1680. pr_debug("evicting svms 0x%p range [0x%lx 0x%lx]\n",
  1681. prange->svms, prange->start, prange->last);
  1682. /* First eviction, stop the queues */
  1683. r = kgd2kfd_quiesce_mm(mm, KFD_QUEUE_EVICTION_TRIGGER_SVM);
  1684. if (r)
  1685. pr_debug("failed to quiesce KFD\n");
  1686. pr_debug("schedule to restore svm %p ranges\n", svms);
  1687. queue_delayed_work(system_freezable_wq, &svms->restore_work,
  1688. msecs_to_jiffies(AMDGPU_SVM_RANGE_RESTORE_DELAY_MS));
  1689. } else {
  1690. unsigned long s, l;
  1691. uint32_t trigger;
  1692. if (event == MMU_NOTIFY_MIGRATE)
  1693. trigger = KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY_MIGRATE;
  1694. else
  1695. trigger = KFD_SVM_UNMAP_TRIGGER_MMU_NOTIFY;
  1696. pr_debug("invalidate unmap svms 0x%p [0x%lx 0x%lx] from GPUs\n",
  1697. prange->svms, start, last);
  1698. list_for_each_entry(pchild, &prange->child_list, child_list) {
  1699. mutex_lock_nested(&pchild->lock, 1);
  1700. s = max(start, pchild->start);
  1701. l = min(last, pchild->last);
  1702. if (l >= s)
  1703. svm_range_unmap_from_gpus(pchild, s, l, trigger);
  1704. mutex_unlock(&pchild->lock);
  1705. }
  1706. s = max(start, prange->start);
  1707. l = min(last, prange->last);
  1708. if (l >= s)
  1709. svm_range_unmap_from_gpus(prange, s, l, trigger);
  1710. }
  1711. return r;
  1712. }
  1713. static struct svm_range *svm_range_clone(struct svm_range *old)
  1714. {
  1715. struct svm_range *new;
  1716. new = svm_range_new(old->svms, old->start, old->last, false);
  1717. if (!new)
  1718. return NULL;
  1719. if (svm_range_copy_dma_addrs(new, old)) {
  1720. svm_range_free(new, false);
  1721. return NULL;
  1722. }
  1723. if (old->svm_bo) {
  1724. new->ttm_res = old->ttm_res;
  1725. new->offset = old->offset;
  1726. new->svm_bo = svm_range_bo_ref(old->svm_bo);
  1727. spin_lock(&new->svm_bo->list_lock);
  1728. list_add(&new->svm_bo_list, &new->svm_bo->range_list);
  1729. spin_unlock(&new->svm_bo->list_lock);
  1730. }
  1731. new->flags = old->flags;
  1732. new->preferred_loc = old->preferred_loc;
  1733. new->prefetch_loc = old->prefetch_loc;
  1734. new->actual_loc = old->actual_loc;
  1735. new->granularity = old->granularity;
  1736. new->mapped_to_gpu = old->mapped_to_gpu;
  1737. new->vram_pages = old->vram_pages;
  1738. bitmap_copy(new->bitmap_access, old->bitmap_access, MAX_GPU_INSTANCE);
  1739. bitmap_copy(new->bitmap_aip, old->bitmap_aip, MAX_GPU_INSTANCE);
  1740. atomic_set(&new->queue_refcount, atomic_read(&old->queue_refcount));
  1741. return new;
  1742. }
  1743. void svm_range_set_max_pages(struct amdgpu_device *adev)
  1744. {
  1745. uint64_t max_pages;
  1746. uint64_t pages, _pages;
  1747. uint64_t min_pages = 0;
  1748. int i, id;
  1749. for (i = 0; i < adev->kfd.dev->num_nodes; i++) {
  1750. if (adev->kfd.dev->nodes[i]->xcp)
  1751. id = adev->kfd.dev->nodes[i]->xcp->id;
  1752. else
  1753. id = -1;
  1754. pages = KFD_XCP_MEMORY_SIZE(adev, id) >> 17;
  1755. pages = clamp(pages, 1ULL << 9, 1ULL << 18);
  1756. pages = rounddown_pow_of_two(pages);
  1757. min_pages = min_not_zero(min_pages, pages);
  1758. }
  1759. do {
  1760. max_pages = READ_ONCE(max_svm_range_pages);
  1761. _pages = min_not_zero(max_pages, min_pages);
  1762. } while (cmpxchg(&max_svm_range_pages, max_pages, _pages) != max_pages);
  1763. }
  1764. static int
  1765. svm_range_split_new(struct svm_range_list *svms, uint64_t start, uint64_t last,
  1766. uint64_t max_pages, struct list_head *insert_list,
  1767. struct list_head *update_list)
  1768. {
  1769. struct svm_range *prange;
  1770. uint64_t l;
  1771. pr_debug("max_svm_range_pages 0x%llx adding [0x%llx 0x%llx]\n",
  1772. max_pages, start, last);
  1773. while (last >= start) {
  1774. l = min(last, ALIGN_DOWN(start + max_pages, max_pages) - 1);
  1775. prange = svm_range_new(svms, start, l, true);
  1776. if (!prange)
  1777. return -ENOMEM;
  1778. list_add(&prange->list, insert_list);
  1779. list_add(&prange->update_list, update_list);
  1780. start = l + 1;
  1781. }
  1782. return 0;
  1783. }
  1784. /**
  1785. * svm_range_add - add svm range and handle overlap
  1786. * @p: the range add to this process svms
  1787. * @start: page size aligned
  1788. * @size: page size aligned
  1789. * @nattr: number of attributes
  1790. * @attrs: array of attributes
  1791. * @update_list: output, the ranges need validate and update GPU mapping
  1792. * @insert_list: output, the ranges need insert to svms
  1793. * @remove_list: output, the ranges are replaced and need remove from svms
  1794. * @remap_list: output, remap unaligned svm ranges
  1795. *
  1796. * Check if the virtual address range has overlap with any existing ranges,
  1797. * split partly overlapping ranges and add new ranges in the gaps. All changes
  1798. * should be applied to the range_list and interval tree transactionally. If
  1799. * any range split or allocation fails, the entire update fails. Therefore any
  1800. * existing overlapping svm_ranges are cloned and the original svm_ranges left
  1801. * unchanged.
  1802. *
  1803. * If the transaction succeeds, the caller can update and insert clones and
  1804. * new ranges, then free the originals.
  1805. *
  1806. * Otherwise the caller can free the clones and new ranges, while the old
  1807. * svm_ranges remain unchanged.
  1808. *
  1809. * Context: Process context, caller must hold svms->lock
  1810. *
  1811. * Return:
  1812. * 0 - OK, otherwise error code
  1813. */
  1814. static int
  1815. svm_range_add(struct kfd_process *p, uint64_t start, uint64_t size,
  1816. uint32_t nattr, struct kfd_ioctl_svm_attribute *attrs,
  1817. struct list_head *update_list, struct list_head *insert_list,
  1818. struct list_head *remove_list, struct list_head *remap_list)
  1819. {
  1820. unsigned long last = start + size - 1UL;
  1821. struct svm_range_list *svms = &p->svms;
  1822. struct interval_tree_node *node;
  1823. struct svm_range *prange;
  1824. struct svm_range *tmp;
  1825. struct list_head new_list;
  1826. int r = 0;
  1827. pr_debug("svms 0x%p [0x%llx 0x%lx]\n", &p->svms, start, last);
  1828. INIT_LIST_HEAD(update_list);
  1829. INIT_LIST_HEAD(insert_list);
  1830. INIT_LIST_HEAD(remove_list);
  1831. INIT_LIST_HEAD(&new_list);
  1832. INIT_LIST_HEAD(remap_list);
  1833. node = interval_tree_iter_first(&svms->objects, start, last);
  1834. while (node) {
  1835. struct interval_tree_node *next;
  1836. unsigned long next_start;
  1837. pr_debug("found overlap node [0x%lx 0x%lx]\n", node->start,
  1838. node->last);
  1839. prange = container_of(node, struct svm_range, it_node);
  1840. next = interval_tree_iter_next(node, start, last);
  1841. next_start = min(node->last, last) + 1;
  1842. if (svm_range_is_same_attrs(p, prange, nattr, attrs) &&
  1843. prange->mapped_to_gpu) {
  1844. /* nothing to do */
  1845. } else if (node->start < start || node->last > last) {
  1846. /* node intersects the update range and its attributes
  1847. * will change. Clone and split it, apply updates only
  1848. * to the overlapping part
  1849. */
  1850. struct svm_range *old = prange;
  1851. prange = svm_range_clone(old);
  1852. if (!prange) {
  1853. r = -ENOMEM;
  1854. goto out;
  1855. }
  1856. list_add(&old->update_list, remove_list);
  1857. list_add(&prange->list, insert_list);
  1858. list_add(&prange->update_list, update_list);
  1859. if (node->start < start) {
  1860. pr_debug("change old range start\n");
  1861. r = svm_range_split_head(prange, start,
  1862. insert_list, remap_list);
  1863. if (r)
  1864. goto out;
  1865. }
  1866. if (node->last > last) {
  1867. pr_debug("change old range last\n");
  1868. r = svm_range_split_tail(prange, last,
  1869. insert_list, remap_list);
  1870. if (r)
  1871. goto out;
  1872. }
  1873. } else {
  1874. /* The node is contained within start..last,
  1875. * just update it
  1876. */
  1877. list_add(&prange->update_list, update_list);
  1878. }
  1879. /* insert a new node if needed */
  1880. if (node->start > start) {
  1881. r = svm_range_split_new(svms, start, node->start - 1,
  1882. READ_ONCE(max_svm_range_pages),
  1883. &new_list, update_list);
  1884. if (r)
  1885. goto out;
  1886. }
  1887. node = next;
  1888. start = next_start;
  1889. }
  1890. /* add a final range at the end if needed */
  1891. if (start <= last)
  1892. r = svm_range_split_new(svms, start, last,
  1893. READ_ONCE(max_svm_range_pages),
  1894. &new_list, update_list);
  1895. out:
  1896. if (r) {
  1897. list_for_each_entry_safe(prange, tmp, insert_list, list)
  1898. svm_range_free(prange, false);
  1899. list_for_each_entry_safe(prange, tmp, &new_list, list)
  1900. svm_range_free(prange, true);
  1901. } else {
  1902. list_splice(&new_list, insert_list);
  1903. }
  1904. return r;
  1905. }
  1906. static void
  1907. svm_range_update_notifier_and_interval_tree(struct mm_struct *mm,
  1908. struct svm_range *prange)
  1909. {
  1910. unsigned long start;
  1911. unsigned long last;
  1912. start = prange->notifier.interval_tree.start >> PAGE_SHIFT;
  1913. last = prange->notifier.interval_tree.last >> PAGE_SHIFT;
  1914. if (prange->start == start && prange->last == last)
  1915. return;
  1916. pr_debug("up notifier 0x%p prange 0x%p [0x%lx 0x%lx] [0x%lx 0x%lx]\n",
  1917. prange->svms, prange, start, last, prange->start,
  1918. prange->last);
  1919. if (start != 0 && last != 0) {
  1920. interval_tree_remove(&prange->it_node, &prange->svms->objects);
  1921. svm_range_remove_notifier(prange);
  1922. }
  1923. prange->it_node.start = prange->start;
  1924. prange->it_node.last = prange->last;
  1925. interval_tree_insert(&prange->it_node, &prange->svms->objects);
  1926. svm_range_add_notifier_locked(mm, prange);
  1927. }
  1928. static void
  1929. svm_range_handle_list_op(struct svm_range_list *svms, struct svm_range *prange,
  1930. struct mm_struct *mm)
  1931. {
  1932. switch (prange->work_item.op) {
  1933. case SVM_OP_NULL:
  1934. pr_debug("NULL OP 0x%p prange 0x%p [0x%lx 0x%lx]\n",
  1935. svms, prange, prange->start, prange->last);
  1936. break;
  1937. case SVM_OP_UNMAP_RANGE:
  1938. pr_debug("remove 0x%p prange 0x%p [0x%lx 0x%lx]\n",
  1939. svms, prange, prange->start, prange->last);
  1940. svm_range_unlink(prange);
  1941. svm_range_remove_notifier(prange);
  1942. svm_range_free(prange, true);
  1943. break;
  1944. case SVM_OP_UPDATE_RANGE_NOTIFIER:
  1945. pr_debug("update notifier 0x%p prange 0x%p [0x%lx 0x%lx]\n",
  1946. svms, prange, prange->start, prange->last);
  1947. svm_range_update_notifier_and_interval_tree(mm, prange);
  1948. break;
  1949. case SVM_OP_UPDATE_RANGE_NOTIFIER_AND_MAP:
  1950. pr_debug("update and map 0x%p prange 0x%p [0x%lx 0x%lx]\n",
  1951. svms, prange, prange->start, prange->last);
  1952. svm_range_update_notifier_and_interval_tree(mm, prange);
  1953. /* TODO: implement deferred validation and mapping */
  1954. break;
  1955. case SVM_OP_ADD_RANGE:
  1956. pr_debug("add 0x%p prange 0x%p [0x%lx 0x%lx]\n", svms, prange,
  1957. prange->start, prange->last);
  1958. svm_range_add_to_svms(prange);
  1959. svm_range_add_notifier_locked(mm, prange);
  1960. break;
  1961. case SVM_OP_ADD_RANGE_AND_MAP:
  1962. pr_debug("add and map 0x%p prange 0x%p [0x%lx 0x%lx]\n", svms,
  1963. prange, prange->start, prange->last);
  1964. svm_range_add_to_svms(prange);
  1965. svm_range_add_notifier_locked(mm, prange);
  1966. /* TODO: implement deferred validation and mapping */
  1967. break;
  1968. default:
  1969. WARN_ONCE(1, "Unknown prange 0x%p work op %d\n", prange,
  1970. prange->work_item.op);
  1971. }
  1972. }
  1973. static void svm_range_drain_retry_fault(struct svm_range_list *svms)
  1974. {
  1975. struct kfd_process_device *pdd;
  1976. struct kfd_process *p;
  1977. uint32_t i;
  1978. p = container_of(svms, struct kfd_process, svms);
  1979. for_each_set_bit(i, svms->bitmap_supported, p->n_pdds) {
  1980. pdd = p->pdds[i];
  1981. if (!pdd)
  1982. continue;
  1983. pr_debug("drain retry fault gpu %d svms %p\n", i, svms);
  1984. amdgpu_ih_wait_on_checkpoint_process_ts(pdd->dev->adev,
  1985. pdd->dev->adev->irq.retry_cam_enabled ?
  1986. &pdd->dev->adev->irq.ih :
  1987. &pdd->dev->adev->irq.ih1);
  1988. if (pdd->dev->adev->irq.retry_cam_enabled)
  1989. amdgpu_ih_wait_on_checkpoint_process_ts(pdd->dev->adev,
  1990. &pdd->dev->adev->irq.ih_soft);
  1991. pr_debug("drain retry fault gpu %d svms 0x%p done\n", i, svms);
  1992. }
  1993. }
  1994. static void svm_range_deferred_list_work(struct work_struct *work)
  1995. {
  1996. struct svm_range_list *svms;
  1997. struct svm_range *prange;
  1998. struct mm_struct *mm;
  1999. svms = container_of(work, struct svm_range_list, deferred_list_work);
  2000. pr_debug("enter svms 0x%p\n", svms);
  2001. spin_lock(&svms->deferred_list_lock);
  2002. while (!list_empty(&svms->deferred_range_list)) {
  2003. prange = list_first_entry(&svms->deferred_range_list,
  2004. struct svm_range, deferred_list);
  2005. spin_unlock(&svms->deferred_list_lock);
  2006. pr_debug("prange 0x%p [0x%lx 0x%lx] op %d\n", prange,
  2007. prange->start, prange->last, prange->work_item.op);
  2008. mm = prange->work_item.mm;
  2009. mmap_write_lock(mm);
  2010. /* Remove from deferred_list must be inside mmap write lock, for
  2011. * two race cases:
  2012. * 1. unmap_from_cpu may change work_item.op and add the range
  2013. * to deferred_list again, cause use after free bug.
  2014. * 2. svm_range_list_lock_and_flush_work may hold mmap write
  2015. * lock and continue because deferred_list is empty, but
  2016. * deferred_list work is actually waiting for mmap lock.
  2017. */
  2018. spin_lock(&svms->deferred_list_lock);
  2019. list_del_init(&prange->deferred_list);
  2020. spin_unlock(&svms->deferred_list_lock);
  2021. mutex_lock(&svms->lock);
  2022. mutex_lock(&prange->migrate_mutex);
  2023. while (!list_empty(&prange->child_list)) {
  2024. struct svm_range *pchild;
  2025. pchild = list_first_entry(&prange->child_list,
  2026. struct svm_range, child_list);
  2027. pr_debug("child prange 0x%p op %d\n", pchild,
  2028. pchild->work_item.op);
  2029. list_del_init(&pchild->child_list);
  2030. svm_range_handle_list_op(svms, pchild, mm);
  2031. }
  2032. mutex_unlock(&prange->migrate_mutex);
  2033. svm_range_handle_list_op(svms, prange, mm);
  2034. mutex_unlock(&svms->lock);
  2035. mmap_write_unlock(mm);
  2036. /* Pairs with mmget in svm_range_add_list_work. If dropping the
  2037. * last mm refcount, schedule release work to avoid circular locking
  2038. */
  2039. mmput_async(mm);
  2040. spin_lock(&svms->deferred_list_lock);
  2041. }
  2042. spin_unlock(&svms->deferred_list_lock);
  2043. pr_debug("exit svms 0x%p\n", svms);
  2044. }
  2045. void
  2046. svm_range_add_list_work(struct svm_range_list *svms, struct svm_range *prange,
  2047. struct mm_struct *mm, enum svm_work_list_ops op)
  2048. {
  2049. spin_lock(&svms->deferred_list_lock);
  2050. /* if prange is on the deferred list */
  2051. if (!list_empty(&prange->deferred_list)) {
  2052. pr_debug("update exist prange 0x%p work op %d\n", prange, op);
  2053. WARN_ONCE(prange->work_item.mm != mm, "unmatch mm\n");
  2054. if (op != SVM_OP_NULL &&
  2055. prange->work_item.op != SVM_OP_UNMAP_RANGE)
  2056. prange->work_item.op = op;
  2057. } else {
  2058. /* Pairs with mmput in deferred_list_work.
  2059. * If process is exiting and mm is gone, don't update mmu notifier.
  2060. */
  2061. if (mmget_not_zero(mm)) {
  2062. prange->work_item.mm = mm;
  2063. prange->work_item.op = op;
  2064. list_add_tail(&prange->deferred_list,
  2065. &prange->svms->deferred_range_list);
  2066. pr_debug("add prange 0x%p [0x%lx 0x%lx] to work list op %d\n",
  2067. prange, prange->start, prange->last, op);
  2068. }
  2069. }
  2070. spin_unlock(&svms->deferred_list_lock);
  2071. }
  2072. void schedule_deferred_list_work(struct svm_range_list *svms)
  2073. {
  2074. spin_lock(&svms->deferred_list_lock);
  2075. if (!list_empty(&svms->deferred_range_list))
  2076. schedule_work(&svms->deferred_list_work);
  2077. spin_unlock(&svms->deferred_list_lock);
  2078. }
  2079. static void
  2080. svm_range_unmap_split(struct svm_range *parent, struct svm_range *prange, unsigned long start,
  2081. unsigned long last)
  2082. {
  2083. struct svm_range *head;
  2084. struct svm_range *tail;
  2085. if (prange->work_item.op == SVM_OP_UNMAP_RANGE) {
  2086. pr_debug("prange 0x%p [0x%lx 0x%lx] is already freed\n", prange,
  2087. prange->start, prange->last);
  2088. return;
  2089. }
  2090. if (start > prange->last || last < prange->start)
  2091. return;
  2092. head = tail = prange;
  2093. if (start > prange->start)
  2094. svm_range_split(prange, prange->start, start - 1, &tail);
  2095. if (last < tail->last)
  2096. svm_range_split(tail, last + 1, tail->last, &head);
  2097. if (head != prange && tail != prange) {
  2098. svm_range_add_child(parent, head, SVM_OP_UNMAP_RANGE);
  2099. svm_range_add_child(parent, tail, SVM_OP_ADD_RANGE);
  2100. } else if (tail != prange) {
  2101. svm_range_add_child(parent, tail, SVM_OP_UNMAP_RANGE);
  2102. } else if (head != prange) {
  2103. svm_range_add_child(parent, head, SVM_OP_UNMAP_RANGE);
  2104. } else if (parent != prange) {
  2105. prange->work_item.op = SVM_OP_UNMAP_RANGE;
  2106. }
  2107. }
  2108. static void
  2109. svm_range_unmap_from_cpu(struct mm_struct *mm, struct svm_range *prange,
  2110. unsigned long start, unsigned long last)
  2111. {
  2112. uint32_t trigger = KFD_SVM_UNMAP_TRIGGER_UNMAP_FROM_CPU;
  2113. struct svm_range_list *svms;
  2114. struct svm_range *pchild;
  2115. struct kfd_process *p;
  2116. unsigned long s, l;
  2117. bool unmap_parent;
  2118. uint32_t i;
  2119. if (atomic_read(&prange->queue_refcount)) {
  2120. int r;
  2121. pr_warn("Freeing queue vital buffer 0x%lx, queue evicted\n",
  2122. prange->start << PAGE_SHIFT);
  2123. r = kgd2kfd_quiesce_mm(mm, KFD_QUEUE_EVICTION_TRIGGER_SVM);
  2124. if (r)
  2125. pr_debug("failed %d to quiesce KFD queues\n", r);
  2126. }
  2127. p = kfd_lookup_process_by_mm(mm);
  2128. if (!p)
  2129. return;
  2130. svms = &p->svms;
  2131. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx] [0x%lx 0x%lx]\n", svms,
  2132. prange, prange->start, prange->last, start, last);
  2133. /* calculate time stamps that are used to decide which page faults need be
  2134. * dropped or handled before unmap pages from gpu vm
  2135. */
  2136. for_each_set_bit(i, svms->bitmap_supported, p->n_pdds) {
  2137. struct kfd_process_device *pdd;
  2138. struct amdgpu_device *adev;
  2139. struct amdgpu_ih_ring *ih;
  2140. uint32_t checkpoint_wptr;
  2141. pdd = p->pdds[i];
  2142. if (!pdd)
  2143. continue;
  2144. adev = pdd->dev->adev;
  2145. /* Check and drain ih1 ring if cam not available */
  2146. if (adev->irq.ih1.ring_size) {
  2147. ih = &adev->irq.ih1;
  2148. checkpoint_wptr = amdgpu_ih_get_wptr(adev, ih);
  2149. if (ih->rptr != checkpoint_wptr) {
  2150. svms->checkpoint_ts[i] =
  2151. amdgpu_ih_decode_iv_ts(adev, ih, checkpoint_wptr, -1);
  2152. continue;
  2153. }
  2154. }
  2155. /* check if dev->irq.ih_soft is not empty */
  2156. ih = &adev->irq.ih_soft;
  2157. checkpoint_wptr = amdgpu_ih_get_wptr(adev, ih);
  2158. if (ih->rptr != checkpoint_wptr)
  2159. svms->checkpoint_ts[i] = amdgpu_ih_decode_iv_ts(adev, ih, checkpoint_wptr, -1);
  2160. }
  2161. unmap_parent = start <= prange->start && last >= prange->last;
  2162. list_for_each_entry(pchild, &prange->child_list, child_list) {
  2163. mutex_lock_nested(&pchild->lock, 1);
  2164. s = max(start, pchild->start);
  2165. l = min(last, pchild->last);
  2166. if (l >= s)
  2167. svm_range_unmap_from_gpus(pchild, s, l, trigger);
  2168. svm_range_unmap_split(prange, pchild, start, last);
  2169. mutex_unlock(&pchild->lock);
  2170. }
  2171. s = max(start, prange->start);
  2172. l = min(last, prange->last);
  2173. if (l >= s)
  2174. svm_range_unmap_from_gpus(prange, s, l, trigger);
  2175. svm_range_unmap_split(prange, prange, start, last);
  2176. if (unmap_parent)
  2177. svm_range_add_list_work(svms, prange, mm, SVM_OP_UNMAP_RANGE);
  2178. else
  2179. svm_range_add_list_work(svms, prange, mm,
  2180. SVM_OP_UPDATE_RANGE_NOTIFIER);
  2181. schedule_deferred_list_work(svms);
  2182. kfd_unref_process(p);
  2183. }
  2184. /**
  2185. * svm_range_cpu_invalidate_pagetables - interval notifier callback
  2186. * @mni: mmu_interval_notifier struct
  2187. * @range: mmu_notifier_range struct
  2188. * @cur_seq: value to pass to mmu_interval_set_seq()
  2189. *
  2190. * If event is MMU_NOTIFY_UNMAP, this is from CPU unmap range, otherwise, it
  2191. * is from migration, or CPU page invalidation callback.
  2192. *
  2193. * For unmap event, unmap range from GPUs, remove prange from svms in a delayed
  2194. * work thread, and split prange if only part of prange is unmapped.
  2195. *
  2196. * For invalidation event, if GPU retry fault is not enabled, evict the queues,
  2197. * then schedule svm_range_restore_work to update GPU mapping and resume queues.
  2198. * If GPU retry fault is enabled, unmap the svm range from GPU, retry fault will
  2199. * update GPU mapping to recover.
  2200. *
  2201. * Context: mmap lock, notifier_invalidate_start lock are held
  2202. * for invalidate event, prange lock is held if this is from migration
  2203. */
  2204. static bool
  2205. svm_range_cpu_invalidate_pagetables(struct mmu_interval_notifier *mni,
  2206. const struct mmu_notifier_range *range,
  2207. unsigned long cur_seq)
  2208. {
  2209. struct svm_range *prange;
  2210. unsigned long start;
  2211. unsigned long last;
  2212. if (range->event == MMU_NOTIFY_RELEASE)
  2213. return true;
  2214. start = mni->interval_tree.start;
  2215. last = mni->interval_tree.last;
  2216. start = max(start, range->start) >> PAGE_SHIFT;
  2217. last = min(last, range->end - 1) >> PAGE_SHIFT;
  2218. pr_debug("[0x%lx 0x%lx] range[0x%lx 0x%lx] notifier[0x%lx 0x%lx] %d\n",
  2219. start, last, range->start >> PAGE_SHIFT,
  2220. (range->end - 1) >> PAGE_SHIFT,
  2221. mni->interval_tree.start >> PAGE_SHIFT,
  2222. mni->interval_tree.last >> PAGE_SHIFT, range->event);
  2223. prange = container_of(mni, struct svm_range, notifier);
  2224. svm_range_lock(prange);
  2225. mmu_interval_set_seq(mni, cur_seq);
  2226. switch (range->event) {
  2227. case MMU_NOTIFY_UNMAP:
  2228. svm_range_unmap_from_cpu(mni->mm, prange, start, last);
  2229. break;
  2230. default:
  2231. svm_range_evict(prange, mni->mm, start, last, range->event);
  2232. break;
  2233. }
  2234. svm_range_unlock(prange);
  2235. return true;
  2236. }
  2237. /**
  2238. * svm_range_from_addr - find svm range from fault address
  2239. * @svms: svm range list header
  2240. * @addr: address to search range interval tree, in pages
  2241. * @parent: parent range if range is on child list
  2242. *
  2243. * Context: The caller must hold svms->lock
  2244. *
  2245. * Return: the svm_range found or NULL
  2246. */
  2247. struct svm_range *
  2248. svm_range_from_addr(struct svm_range_list *svms, unsigned long addr,
  2249. struct svm_range **parent)
  2250. {
  2251. struct interval_tree_node *node;
  2252. struct svm_range *prange;
  2253. struct svm_range *pchild;
  2254. node = interval_tree_iter_first(&svms->objects, addr, addr);
  2255. if (!node)
  2256. return NULL;
  2257. prange = container_of(node, struct svm_range, it_node);
  2258. pr_debug("address 0x%lx prange [0x%lx 0x%lx] node [0x%lx 0x%lx]\n",
  2259. addr, prange->start, prange->last, node->start, node->last);
  2260. if (addr >= prange->start && addr <= prange->last) {
  2261. if (parent)
  2262. *parent = prange;
  2263. return prange;
  2264. }
  2265. list_for_each_entry(pchild, &prange->child_list, child_list)
  2266. if (addr >= pchild->start && addr <= pchild->last) {
  2267. pr_debug("found address 0x%lx pchild [0x%lx 0x%lx]\n",
  2268. addr, pchild->start, pchild->last);
  2269. if (parent)
  2270. *parent = prange;
  2271. return pchild;
  2272. }
  2273. return NULL;
  2274. }
  2275. /* svm_range_best_restore_location - decide the best fault restore location
  2276. * @prange: svm range structure
  2277. * @adev: the GPU on which vm fault happened
  2278. *
  2279. * This is only called when xnack is on, to decide the best location to restore
  2280. * the range mapping after GPU vm fault. Caller uses the best location to do
  2281. * migration if actual loc is not best location, then update GPU page table
  2282. * mapping to the best location.
  2283. *
  2284. * If the preferred loc is accessible by faulting GPU, use preferred loc.
  2285. * If vm fault gpu idx is on range ACCESSIBLE bitmap, best_loc is vm fault gpu
  2286. * If vm fault gpu idx is on range ACCESSIBLE_IN_PLACE bitmap, then
  2287. * if range actual loc is cpu, best_loc is cpu
  2288. * if vm fault gpu is on xgmi same hive of range actual loc gpu, best_loc is
  2289. * range actual loc.
  2290. * Otherwise, GPU no access, best_loc is -1.
  2291. *
  2292. * Return:
  2293. * -1 means vm fault GPU no access
  2294. * 0 for CPU or GPU id
  2295. */
  2296. static int32_t
  2297. svm_range_best_restore_location(struct svm_range *prange,
  2298. struct kfd_node *node,
  2299. int32_t *gpuidx)
  2300. {
  2301. struct kfd_node *bo_node, *preferred_node;
  2302. struct kfd_process *p;
  2303. uint32_t gpuid;
  2304. int r;
  2305. p = container_of(prange->svms, struct kfd_process, svms);
  2306. r = kfd_process_gpuid_from_node(p, node, &gpuid, gpuidx);
  2307. if (r < 0) {
  2308. pr_debug("failed to get gpuid from kgd\n");
  2309. return -1;
  2310. }
  2311. if (node->adev->flags & AMD_IS_APU)
  2312. return 0;
  2313. if (prange->preferred_loc == gpuid ||
  2314. prange->preferred_loc == KFD_IOCTL_SVM_LOCATION_SYSMEM) {
  2315. return prange->preferred_loc;
  2316. } else if (prange->preferred_loc != KFD_IOCTL_SVM_LOCATION_UNDEFINED) {
  2317. preferred_node = svm_range_get_node_by_id(prange, prange->preferred_loc);
  2318. if (preferred_node && svm_nodes_in_same_hive(node, preferred_node))
  2319. return prange->preferred_loc;
  2320. /* fall through */
  2321. }
  2322. if (test_bit(*gpuidx, prange->bitmap_access))
  2323. return gpuid;
  2324. if (test_bit(*gpuidx, prange->bitmap_aip)) {
  2325. if (!prange->actual_loc)
  2326. return 0;
  2327. bo_node = svm_range_get_node_by_id(prange, prange->actual_loc);
  2328. if (bo_node && svm_nodes_in_same_hive(node, bo_node))
  2329. return prange->actual_loc;
  2330. else
  2331. return 0;
  2332. }
  2333. return -1;
  2334. }
  2335. static int
  2336. svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,
  2337. unsigned long *start, unsigned long *last,
  2338. bool *is_heap_stack)
  2339. {
  2340. struct vm_area_struct *vma;
  2341. struct interval_tree_node *node;
  2342. struct rb_node *rb_node;
  2343. unsigned long start_limit, end_limit;
  2344. vma = vma_lookup(p->mm, addr << PAGE_SHIFT);
  2345. if (!vma) {
  2346. pr_debug("VMA does not exist in address [0x%llx]\n", addr);
  2347. return -EFAULT;
  2348. }
  2349. *is_heap_stack = vma_is_initial_heap(vma) || vma_is_initial_stack(vma);
  2350. start_limit = max(vma->vm_start >> PAGE_SHIFT,
  2351. (unsigned long)ALIGN_DOWN(addr, 1UL << p->svms.default_granularity));
  2352. end_limit = min(vma->vm_end >> PAGE_SHIFT,
  2353. (unsigned long)ALIGN(addr + 1, 1UL << p->svms.default_granularity));
  2354. /* First range that starts after the fault address */
  2355. node = interval_tree_iter_first(&p->svms.objects, addr + 1, ULONG_MAX);
  2356. if (node) {
  2357. end_limit = min(end_limit, node->start);
  2358. /* Last range that ends before the fault address */
  2359. rb_node = rb_prev(&node->rb);
  2360. } else {
  2361. /* Last range must end before addr because
  2362. * there was no range after addr
  2363. */
  2364. rb_node = rb_last(&p->svms.objects.rb_root);
  2365. }
  2366. if (rb_node) {
  2367. node = container_of(rb_node, struct interval_tree_node, rb);
  2368. if (node->last >= addr) {
  2369. WARN(1, "Overlap with prev node and page fault addr\n");
  2370. return -EFAULT;
  2371. }
  2372. start_limit = max(start_limit, node->last + 1);
  2373. }
  2374. *start = start_limit;
  2375. *last = end_limit - 1;
  2376. pr_debug("vma [0x%lx 0x%lx] range [0x%lx 0x%lx] is_heap_stack %d\n",
  2377. vma->vm_start >> PAGE_SHIFT, vma->vm_end >> PAGE_SHIFT,
  2378. *start, *last, *is_heap_stack);
  2379. return 0;
  2380. }
  2381. static int
  2382. svm_range_check_vm_userptr(struct kfd_process *p, uint64_t start, uint64_t last,
  2383. uint64_t *bo_s, uint64_t *bo_l)
  2384. {
  2385. struct amdgpu_bo_va_mapping *mapping;
  2386. struct interval_tree_node *node;
  2387. struct amdgpu_bo *bo = NULL;
  2388. unsigned long userptr;
  2389. uint32_t i;
  2390. int r;
  2391. for (i = 0; i < p->n_pdds; i++) {
  2392. struct amdgpu_vm *vm;
  2393. if (!p->pdds[i]->drm_priv)
  2394. continue;
  2395. vm = drm_priv_to_vm(p->pdds[i]->drm_priv);
  2396. r = amdgpu_bo_reserve(vm->root.bo, false);
  2397. if (r)
  2398. return r;
  2399. /* Check userptr by searching entire vm->va interval tree */
  2400. node = interval_tree_iter_first(&vm->va, 0, ~0ULL);
  2401. while (node) {
  2402. mapping = container_of((struct rb_node *)node,
  2403. struct amdgpu_bo_va_mapping, rb);
  2404. bo = mapping->bo_va->base.bo;
  2405. if (!amdgpu_ttm_tt_affect_userptr(bo->tbo.ttm,
  2406. start << PAGE_SHIFT,
  2407. last << PAGE_SHIFT,
  2408. &userptr)) {
  2409. node = interval_tree_iter_next(node, 0, ~0ULL);
  2410. continue;
  2411. }
  2412. pr_debug("[0x%llx 0x%llx] already userptr mapped\n",
  2413. start, last);
  2414. if (bo_s && bo_l) {
  2415. *bo_s = userptr >> PAGE_SHIFT;
  2416. *bo_l = *bo_s + bo->tbo.ttm->num_pages - 1;
  2417. }
  2418. amdgpu_bo_unreserve(vm->root.bo);
  2419. return -EADDRINUSE;
  2420. }
  2421. amdgpu_bo_unreserve(vm->root.bo);
  2422. }
  2423. return 0;
  2424. }
  2425. static struct
  2426. svm_range *svm_range_create_unregistered_range(struct kfd_node *node,
  2427. struct kfd_process *p,
  2428. struct mm_struct *mm,
  2429. int64_t addr)
  2430. {
  2431. struct svm_range *prange = NULL;
  2432. unsigned long start, last;
  2433. uint32_t gpuid, gpuidx;
  2434. bool is_heap_stack;
  2435. uint64_t bo_s = 0;
  2436. uint64_t bo_l = 0;
  2437. int r;
  2438. if (svm_range_get_range_boundaries(p, addr, &start, &last,
  2439. &is_heap_stack))
  2440. return NULL;
  2441. r = svm_range_check_vm(p, start, last, &bo_s, &bo_l);
  2442. if (r != -EADDRINUSE)
  2443. r = svm_range_check_vm_userptr(p, start, last, &bo_s, &bo_l);
  2444. if (r == -EADDRINUSE) {
  2445. if (addr >= bo_s && addr <= bo_l)
  2446. return NULL;
  2447. /* Create one page svm range if 2MB range overlapping */
  2448. start = addr;
  2449. last = addr;
  2450. }
  2451. prange = svm_range_new(&p->svms, start, last, true);
  2452. if (!prange) {
  2453. pr_debug("Failed to create prange in address [0x%llx]\n", addr);
  2454. return NULL;
  2455. }
  2456. if (kfd_process_gpuid_from_node(p, node, &gpuid, &gpuidx)) {
  2457. pr_debug("failed to get gpuid from kgd\n");
  2458. svm_range_free(prange, true);
  2459. return NULL;
  2460. }
  2461. if (is_heap_stack)
  2462. prange->preferred_loc = KFD_IOCTL_SVM_LOCATION_SYSMEM;
  2463. svm_range_add_to_svms(prange);
  2464. svm_range_add_notifier_locked(mm, prange);
  2465. return prange;
  2466. }
  2467. /* svm_range_skip_recover - decide if prange can be recovered
  2468. * @prange: svm range structure
  2469. *
  2470. * GPU vm retry fault handle skip recover the range for cases:
  2471. * 1. prange is on deferred list to be removed after unmap, it is stale fault,
  2472. * deferred list work will drain the stale fault before free the prange.
  2473. * 2. prange is on deferred list to add interval notifier after split, or
  2474. * 3. prange is child range, it is split from parent prange, recover later
  2475. * after interval notifier is added.
  2476. *
  2477. * Return: true to skip recover, false to recover
  2478. */
  2479. static bool svm_range_skip_recover(struct svm_range *prange)
  2480. {
  2481. struct svm_range_list *svms = prange->svms;
  2482. spin_lock(&svms->deferred_list_lock);
  2483. if (list_empty(&prange->deferred_list) &&
  2484. list_empty(&prange->child_list)) {
  2485. spin_unlock(&svms->deferred_list_lock);
  2486. return false;
  2487. }
  2488. spin_unlock(&svms->deferred_list_lock);
  2489. if (prange->work_item.op == SVM_OP_UNMAP_RANGE) {
  2490. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx] unmapped\n",
  2491. svms, prange, prange->start, prange->last);
  2492. return true;
  2493. }
  2494. if (prange->work_item.op == SVM_OP_ADD_RANGE_AND_MAP ||
  2495. prange->work_item.op == SVM_OP_ADD_RANGE) {
  2496. pr_debug("svms 0x%p prange 0x%p [0x%lx 0x%lx] not added yet\n",
  2497. svms, prange, prange->start, prange->last);
  2498. return true;
  2499. }
  2500. return false;
  2501. }
  2502. static void
  2503. svm_range_count_fault(struct kfd_node *node, struct kfd_process *p,
  2504. int32_t gpuidx)
  2505. {
  2506. struct kfd_process_device *pdd;
  2507. /* fault is on different page of same range
  2508. * or fault is skipped to recover later
  2509. * or fault is on invalid virtual address
  2510. */
  2511. if (gpuidx == MAX_GPU_INSTANCE) {
  2512. uint32_t gpuid;
  2513. int r;
  2514. r = kfd_process_gpuid_from_node(p, node, &gpuid, &gpuidx);
  2515. if (r < 0)
  2516. return;
  2517. }
  2518. /* fault is recovered
  2519. * or fault cannot recover because GPU no access on the range
  2520. */
  2521. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  2522. if (pdd)
  2523. WRITE_ONCE(pdd->faults, pdd->faults + 1);
  2524. }
  2525. static bool
  2526. svm_fault_allowed(struct vm_area_struct *vma, bool write_fault)
  2527. {
  2528. unsigned long requested = VM_READ;
  2529. if (write_fault)
  2530. requested |= VM_WRITE;
  2531. pr_debug("requested 0x%lx, vma permission flags 0x%lx\n", requested,
  2532. vma->vm_flags);
  2533. return (vma->vm_flags & requested) == requested;
  2534. }
  2535. int
  2536. svm_range_restore_pages(struct amdgpu_device *adev, unsigned int pasid,
  2537. uint32_t vmid, uint32_t node_id,
  2538. uint64_t addr, uint64_t ts, bool write_fault)
  2539. {
  2540. unsigned long start, last, size;
  2541. struct mm_struct *mm = NULL;
  2542. struct svm_range_list *svms;
  2543. struct svm_range *prange;
  2544. struct kfd_process *p;
  2545. ktime_t timestamp = ktime_get_boottime();
  2546. struct kfd_node *node;
  2547. int32_t best_loc;
  2548. int32_t gpuid, gpuidx = MAX_GPU_INSTANCE;
  2549. bool write_locked = false;
  2550. struct vm_area_struct *vma;
  2551. bool migration = false;
  2552. int r = 0;
  2553. if (!KFD_IS_SVM_API_SUPPORTED(adev)) {
  2554. pr_debug("device does not support SVM\n");
  2555. return -EFAULT;
  2556. }
  2557. p = kfd_lookup_process_by_pasid(pasid);
  2558. if (!p) {
  2559. pr_debug("kfd process not founded pasid 0x%x\n", pasid);
  2560. return 0;
  2561. }
  2562. svms = &p->svms;
  2563. pr_debug("restoring svms 0x%p fault address 0x%llx\n", svms, addr);
  2564. if (atomic_read(&svms->drain_pagefaults)) {
  2565. pr_debug("page fault handling disabled, drop fault 0x%llx\n", addr);
  2566. r = 0;
  2567. goto out;
  2568. }
  2569. node = kfd_node_by_irq_ids(adev, node_id, vmid);
  2570. if (!node) {
  2571. pr_debug("kfd node does not exist node_id: %d, vmid: %d\n", node_id,
  2572. vmid);
  2573. r = -EFAULT;
  2574. goto out;
  2575. }
  2576. if (kfd_process_gpuid_from_node(p, node, &gpuid, &gpuidx)) {
  2577. pr_debug("failed to get gpuid/gpuidex for node_id: %d\n", node_id);
  2578. r = -EFAULT;
  2579. goto out;
  2580. }
  2581. if (!p->xnack_enabled) {
  2582. pr_debug("XNACK not enabled for pasid 0x%x\n", pasid);
  2583. r = -EFAULT;
  2584. goto out;
  2585. }
  2586. /* p->lead_thread is available as kfd_process_wq_release flush the work
  2587. * before releasing task ref.
  2588. */
  2589. mm = get_task_mm(p->lead_thread);
  2590. if (!mm) {
  2591. pr_debug("svms 0x%p failed to get mm\n", svms);
  2592. r = 0;
  2593. goto out;
  2594. }
  2595. mmap_read_lock(mm);
  2596. retry_write_locked:
  2597. mutex_lock(&svms->lock);
  2598. /* check if this page fault time stamp is before svms->checkpoint_ts */
  2599. if (svms->checkpoint_ts[gpuidx] != 0) {
  2600. if (amdgpu_ih_ts_after_or_equal(ts, svms->checkpoint_ts[gpuidx])) {
  2601. pr_debug("draining retry fault, drop fault 0x%llx\n", addr);
  2602. r = -EAGAIN;
  2603. goto out_unlock_svms;
  2604. } else {
  2605. /* ts is after svms->checkpoint_ts now, reset svms->checkpoint_ts
  2606. * to zero to avoid following ts wrap around give wrong comparing
  2607. */
  2608. svms->checkpoint_ts[gpuidx] = 0;
  2609. }
  2610. }
  2611. prange = svm_range_from_addr(svms, addr, NULL);
  2612. if (!prange) {
  2613. pr_debug("failed to find prange svms 0x%p address [0x%llx]\n",
  2614. svms, addr);
  2615. if (!write_locked) {
  2616. /* Need the write lock to create new range with MMU notifier.
  2617. * Also flush pending deferred work to make sure the interval
  2618. * tree is up to date before we add a new range
  2619. */
  2620. mutex_unlock(&svms->lock);
  2621. mmap_read_unlock(mm);
  2622. mmap_write_lock(mm);
  2623. write_locked = true;
  2624. goto retry_write_locked;
  2625. }
  2626. prange = svm_range_create_unregistered_range(node, p, mm, addr);
  2627. if (!prange) {
  2628. pr_debug("failed to create unregistered range svms 0x%p address [0x%llx]\n",
  2629. svms, addr);
  2630. mmap_write_downgrade(mm);
  2631. r = -EFAULT;
  2632. goto out_unlock_svms;
  2633. }
  2634. }
  2635. if (write_locked)
  2636. mmap_write_downgrade(mm);
  2637. mutex_lock(&prange->migrate_mutex);
  2638. if (svm_range_skip_recover(prange)) {
  2639. amdgpu_gmc_filter_faults_remove(node->adev, addr, pasid);
  2640. r = 0;
  2641. goto out_unlock_range;
  2642. }
  2643. /* skip duplicate vm fault on different pages of same range */
  2644. if (ktime_before(timestamp, ktime_add_ns(prange->validate_timestamp,
  2645. AMDGPU_SVM_RANGE_RETRY_FAULT_PENDING))) {
  2646. pr_debug("svms 0x%p [0x%lx %lx] already restored\n",
  2647. svms, prange->start, prange->last);
  2648. r = 0;
  2649. goto out_unlock_range;
  2650. }
  2651. /* __do_munmap removed VMA, return success as we are handling stale
  2652. * retry fault.
  2653. */
  2654. vma = vma_lookup(mm, addr << PAGE_SHIFT);
  2655. if (!vma) {
  2656. pr_debug("address 0x%llx VMA is removed\n", addr);
  2657. r = 0;
  2658. goto out_unlock_range;
  2659. }
  2660. if (!svm_fault_allowed(vma, write_fault)) {
  2661. pr_debug("fault addr 0x%llx no %s permission\n", addr,
  2662. write_fault ? "write" : "read");
  2663. r = -EPERM;
  2664. goto out_unlock_range;
  2665. }
  2666. best_loc = svm_range_best_restore_location(prange, node, &gpuidx);
  2667. if (best_loc == -1) {
  2668. pr_debug("svms %p failed get best restore loc [0x%lx 0x%lx]\n",
  2669. svms, prange->start, prange->last);
  2670. r = -EACCES;
  2671. goto out_unlock_range;
  2672. }
  2673. pr_debug("svms %p [0x%lx 0x%lx] best restore 0x%x, actual loc 0x%x\n",
  2674. svms, prange->start, prange->last, best_loc,
  2675. prange->actual_loc);
  2676. kfd_smi_event_page_fault_start(node, p->lead_thread->pid, addr,
  2677. write_fault, timestamp);
  2678. /* Align migration range start and size to granularity size */
  2679. size = 1UL << prange->granularity;
  2680. start = max_t(unsigned long, ALIGN_DOWN(addr, size), prange->start);
  2681. last = min_t(unsigned long, ALIGN(addr + 1, size) - 1, prange->last);
  2682. if (prange->actual_loc != 0 || best_loc != 0) {
  2683. migration = true;
  2684. if (best_loc) {
  2685. r = svm_migrate_to_vram(prange, best_loc, start, last,
  2686. mm, KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU);
  2687. if (r) {
  2688. pr_debug("svm_migrate_to_vram failed (%d) at %llx, falling back to system memory\n",
  2689. r, addr);
  2690. /* Fallback to system memory if migration to
  2691. * VRAM failed
  2692. */
  2693. if (prange->actual_loc && prange->actual_loc != best_loc)
  2694. r = svm_migrate_vram_to_ram(prange, mm, start, last,
  2695. KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU, NULL);
  2696. else
  2697. r = 0;
  2698. }
  2699. } else {
  2700. r = svm_migrate_vram_to_ram(prange, mm, start, last,
  2701. KFD_MIGRATE_TRIGGER_PAGEFAULT_GPU, NULL);
  2702. }
  2703. if (r) {
  2704. pr_debug("failed %d to migrate svms %p [0x%lx 0x%lx]\n",
  2705. r, svms, start, last);
  2706. goto out_unlock_range;
  2707. }
  2708. }
  2709. r = svm_range_validate_and_map(mm, start, last, prange, gpuidx, false,
  2710. false, false);
  2711. if (r)
  2712. pr_debug("failed %d to map svms 0x%p [0x%lx 0x%lx] to gpus\n",
  2713. r, svms, start, last);
  2714. kfd_smi_event_page_fault_end(node, p->lead_thread->pid, addr,
  2715. migration);
  2716. out_unlock_range:
  2717. mutex_unlock(&prange->migrate_mutex);
  2718. out_unlock_svms:
  2719. mutex_unlock(&svms->lock);
  2720. mmap_read_unlock(mm);
  2721. if (r != -EAGAIN)
  2722. svm_range_count_fault(node, p, gpuidx);
  2723. mmput(mm);
  2724. out:
  2725. kfd_unref_process(p);
  2726. if (r == -EAGAIN) {
  2727. pr_debug("recover vm fault later\n");
  2728. amdgpu_gmc_filter_faults_remove(node->adev, addr, pasid);
  2729. r = 0;
  2730. }
  2731. return r;
  2732. }
  2733. int
  2734. svm_range_switch_xnack_reserve_mem(struct kfd_process *p, bool xnack_enabled)
  2735. {
  2736. struct svm_range *prange, *pchild;
  2737. uint64_t reserved_size = 0;
  2738. uint64_t size;
  2739. int r = 0;
  2740. pr_debug("switching xnack from %d to %d\n", p->xnack_enabled, xnack_enabled);
  2741. mutex_lock(&p->svms.lock);
  2742. list_for_each_entry(prange, &p->svms.list, list) {
  2743. svm_range_lock(prange);
  2744. list_for_each_entry(pchild, &prange->child_list, child_list) {
  2745. size = (pchild->last - pchild->start + 1) << PAGE_SHIFT;
  2746. if (xnack_enabled) {
  2747. amdgpu_amdkfd_unreserve_mem_limit(NULL, size,
  2748. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);
  2749. } else {
  2750. r = amdgpu_amdkfd_reserve_mem_limit(NULL, size,
  2751. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);
  2752. if (r)
  2753. goto out_unlock;
  2754. reserved_size += size;
  2755. }
  2756. }
  2757. size = (prange->last - prange->start + 1) << PAGE_SHIFT;
  2758. if (xnack_enabled) {
  2759. amdgpu_amdkfd_unreserve_mem_limit(NULL, size,
  2760. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);
  2761. } else {
  2762. r = amdgpu_amdkfd_reserve_mem_limit(NULL, size,
  2763. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);
  2764. if (r)
  2765. goto out_unlock;
  2766. reserved_size += size;
  2767. }
  2768. out_unlock:
  2769. svm_range_unlock(prange);
  2770. if (r)
  2771. break;
  2772. }
  2773. if (r)
  2774. amdgpu_amdkfd_unreserve_mem_limit(NULL, reserved_size,
  2775. KFD_IOC_ALLOC_MEM_FLAGS_USERPTR, 0);
  2776. else
  2777. /* Change xnack mode must be inside svms lock, to avoid race with
  2778. * svm_range_deferred_list_work unreserve memory in parallel.
  2779. */
  2780. p->xnack_enabled = xnack_enabled;
  2781. mutex_unlock(&p->svms.lock);
  2782. return r;
  2783. }
  2784. void svm_range_list_fini(struct kfd_process *p)
  2785. {
  2786. struct svm_range *prange;
  2787. struct svm_range *next;
  2788. pr_debug("pasid 0x%x svms 0x%p\n", p->pasid, &p->svms);
  2789. cancel_delayed_work_sync(&p->svms.restore_work);
  2790. /* Ensure list work is finished before process is destroyed */
  2791. flush_work(&p->svms.deferred_list_work);
  2792. /*
  2793. * Ensure no retry fault comes in afterwards, as page fault handler will
  2794. * not find kfd process and take mm lock to recover fault.
  2795. * stop kfd page fault handing, then wait pending page faults got drained
  2796. */
  2797. atomic_set(&p->svms.drain_pagefaults, 1);
  2798. svm_range_drain_retry_fault(&p->svms);
  2799. list_for_each_entry_safe(prange, next, &p->svms.list, list) {
  2800. svm_range_unlink(prange);
  2801. svm_range_remove_notifier(prange);
  2802. svm_range_free(prange, true);
  2803. }
  2804. mutex_destroy(&p->svms.lock);
  2805. pr_debug("pasid 0x%x svms 0x%p done\n", p->pasid, &p->svms);
  2806. }
  2807. int svm_range_list_init(struct kfd_process *p)
  2808. {
  2809. struct svm_range_list *svms = &p->svms;
  2810. int i;
  2811. svms->objects = RB_ROOT_CACHED;
  2812. mutex_init(&svms->lock);
  2813. INIT_LIST_HEAD(&svms->list);
  2814. atomic_set(&svms->evicted_ranges, 0);
  2815. atomic_set(&svms->drain_pagefaults, 0);
  2816. INIT_DELAYED_WORK(&svms->restore_work, svm_range_restore_work);
  2817. INIT_WORK(&svms->deferred_list_work, svm_range_deferred_list_work);
  2818. INIT_LIST_HEAD(&svms->deferred_range_list);
  2819. INIT_LIST_HEAD(&svms->criu_svm_metadata_list);
  2820. spin_lock_init(&svms->deferred_list_lock);
  2821. for (i = 0; i < p->n_pdds; i++)
  2822. if (KFD_IS_SVM_API_SUPPORTED(p->pdds[i]->dev->adev))
  2823. bitmap_set(svms->bitmap_supported, i, 1);
  2824. /* Value of default granularity cannot exceed 0x1B, the
  2825. * number of pages supported by a 4-level paging table
  2826. */
  2827. svms->default_granularity = min_t(u8, amdgpu_svm_default_granularity, 0x1B);
  2828. pr_debug("Default SVM Granularity to use: %d\n", svms->default_granularity);
  2829. return 0;
  2830. }
  2831. /**
  2832. * svm_range_check_vm - check if virtual address range mapped already
  2833. * @p: current kfd_process
  2834. * @start: range start address, in pages
  2835. * @last: range last address, in pages
  2836. * @bo_s: mapping start address in pages if address range already mapped
  2837. * @bo_l: mapping last address in pages if address range already mapped
  2838. *
  2839. * The purpose is to avoid virtual address ranges already allocated by
  2840. * kfd_ioctl_alloc_memory_of_gpu ioctl.
  2841. * It looks for each pdd in the kfd_process.
  2842. *
  2843. * Context: Process context
  2844. *
  2845. * Return 0 - OK, if the range is not mapped.
  2846. * Otherwise error code:
  2847. * -EADDRINUSE - if address is mapped already by kfd_ioctl_alloc_memory_of_gpu
  2848. * -ERESTARTSYS - A wait for the buffer to become unreserved was interrupted by
  2849. * a signal. Release all buffer reservations and return to user-space.
  2850. */
  2851. static int
  2852. svm_range_check_vm(struct kfd_process *p, uint64_t start, uint64_t last,
  2853. uint64_t *bo_s, uint64_t *bo_l)
  2854. {
  2855. struct amdgpu_bo_va_mapping *mapping;
  2856. struct interval_tree_node *node;
  2857. uint32_t i;
  2858. int r;
  2859. for (i = 0; i < p->n_pdds; i++) {
  2860. struct amdgpu_vm *vm;
  2861. if (!p->pdds[i]->drm_priv)
  2862. continue;
  2863. vm = drm_priv_to_vm(p->pdds[i]->drm_priv);
  2864. r = amdgpu_bo_reserve(vm->root.bo, false);
  2865. if (r)
  2866. return r;
  2867. node = interval_tree_iter_first(&vm->va, start, last);
  2868. if (node) {
  2869. pr_debug("range [0x%llx 0x%llx] already TTM mapped\n",
  2870. start, last);
  2871. mapping = container_of((struct rb_node *)node,
  2872. struct amdgpu_bo_va_mapping, rb);
  2873. if (bo_s && bo_l) {
  2874. *bo_s = mapping->start;
  2875. *bo_l = mapping->last;
  2876. }
  2877. amdgpu_bo_unreserve(vm->root.bo);
  2878. return -EADDRINUSE;
  2879. }
  2880. amdgpu_bo_unreserve(vm->root.bo);
  2881. }
  2882. return 0;
  2883. }
  2884. /**
  2885. * svm_range_is_valid - check if virtual address range is valid
  2886. * @p: current kfd_process
  2887. * @start: range start address, in pages
  2888. * @size: range size, in pages
  2889. *
  2890. * Valid virtual address range means it belongs to one or more VMAs
  2891. *
  2892. * Context: Process context
  2893. *
  2894. * Return:
  2895. * 0 - OK, otherwise error code
  2896. */
  2897. static int
  2898. svm_range_is_valid(struct kfd_process *p, uint64_t start, uint64_t size)
  2899. {
  2900. const unsigned long device_vma = VM_IO | VM_PFNMAP | VM_MIXEDMAP;
  2901. struct vm_area_struct *vma;
  2902. unsigned long end;
  2903. unsigned long start_unchg = start;
  2904. start <<= PAGE_SHIFT;
  2905. end = start + (size << PAGE_SHIFT);
  2906. do {
  2907. vma = vma_lookup(p->mm, start);
  2908. if (!vma || (vma->vm_flags & device_vma))
  2909. return -EFAULT;
  2910. start = min(end, vma->vm_end);
  2911. } while (start < end);
  2912. return svm_range_check_vm(p, start_unchg, (end - 1) >> PAGE_SHIFT, NULL,
  2913. NULL);
  2914. }
  2915. /**
  2916. * svm_range_best_prefetch_location - decide the best prefetch location
  2917. * @prange: svm range structure
  2918. *
  2919. * For xnack off:
  2920. * If range map to single GPU, the best prefetch location is prefetch_loc, which
  2921. * can be CPU or GPU.
  2922. *
  2923. * If range is ACCESS or ACCESS_IN_PLACE by mGPUs, only if mGPU connection on
  2924. * XGMI same hive, the best prefetch location is prefetch_loc GPU, othervise
  2925. * the best prefetch location is always CPU, because GPU can not have coherent
  2926. * mapping VRAM of other GPUs even with large-BAR PCIe connection.
  2927. *
  2928. * For xnack on:
  2929. * If range is not ACCESS_IN_PLACE by mGPUs, the best prefetch location is
  2930. * prefetch_loc, other GPU access will generate vm fault and trigger migration.
  2931. *
  2932. * If range is ACCESS_IN_PLACE by mGPUs, only if mGPU connection on XGMI same
  2933. * hive, the best prefetch location is prefetch_loc GPU, otherwise the best
  2934. * prefetch location is always CPU.
  2935. *
  2936. * Context: Process context
  2937. *
  2938. * Return:
  2939. * 0 for CPU or GPU id
  2940. */
  2941. static uint32_t
  2942. svm_range_best_prefetch_location(struct svm_range *prange)
  2943. {
  2944. DECLARE_BITMAP(bitmap, MAX_GPU_INSTANCE);
  2945. uint32_t best_loc = prange->prefetch_loc;
  2946. struct kfd_process_device *pdd;
  2947. struct kfd_node *bo_node;
  2948. struct kfd_process *p;
  2949. uint32_t gpuidx;
  2950. p = container_of(prange->svms, struct kfd_process, svms);
  2951. if (!best_loc || best_loc == KFD_IOCTL_SVM_LOCATION_UNDEFINED)
  2952. goto out;
  2953. bo_node = svm_range_get_node_by_id(prange, best_loc);
  2954. if (!bo_node) {
  2955. WARN_ONCE(1, "failed to get valid kfd node at id%x\n", best_loc);
  2956. best_loc = 0;
  2957. goto out;
  2958. }
  2959. if (bo_node->adev->flags & AMD_IS_APU) {
  2960. best_loc = 0;
  2961. goto out;
  2962. }
  2963. if (p->xnack_enabled)
  2964. bitmap_copy(bitmap, prange->bitmap_aip, MAX_GPU_INSTANCE);
  2965. else
  2966. bitmap_or(bitmap, prange->bitmap_access, prange->bitmap_aip,
  2967. MAX_GPU_INSTANCE);
  2968. for_each_set_bit(gpuidx, bitmap, MAX_GPU_INSTANCE) {
  2969. pdd = kfd_process_device_from_gpuidx(p, gpuidx);
  2970. if (!pdd) {
  2971. pr_debug("failed to get device by idx 0x%x\n", gpuidx);
  2972. continue;
  2973. }
  2974. if (pdd->dev->adev == bo_node->adev)
  2975. continue;
  2976. if (!svm_nodes_in_same_hive(pdd->dev, bo_node)) {
  2977. best_loc = 0;
  2978. break;
  2979. }
  2980. }
  2981. out:
  2982. pr_debug("xnack %d svms 0x%p [0x%lx 0x%lx] best loc 0x%x\n",
  2983. p->xnack_enabled, &p->svms, prange->start, prange->last,
  2984. best_loc);
  2985. return best_loc;
  2986. }
  2987. /* svm_range_trigger_migration - start page migration if prefetch loc changed
  2988. * @mm: current process mm_struct
  2989. * @prange: svm range structure
  2990. * @migrated: output, true if migration is triggered
  2991. *
  2992. * If range perfetch_loc is GPU, actual loc is cpu 0, then migrate the range
  2993. * from ram to vram.
  2994. * If range prefetch_loc is cpu 0, actual loc is GPU, then migrate the range
  2995. * from vram to ram.
  2996. *
  2997. * If GPU vm fault retry is not enabled, migration interact with MMU notifier
  2998. * and restore work:
  2999. * 1. migrate_vma_setup invalidate pages, MMU notifier callback svm_range_evict
  3000. * stops all queues, schedule restore work
  3001. * 2. svm_range_restore_work wait for migration is done by
  3002. * a. svm_range_validate_vram takes prange->migrate_mutex
  3003. * b. svm_range_validate_ram HMM get pages wait for CPU fault handle returns
  3004. * 3. restore work update mappings of GPU, resume all queues.
  3005. *
  3006. * Context: Process context
  3007. *
  3008. * Return:
  3009. * 0 - OK, otherwise - error code of migration
  3010. */
  3011. static int
  3012. svm_range_trigger_migration(struct mm_struct *mm, struct svm_range *prange,
  3013. bool *migrated)
  3014. {
  3015. uint32_t best_loc;
  3016. int r = 0;
  3017. *migrated = false;
  3018. best_loc = svm_range_best_prefetch_location(prange);
  3019. /* when best_loc is a gpu node and same as prange->actual_loc
  3020. * we still need do migration as prange->actual_loc !=0 does
  3021. * not mean all pages in prange are vram. hmm migrate will pick
  3022. * up right pages during migration.
  3023. */
  3024. if ((best_loc == KFD_IOCTL_SVM_LOCATION_UNDEFINED) ||
  3025. (best_loc == 0 && prange->actual_loc == 0))
  3026. return 0;
  3027. if (!best_loc) {
  3028. r = svm_migrate_vram_to_ram(prange, mm, prange->start, prange->last,
  3029. KFD_MIGRATE_TRIGGER_PREFETCH, NULL);
  3030. *migrated = !r;
  3031. return r;
  3032. }
  3033. r = svm_migrate_to_vram(prange, best_loc, prange->start, prange->last,
  3034. mm, KFD_MIGRATE_TRIGGER_PREFETCH);
  3035. *migrated = !r;
  3036. return 0;
  3037. }
  3038. int svm_range_schedule_evict_svm_bo(struct amdgpu_amdkfd_fence *fence)
  3039. {
  3040. /* Dereferencing fence->svm_bo is safe here because the fence hasn't
  3041. * signaled yet and we're under the protection of the fence->lock.
  3042. * After the fence is signaled in svm_range_bo_release, we cannot get
  3043. * here any more.
  3044. *
  3045. * Reference is dropped in svm_range_evict_svm_bo_worker.
  3046. */
  3047. if (svm_bo_ref_unless_zero(fence->svm_bo)) {
  3048. WRITE_ONCE(fence->svm_bo->evicting, 1);
  3049. schedule_work(&fence->svm_bo->eviction_work);
  3050. }
  3051. return 0;
  3052. }
  3053. static void svm_range_evict_svm_bo_worker(struct work_struct *work)
  3054. {
  3055. struct svm_range_bo *svm_bo;
  3056. struct mm_struct *mm;
  3057. int r = 0;
  3058. svm_bo = container_of(work, struct svm_range_bo, eviction_work);
  3059. if (mmget_not_zero(svm_bo->eviction_fence->mm)) {
  3060. mm = svm_bo->eviction_fence->mm;
  3061. } else {
  3062. svm_range_bo_unref(svm_bo);
  3063. return;
  3064. }
  3065. mmap_read_lock(mm);
  3066. spin_lock(&svm_bo->list_lock);
  3067. while (!list_empty(&svm_bo->range_list) && !r) {
  3068. struct svm_range *prange =
  3069. list_first_entry(&svm_bo->range_list,
  3070. struct svm_range, svm_bo_list);
  3071. int retries = 3;
  3072. list_del_init(&prange->svm_bo_list);
  3073. spin_unlock(&svm_bo->list_lock);
  3074. pr_debug("svms 0x%p [0x%lx 0x%lx]\n", prange->svms,
  3075. prange->start, prange->last);
  3076. mutex_lock(&prange->migrate_mutex);
  3077. do {
  3078. /* migrate all vram pages in this prange to sys ram
  3079. * after that prange->actual_loc should be zero
  3080. */
  3081. r = svm_migrate_vram_to_ram(prange, mm,
  3082. prange->start, prange->last,
  3083. KFD_MIGRATE_TRIGGER_TTM_EVICTION, NULL);
  3084. } while (!r && prange->actual_loc && --retries);
  3085. if (!r && prange->actual_loc)
  3086. pr_info_once("Migration failed during eviction");
  3087. if (!prange->actual_loc) {
  3088. mutex_lock(&prange->lock);
  3089. prange->svm_bo = NULL;
  3090. mutex_unlock(&prange->lock);
  3091. }
  3092. mutex_unlock(&prange->migrate_mutex);
  3093. spin_lock(&svm_bo->list_lock);
  3094. }
  3095. spin_unlock(&svm_bo->list_lock);
  3096. mmap_read_unlock(mm);
  3097. mmput(mm);
  3098. dma_fence_signal(&svm_bo->eviction_fence->base);
  3099. /* This is the last reference to svm_bo, after svm_range_vram_node_free
  3100. * has been called in svm_migrate_vram_to_ram
  3101. */
  3102. WARN_ONCE(!r && kref_read(&svm_bo->kref) != 1, "This was not the last reference\n");
  3103. svm_range_bo_unref(svm_bo);
  3104. }
  3105. static int
  3106. svm_range_set_attr(struct kfd_process *p, struct mm_struct *mm,
  3107. uint64_t start, uint64_t size, uint32_t nattr,
  3108. struct kfd_ioctl_svm_attribute *attrs)
  3109. {
  3110. struct amdkfd_process_info *process_info = p->kgd_process_info;
  3111. struct list_head update_list;
  3112. struct list_head insert_list;
  3113. struct list_head remove_list;
  3114. struct list_head remap_list;
  3115. struct svm_range_list *svms;
  3116. struct svm_range *prange;
  3117. struct svm_range *next;
  3118. bool update_mapping = false;
  3119. bool flush_tlb;
  3120. int r, ret = 0;
  3121. pr_debug("pasid 0x%x svms 0x%p [0x%llx 0x%llx] pages 0x%llx\n",
  3122. p->pasid, &p->svms, start, start + size - 1, size);
  3123. r = svm_range_check_attr(p, nattr, attrs);
  3124. if (r)
  3125. return r;
  3126. svms = &p->svms;
  3127. mutex_lock(&process_info->lock);
  3128. svm_range_list_lock_and_flush_work(svms, mm);
  3129. r = svm_range_is_valid(p, start, size);
  3130. if (r) {
  3131. pr_debug("invalid range r=%d\n", r);
  3132. mmap_write_unlock(mm);
  3133. goto out;
  3134. }
  3135. mutex_lock(&svms->lock);
  3136. /* Add new range and split existing ranges as needed */
  3137. r = svm_range_add(p, start, size, nattr, attrs, &update_list,
  3138. &insert_list, &remove_list, &remap_list);
  3139. if (r) {
  3140. mutex_unlock(&svms->lock);
  3141. mmap_write_unlock(mm);
  3142. goto out;
  3143. }
  3144. /* Apply changes as a transaction */
  3145. list_for_each_entry_safe(prange, next, &insert_list, list) {
  3146. svm_range_add_to_svms(prange);
  3147. svm_range_add_notifier_locked(mm, prange);
  3148. }
  3149. list_for_each_entry(prange, &update_list, update_list) {
  3150. svm_range_apply_attrs(p, prange, nattr, attrs, &update_mapping);
  3151. /* TODO: unmap ranges from GPU that lost access */
  3152. }
  3153. list_for_each_entry_safe(prange, next, &remove_list, update_list) {
  3154. pr_debug("unlink old 0x%p prange 0x%p [0x%lx 0x%lx]\n",
  3155. prange->svms, prange, prange->start,
  3156. prange->last);
  3157. svm_range_unlink(prange);
  3158. svm_range_remove_notifier(prange);
  3159. svm_range_free(prange, false);
  3160. }
  3161. mmap_write_downgrade(mm);
  3162. /* Trigger migrations and revalidate and map to GPUs as needed. If
  3163. * this fails we may be left with partially completed actions. There
  3164. * is no clean way of rolling back to the previous state in such a
  3165. * case because the rollback wouldn't be guaranteed to work either.
  3166. */
  3167. list_for_each_entry(prange, &update_list, update_list) {
  3168. bool migrated;
  3169. mutex_lock(&prange->migrate_mutex);
  3170. r = svm_range_trigger_migration(mm, prange, &migrated);
  3171. if (r)
  3172. goto out_unlock_range;
  3173. if (migrated && (!p->xnack_enabled ||
  3174. (prange->flags & KFD_IOCTL_SVM_FLAG_GPU_ALWAYS_MAPPED)) &&
  3175. prange->mapped_to_gpu) {
  3176. pr_debug("restore_work will update mappings of GPUs\n");
  3177. mutex_unlock(&prange->migrate_mutex);
  3178. continue;
  3179. }
  3180. if (!migrated && !update_mapping) {
  3181. mutex_unlock(&prange->migrate_mutex);
  3182. continue;
  3183. }
  3184. flush_tlb = !migrated && update_mapping && prange->mapped_to_gpu;
  3185. r = svm_range_validate_and_map(mm, prange->start, prange->last, prange,
  3186. MAX_GPU_INSTANCE, true, true, flush_tlb);
  3187. if (r)
  3188. pr_debug("failed %d to map svm range\n", r);
  3189. out_unlock_range:
  3190. mutex_unlock(&prange->migrate_mutex);
  3191. if (r)
  3192. ret = r;
  3193. }
  3194. list_for_each_entry(prange, &remap_list, update_list) {
  3195. pr_debug("Remapping prange 0x%p [0x%lx 0x%lx]\n",
  3196. prange, prange->start, prange->last);
  3197. mutex_lock(&prange->migrate_mutex);
  3198. r = svm_range_validate_and_map(mm, prange->start, prange->last, prange,
  3199. MAX_GPU_INSTANCE, true, true, prange->mapped_to_gpu);
  3200. if (r)
  3201. pr_debug("failed %d on remap svm range\n", r);
  3202. mutex_unlock(&prange->migrate_mutex);
  3203. if (r)
  3204. ret = r;
  3205. }
  3206. dynamic_svm_range_dump(svms);
  3207. mutex_unlock(&svms->lock);
  3208. mmap_read_unlock(mm);
  3209. out:
  3210. mutex_unlock(&process_info->lock);
  3211. pr_debug("pasid 0x%x svms 0x%p [0x%llx 0x%llx] done, r=%d\n", p->pasid,
  3212. &p->svms, start, start + size - 1, r);
  3213. return ret ? ret : r;
  3214. }
  3215. static int
  3216. svm_range_get_attr(struct kfd_process *p, struct mm_struct *mm,
  3217. uint64_t start, uint64_t size, uint32_t nattr,
  3218. struct kfd_ioctl_svm_attribute *attrs)
  3219. {
  3220. DECLARE_BITMAP(bitmap_access, MAX_GPU_INSTANCE);
  3221. DECLARE_BITMAP(bitmap_aip, MAX_GPU_INSTANCE);
  3222. bool get_preferred_loc = false;
  3223. bool get_prefetch_loc = false;
  3224. bool get_granularity = false;
  3225. bool get_accessible = false;
  3226. bool get_flags = false;
  3227. uint64_t last = start + size - 1UL;
  3228. uint8_t granularity = 0xff;
  3229. struct interval_tree_node *node;
  3230. struct svm_range_list *svms;
  3231. struct svm_range *prange;
  3232. uint32_t prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
  3233. uint32_t location = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
  3234. uint32_t flags_and = 0xffffffff;
  3235. uint32_t flags_or = 0;
  3236. int gpuidx;
  3237. uint32_t i;
  3238. int r = 0;
  3239. pr_debug("svms 0x%p [0x%llx 0x%llx] nattr 0x%x\n", &p->svms, start,
  3240. start + size - 1, nattr);
  3241. /* Flush pending deferred work to avoid racing with deferred actions from
  3242. * previous memory map changes (e.g. munmap). Concurrent memory map changes
  3243. * can still race with get_attr because we don't hold the mmap lock. But that
  3244. * would be a race condition in the application anyway, and undefined
  3245. * behaviour is acceptable in that case.
  3246. */
  3247. flush_work(&p->svms.deferred_list_work);
  3248. mmap_read_lock(mm);
  3249. r = svm_range_is_valid(p, start, size);
  3250. mmap_read_unlock(mm);
  3251. if (r) {
  3252. pr_debug("invalid range r=%d\n", r);
  3253. return r;
  3254. }
  3255. for (i = 0; i < nattr; i++) {
  3256. switch (attrs[i].type) {
  3257. case KFD_IOCTL_SVM_ATTR_PREFERRED_LOC:
  3258. get_preferred_loc = true;
  3259. break;
  3260. case KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:
  3261. get_prefetch_loc = true;
  3262. break;
  3263. case KFD_IOCTL_SVM_ATTR_ACCESS:
  3264. get_accessible = true;
  3265. break;
  3266. case KFD_IOCTL_SVM_ATTR_SET_FLAGS:
  3267. case KFD_IOCTL_SVM_ATTR_CLR_FLAGS:
  3268. get_flags = true;
  3269. break;
  3270. case KFD_IOCTL_SVM_ATTR_GRANULARITY:
  3271. get_granularity = true;
  3272. break;
  3273. case KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE:
  3274. case KFD_IOCTL_SVM_ATTR_NO_ACCESS:
  3275. fallthrough;
  3276. default:
  3277. pr_debug("get invalid attr type 0x%x\n", attrs[i].type);
  3278. return -EINVAL;
  3279. }
  3280. }
  3281. svms = &p->svms;
  3282. mutex_lock(&svms->lock);
  3283. node = interval_tree_iter_first(&svms->objects, start, last);
  3284. if (!node) {
  3285. pr_debug("range attrs not found return default values\n");
  3286. svm_range_set_default_attributes(svms, &location, &prefetch_loc,
  3287. &granularity, &flags_and);
  3288. flags_or = flags_and;
  3289. if (p->xnack_enabled)
  3290. bitmap_copy(bitmap_access, svms->bitmap_supported,
  3291. MAX_GPU_INSTANCE);
  3292. else
  3293. bitmap_zero(bitmap_access, MAX_GPU_INSTANCE);
  3294. bitmap_zero(bitmap_aip, MAX_GPU_INSTANCE);
  3295. goto fill_values;
  3296. }
  3297. bitmap_copy(bitmap_access, svms->bitmap_supported, MAX_GPU_INSTANCE);
  3298. bitmap_copy(bitmap_aip, svms->bitmap_supported, MAX_GPU_INSTANCE);
  3299. while (node) {
  3300. struct interval_tree_node *next;
  3301. prange = container_of(node, struct svm_range, it_node);
  3302. next = interval_tree_iter_next(node, start, last);
  3303. if (get_preferred_loc) {
  3304. if (prange->preferred_loc ==
  3305. KFD_IOCTL_SVM_LOCATION_UNDEFINED ||
  3306. (location != KFD_IOCTL_SVM_LOCATION_UNDEFINED &&
  3307. location != prange->preferred_loc)) {
  3308. location = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
  3309. get_preferred_loc = false;
  3310. } else {
  3311. location = prange->preferred_loc;
  3312. }
  3313. }
  3314. if (get_prefetch_loc) {
  3315. if (prange->prefetch_loc ==
  3316. KFD_IOCTL_SVM_LOCATION_UNDEFINED ||
  3317. (prefetch_loc != KFD_IOCTL_SVM_LOCATION_UNDEFINED &&
  3318. prefetch_loc != prange->prefetch_loc)) {
  3319. prefetch_loc = KFD_IOCTL_SVM_LOCATION_UNDEFINED;
  3320. get_prefetch_loc = false;
  3321. } else {
  3322. prefetch_loc = prange->prefetch_loc;
  3323. }
  3324. }
  3325. if (get_accessible) {
  3326. bitmap_and(bitmap_access, bitmap_access,
  3327. prange->bitmap_access, MAX_GPU_INSTANCE);
  3328. bitmap_and(bitmap_aip, bitmap_aip,
  3329. prange->bitmap_aip, MAX_GPU_INSTANCE);
  3330. }
  3331. if (get_flags) {
  3332. flags_and &= prange->flags;
  3333. flags_or |= prange->flags;
  3334. }
  3335. if (get_granularity && prange->granularity < granularity)
  3336. granularity = prange->granularity;
  3337. node = next;
  3338. }
  3339. fill_values:
  3340. mutex_unlock(&svms->lock);
  3341. for (i = 0; i < nattr; i++) {
  3342. switch (attrs[i].type) {
  3343. case KFD_IOCTL_SVM_ATTR_PREFERRED_LOC:
  3344. attrs[i].value = location;
  3345. break;
  3346. case KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:
  3347. attrs[i].value = prefetch_loc;
  3348. break;
  3349. case KFD_IOCTL_SVM_ATTR_ACCESS:
  3350. gpuidx = kfd_process_gpuidx_from_gpuid(p,
  3351. attrs[i].value);
  3352. if (gpuidx < 0) {
  3353. pr_debug("invalid gpuid %x\n", attrs[i].value);
  3354. return -EINVAL;
  3355. }
  3356. if (test_bit(gpuidx, bitmap_access))
  3357. attrs[i].type = KFD_IOCTL_SVM_ATTR_ACCESS;
  3358. else if (test_bit(gpuidx, bitmap_aip))
  3359. attrs[i].type =
  3360. KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE;
  3361. else
  3362. attrs[i].type = KFD_IOCTL_SVM_ATTR_NO_ACCESS;
  3363. break;
  3364. case KFD_IOCTL_SVM_ATTR_SET_FLAGS:
  3365. attrs[i].value = flags_and;
  3366. break;
  3367. case KFD_IOCTL_SVM_ATTR_CLR_FLAGS:
  3368. attrs[i].value = ~flags_or;
  3369. break;
  3370. case KFD_IOCTL_SVM_ATTR_GRANULARITY:
  3371. attrs[i].value = (uint32_t)granularity;
  3372. break;
  3373. }
  3374. }
  3375. return 0;
  3376. }
  3377. int kfd_criu_resume_svm(struct kfd_process *p)
  3378. {
  3379. struct kfd_ioctl_svm_attribute *set_attr_new, *set_attr = NULL;
  3380. int nattr_common = 4, nattr_accessibility = 1;
  3381. struct criu_svm_metadata *criu_svm_md = NULL;
  3382. struct svm_range_list *svms = &p->svms;
  3383. struct criu_svm_metadata *next = NULL;
  3384. uint32_t set_flags = 0xffffffff;
  3385. int i, j, num_attrs, ret = 0;
  3386. uint64_t set_attr_size;
  3387. struct mm_struct *mm;
  3388. if (list_empty(&svms->criu_svm_metadata_list)) {
  3389. pr_debug("No SVM data from CRIU restore stage 2\n");
  3390. return ret;
  3391. }
  3392. mm = get_task_mm(p->lead_thread);
  3393. if (!mm) {
  3394. pr_err("failed to get mm for the target process\n");
  3395. return -ESRCH;
  3396. }
  3397. num_attrs = nattr_common + (nattr_accessibility * p->n_pdds);
  3398. i = j = 0;
  3399. list_for_each_entry(criu_svm_md, &svms->criu_svm_metadata_list, list) {
  3400. pr_debug("criu_svm_md[%d]\n\tstart: 0x%llx size: 0x%llx (npages)\n",
  3401. i, criu_svm_md->data.start_addr, criu_svm_md->data.size);
  3402. for (j = 0; j < num_attrs; j++) {
  3403. pr_debug("\ncriu_svm_md[%d]->attrs[%d].type : 0x%x\ncriu_svm_md[%d]->attrs[%d].value : 0x%x\n",
  3404. i, j, criu_svm_md->data.attrs[j].type,
  3405. i, j, criu_svm_md->data.attrs[j].value);
  3406. switch (criu_svm_md->data.attrs[j].type) {
  3407. /* During Checkpoint operation, the query for
  3408. * KFD_IOCTL_SVM_ATTR_PREFETCH_LOC attribute might
  3409. * return KFD_IOCTL_SVM_LOCATION_UNDEFINED if they were
  3410. * not used by the range which was checkpointed. Care
  3411. * must be taken to not restore with an invalid value
  3412. * otherwise the gpuidx value will be invalid and
  3413. * set_attr would eventually fail so just replace those
  3414. * with another dummy attribute such as
  3415. * KFD_IOCTL_SVM_ATTR_SET_FLAGS.
  3416. */
  3417. case KFD_IOCTL_SVM_ATTR_PREFETCH_LOC:
  3418. if (criu_svm_md->data.attrs[j].value ==
  3419. KFD_IOCTL_SVM_LOCATION_UNDEFINED) {
  3420. criu_svm_md->data.attrs[j].type =
  3421. KFD_IOCTL_SVM_ATTR_SET_FLAGS;
  3422. criu_svm_md->data.attrs[j].value = 0;
  3423. }
  3424. break;
  3425. case KFD_IOCTL_SVM_ATTR_SET_FLAGS:
  3426. set_flags = criu_svm_md->data.attrs[j].value;
  3427. break;
  3428. default:
  3429. break;
  3430. }
  3431. }
  3432. /* CLR_FLAGS is not available via get_attr during checkpoint but
  3433. * it needs to be inserted before restoring the ranges so
  3434. * allocate extra space for it before calling set_attr
  3435. */
  3436. set_attr_size = sizeof(struct kfd_ioctl_svm_attribute) *
  3437. (num_attrs + 1);
  3438. set_attr_new = krealloc(set_attr, set_attr_size,
  3439. GFP_KERNEL);
  3440. if (!set_attr_new) {
  3441. ret = -ENOMEM;
  3442. goto exit;
  3443. }
  3444. set_attr = set_attr_new;
  3445. memcpy(set_attr, criu_svm_md->data.attrs, num_attrs *
  3446. sizeof(struct kfd_ioctl_svm_attribute));
  3447. set_attr[num_attrs].type = KFD_IOCTL_SVM_ATTR_CLR_FLAGS;
  3448. set_attr[num_attrs].value = ~set_flags;
  3449. ret = svm_range_set_attr(p, mm, criu_svm_md->data.start_addr,
  3450. criu_svm_md->data.size, num_attrs + 1,
  3451. set_attr);
  3452. if (ret) {
  3453. pr_err("CRIU: failed to set range attributes\n");
  3454. goto exit;
  3455. }
  3456. i++;
  3457. }
  3458. exit:
  3459. kfree(set_attr);
  3460. list_for_each_entry_safe(criu_svm_md, next, &svms->criu_svm_metadata_list, list) {
  3461. pr_debug("freeing criu_svm_md[]\n\tstart: 0x%llx\n",
  3462. criu_svm_md->data.start_addr);
  3463. kfree(criu_svm_md);
  3464. }
  3465. mmput(mm);
  3466. return ret;
  3467. }
  3468. int kfd_criu_restore_svm(struct kfd_process *p,
  3469. uint8_t __user *user_priv_ptr,
  3470. uint64_t *priv_data_offset,
  3471. uint64_t max_priv_data_size)
  3472. {
  3473. uint64_t svm_priv_data_size, svm_object_md_size, svm_attrs_size;
  3474. int nattr_common = 4, nattr_accessibility = 1;
  3475. struct criu_svm_metadata *criu_svm_md = NULL;
  3476. struct svm_range_list *svms = &p->svms;
  3477. uint32_t num_devices;
  3478. int ret = 0;
  3479. num_devices = p->n_pdds;
  3480. /* Handle one SVM range object at a time, also the number of gpus are
  3481. * assumed to be same on the restore node, checking must be done while
  3482. * evaluating the topology earlier
  3483. */
  3484. svm_attrs_size = sizeof(struct kfd_ioctl_svm_attribute) *
  3485. (nattr_common + nattr_accessibility * num_devices);
  3486. svm_object_md_size = sizeof(struct criu_svm_metadata) + svm_attrs_size;
  3487. svm_priv_data_size = sizeof(struct kfd_criu_svm_range_priv_data) +
  3488. svm_attrs_size;
  3489. criu_svm_md = kzalloc(svm_object_md_size, GFP_KERNEL);
  3490. if (!criu_svm_md) {
  3491. pr_err("failed to allocate memory to store svm metadata\n");
  3492. return -ENOMEM;
  3493. }
  3494. if (*priv_data_offset + svm_priv_data_size > max_priv_data_size) {
  3495. ret = -EINVAL;
  3496. goto exit;
  3497. }
  3498. ret = copy_from_user(&criu_svm_md->data, user_priv_ptr + *priv_data_offset,
  3499. svm_priv_data_size);
  3500. if (ret) {
  3501. ret = -EFAULT;
  3502. goto exit;
  3503. }
  3504. *priv_data_offset += svm_priv_data_size;
  3505. list_add_tail(&criu_svm_md->list, &svms->criu_svm_metadata_list);
  3506. return 0;
  3507. exit:
  3508. kfree(criu_svm_md);
  3509. return ret;
  3510. }
  3511. int svm_range_get_info(struct kfd_process *p, uint32_t *num_svm_ranges,
  3512. uint64_t *svm_priv_data_size)
  3513. {
  3514. uint64_t total_size, accessibility_size, common_attr_size;
  3515. int nattr_common = 4, nattr_accessibility = 1;
  3516. int num_devices = p->n_pdds;
  3517. struct svm_range_list *svms;
  3518. struct svm_range *prange;
  3519. uint32_t count = 0;
  3520. *svm_priv_data_size = 0;
  3521. svms = &p->svms;
  3522. if (!svms)
  3523. return -EINVAL;
  3524. mutex_lock(&svms->lock);
  3525. list_for_each_entry(prange, &svms->list, list) {
  3526. pr_debug("prange: 0x%p start: 0x%lx\t npages: 0x%llx\t end: 0x%llx\n",
  3527. prange, prange->start, prange->npages,
  3528. prange->start + prange->npages - 1);
  3529. count++;
  3530. }
  3531. mutex_unlock(&svms->lock);
  3532. *num_svm_ranges = count;
  3533. /* Only the accessbility attributes need to be queried for all the gpus
  3534. * individually, remaining ones are spanned across the entire process
  3535. * regardless of the various gpu nodes. Of the remaining attributes,
  3536. * KFD_IOCTL_SVM_ATTR_CLR_FLAGS need not be saved.
  3537. *
  3538. * KFD_IOCTL_SVM_ATTR_PREFERRED_LOC
  3539. * KFD_IOCTL_SVM_ATTR_PREFETCH_LOC
  3540. * KFD_IOCTL_SVM_ATTR_SET_FLAGS
  3541. * KFD_IOCTL_SVM_ATTR_GRANULARITY
  3542. *
  3543. * ** ACCESSBILITY ATTRIBUTES **
  3544. * (Considered as one, type is altered during query, value is gpuid)
  3545. * KFD_IOCTL_SVM_ATTR_ACCESS
  3546. * KFD_IOCTL_SVM_ATTR_ACCESS_IN_PLACE
  3547. * KFD_IOCTL_SVM_ATTR_NO_ACCESS
  3548. */
  3549. if (*num_svm_ranges > 0) {
  3550. common_attr_size = sizeof(struct kfd_ioctl_svm_attribute) *
  3551. nattr_common;
  3552. accessibility_size = sizeof(struct kfd_ioctl_svm_attribute) *
  3553. nattr_accessibility * num_devices;
  3554. total_size = sizeof(struct kfd_criu_svm_range_priv_data) +
  3555. common_attr_size + accessibility_size;
  3556. *svm_priv_data_size = *num_svm_ranges * total_size;
  3557. }
  3558. pr_debug("num_svm_ranges %u total_priv_size %llu\n", *num_svm_ranges,
  3559. *svm_priv_data_size);
  3560. return 0;
  3561. }
  3562. int kfd_criu_checkpoint_svm(struct kfd_process *p,
  3563. uint8_t __user *user_priv_data,
  3564. uint64_t *priv_data_offset)
  3565. {
  3566. struct kfd_criu_svm_range_priv_data *svm_priv = NULL;
  3567. struct kfd_ioctl_svm_attribute *query_attr = NULL;
  3568. uint64_t svm_priv_data_size, query_attr_size = 0;
  3569. int index, nattr_common = 4, ret = 0;
  3570. struct svm_range_list *svms;
  3571. int num_devices = p->n_pdds;
  3572. struct svm_range *prange;
  3573. struct mm_struct *mm;
  3574. svms = &p->svms;
  3575. if (!svms)
  3576. return -EINVAL;
  3577. mm = get_task_mm(p->lead_thread);
  3578. if (!mm) {
  3579. pr_err("failed to get mm for the target process\n");
  3580. return -ESRCH;
  3581. }
  3582. query_attr_size = sizeof(struct kfd_ioctl_svm_attribute) *
  3583. (nattr_common + num_devices);
  3584. query_attr = kzalloc(query_attr_size, GFP_KERNEL);
  3585. if (!query_attr) {
  3586. ret = -ENOMEM;
  3587. goto exit;
  3588. }
  3589. query_attr[0].type = KFD_IOCTL_SVM_ATTR_PREFERRED_LOC;
  3590. query_attr[1].type = KFD_IOCTL_SVM_ATTR_PREFETCH_LOC;
  3591. query_attr[2].type = KFD_IOCTL_SVM_ATTR_SET_FLAGS;
  3592. query_attr[3].type = KFD_IOCTL_SVM_ATTR_GRANULARITY;
  3593. for (index = 0; index < num_devices; index++) {
  3594. struct kfd_process_device *pdd = p->pdds[index];
  3595. query_attr[index + nattr_common].type =
  3596. KFD_IOCTL_SVM_ATTR_ACCESS;
  3597. query_attr[index + nattr_common].value = pdd->user_gpu_id;
  3598. }
  3599. svm_priv_data_size = sizeof(*svm_priv) + query_attr_size;
  3600. svm_priv = kzalloc(svm_priv_data_size, GFP_KERNEL);
  3601. if (!svm_priv) {
  3602. ret = -ENOMEM;
  3603. goto exit_query;
  3604. }
  3605. index = 0;
  3606. list_for_each_entry(prange, &svms->list, list) {
  3607. svm_priv->object_type = KFD_CRIU_OBJECT_TYPE_SVM_RANGE;
  3608. svm_priv->start_addr = prange->start;
  3609. svm_priv->size = prange->npages;
  3610. memcpy(&svm_priv->attrs, query_attr, query_attr_size);
  3611. pr_debug("CRIU: prange: 0x%p start: 0x%lx\t npages: 0x%llx end: 0x%llx\t size: 0x%llx\n",
  3612. prange, prange->start, prange->npages,
  3613. prange->start + prange->npages - 1,
  3614. prange->npages * PAGE_SIZE);
  3615. ret = svm_range_get_attr(p, mm, svm_priv->start_addr,
  3616. svm_priv->size,
  3617. (nattr_common + num_devices),
  3618. svm_priv->attrs);
  3619. if (ret) {
  3620. pr_err("CRIU: failed to obtain range attributes\n");
  3621. goto exit_priv;
  3622. }
  3623. if (copy_to_user(user_priv_data + *priv_data_offset, svm_priv,
  3624. svm_priv_data_size)) {
  3625. pr_err("Failed to copy svm priv to user\n");
  3626. ret = -EFAULT;
  3627. goto exit_priv;
  3628. }
  3629. *priv_data_offset += svm_priv_data_size;
  3630. }
  3631. exit_priv:
  3632. kfree(svm_priv);
  3633. exit_query:
  3634. kfree(query_attr);
  3635. exit:
  3636. mmput(mm);
  3637. return ret;
  3638. }
  3639. int
  3640. svm_ioctl(struct kfd_process *p, enum kfd_ioctl_svm_op op, uint64_t start,
  3641. uint64_t size, uint32_t nattrs, struct kfd_ioctl_svm_attribute *attrs)
  3642. {
  3643. struct mm_struct *mm = current->mm;
  3644. int r;
  3645. start >>= PAGE_SHIFT;
  3646. size >>= PAGE_SHIFT;
  3647. switch (op) {
  3648. case KFD_IOCTL_SVM_OP_SET_ATTR:
  3649. r = svm_range_set_attr(p, mm, start, size, nattrs, attrs);
  3650. break;
  3651. case KFD_IOCTL_SVM_OP_GET_ATTR:
  3652. r = svm_range_get_attr(p, mm, start, size, nattrs, attrs);
  3653. break;
  3654. default:
  3655. r = -EINVAL;
  3656. break;
  3657. }
  3658. return r;
  3659. }