i915_request.c 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303
  1. /*
  2. * Copyright © 2016 Intel Corporation
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * 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 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21. * IN THE SOFTWARE.
  22. *
  23. */
  24. #include <linux/pm_qos.h>
  25. #include <linux/prime_numbers.h>
  26. #include <linux/sort.h>
  27. #include <drm/drm_print.h>
  28. #include "gem/i915_gem_internal.h"
  29. #include "gem/i915_gem_pm.h"
  30. #include "gem/selftests/mock_context.h"
  31. #include "gt/intel_engine_heartbeat.h"
  32. #include "gt/intel_engine_pm.h"
  33. #include "gt/intel_engine_user.h"
  34. #include "gt/intel_gt.h"
  35. #include "gt/intel_gt_clock_utils.h"
  36. #include "gt/intel_gt_requests.h"
  37. #include "gt/selftest_engine_heartbeat.h"
  38. #include "i915_random.h"
  39. #include "i915_selftest.h"
  40. #include "i915_wait_util.h"
  41. #include "igt_flush_test.h"
  42. #include "igt_live_test.h"
  43. #include "igt_spinner.h"
  44. #include "lib_sw_fence.h"
  45. #include "mock_drm.h"
  46. #include "mock_gem_device.h"
  47. static unsigned int num_uabi_engines(struct drm_i915_private *i915)
  48. {
  49. struct intel_engine_cs *engine;
  50. unsigned int count;
  51. count = 0;
  52. for_each_uabi_engine(engine, i915)
  53. count++;
  54. return count;
  55. }
  56. static struct intel_engine_cs *rcs0(struct drm_i915_private *i915)
  57. {
  58. return intel_engine_lookup_user(i915, I915_ENGINE_CLASS_RENDER, 0);
  59. }
  60. static int igt_add_request(void *arg)
  61. {
  62. struct drm_i915_private *i915 = arg;
  63. struct i915_request *request;
  64. /* Basic preliminary test to create a request and let it loose! */
  65. request = mock_request(rcs0(i915)->kernel_context, HZ / 10);
  66. if (IS_ERR(request))
  67. return PTR_ERR(request);
  68. i915_request_add(request);
  69. return 0;
  70. }
  71. static int igt_wait_request(void *arg)
  72. {
  73. const long T = HZ / 4;
  74. struct drm_i915_private *i915 = arg;
  75. struct i915_request *request;
  76. int err = -EINVAL;
  77. /* Submit a request, then wait upon it */
  78. request = mock_request(rcs0(i915)->kernel_context, T);
  79. if (IS_ERR(request))
  80. return PTR_ERR(request);
  81. i915_request_get(request);
  82. if (i915_request_wait(request, 0, 0) != -ETIME) {
  83. pr_err("request wait (busy query) succeeded (expected timeout before submit!)\n");
  84. goto out_request;
  85. }
  86. if (i915_request_wait(request, 0, T) != -ETIME) {
  87. pr_err("request wait succeeded (expected timeout before submit!)\n");
  88. goto out_request;
  89. }
  90. if (i915_request_completed(request)) {
  91. pr_err("request completed before submit!!\n");
  92. goto out_request;
  93. }
  94. i915_request_add(request);
  95. if (i915_request_wait(request, 0, 0) != -ETIME) {
  96. pr_err("request wait (busy query) succeeded (expected timeout after submit!)\n");
  97. goto out_request;
  98. }
  99. if (i915_request_completed(request)) {
  100. pr_err("request completed immediately!\n");
  101. goto out_request;
  102. }
  103. if (i915_request_wait(request, 0, T / 2) != -ETIME) {
  104. pr_err("request wait succeeded (expected timeout!)\n");
  105. goto out_request;
  106. }
  107. if (i915_request_wait(request, 0, T) == -ETIME) {
  108. pr_err("request wait timed out!\n");
  109. goto out_request;
  110. }
  111. if (!i915_request_completed(request)) {
  112. pr_err("request not complete after waiting!\n");
  113. goto out_request;
  114. }
  115. if (i915_request_wait(request, 0, T) == -ETIME) {
  116. pr_err("request wait timed out when already complete!\n");
  117. goto out_request;
  118. }
  119. err = 0;
  120. out_request:
  121. i915_request_put(request);
  122. mock_device_flush(i915);
  123. return err;
  124. }
  125. static int igt_fence_wait(void *arg)
  126. {
  127. const long T = HZ / 4;
  128. struct drm_i915_private *i915 = arg;
  129. struct i915_request *request;
  130. int err = -EINVAL;
  131. /* Submit a request, treat it as a fence and wait upon it */
  132. request = mock_request(rcs0(i915)->kernel_context, T);
  133. if (IS_ERR(request))
  134. return PTR_ERR(request);
  135. if (dma_fence_wait_timeout(&request->fence, false, T) != -ETIME) {
  136. pr_err("fence wait success before submit (expected timeout)!\n");
  137. goto out;
  138. }
  139. i915_request_add(request);
  140. if (dma_fence_is_signaled(&request->fence)) {
  141. pr_err("fence signaled immediately!\n");
  142. goto out;
  143. }
  144. if (dma_fence_wait_timeout(&request->fence, false, T / 2) != -ETIME) {
  145. pr_err("fence wait success after submit (expected timeout)!\n");
  146. goto out;
  147. }
  148. if (dma_fence_wait_timeout(&request->fence, false, T) <= 0) {
  149. pr_err("fence wait timed out (expected success)!\n");
  150. goto out;
  151. }
  152. if (!dma_fence_is_signaled(&request->fence)) {
  153. pr_err("fence unsignaled after waiting!\n");
  154. goto out;
  155. }
  156. if (dma_fence_wait_timeout(&request->fence, false, T) <= 0) {
  157. pr_err("fence wait timed out when complete (expected success)!\n");
  158. goto out;
  159. }
  160. err = 0;
  161. out:
  162. mock_device_flush(i915);
  163. return err;
  164. }
  165. static int igt_request_rewind(void *arg)
  166. {
  167. struct drm_i915_private *i915 = arg;
  168. struct i915_request *request, *vip;
  169. struct i915_gem_context *ctx[2];
  170. struct intel_context *ce;
  171. int err = -EINVAL;
  172. ctx[0] = mock_context(i915, "A");
  173. if (!ctx[0]) {
  174. err = -ENOMEM;
  175. goto err_ctx_0;
  176. }
  177. ce = i915_gem_context_get_engine(ctx[0], RCS0);
  178. GEM_BUG_ON(IS_ERR(ce));
  179. request = mock_request(ce, 2 * HZ);
  180. intel_context_put(ce);
  181. if (IS_ERR(request)) {
  182. err = PTR_ERR(request);
  183. goto err_context_0;
  184. }
  185. i915_request_get(request);
  186. i915_request_add(request);
  187. ctx[1] = mock_context(i915, "B");
  188. if (!ctx[1]) {
  189. err = -ENOMEM;
  190. goto err_ctx_1;
  191. }
  192. ce = i915_gem_context_get_engine(ctx[1], RCS0);
  193. GEM_BUG_ON(IS_ERR(ce));
  194. vip = mock_request(ce, 0);
  195. intel_context_put(ce);
  196. if (IS_ERR(vip)) {
  197. err = PTR_ERR(vip);
  198. goto err_context_1;
  199. }
  200. /* Simulate preemption by manual reordering */
  201. if (!mock_cancel_request(request)) {
  202. pr_err("failed to cancel request (already executed)!\n");
  203. i915_request_add(vip);
  204. goto err_context_1;
  205. }
  206. i915_request_get(vip);
  207. i915_request_add(vip);
  208. rcu_read_lock();
  209. request->engine->submit_request(request);
  210. rcu_read_unlock();
  211. if (i915_request_wait(vip, 0, HZ) == -ETIME) {
  212. pr_err("timed out waiting for high priority request\n");
  213. goto err;
  214. }
  215. if (i915_request_completed(request)) {
  216. pr_err("low priority request already completed\n");
  217. goto err;
  218. }
  219. err = 0;
  220. err:
  221. i915_request_put(vip);
  222. err_context_1:
  223. mock_context_close(ctx[1]);
  224. err_ctx_1:
  225. i915_request_put(request);
  226. err_context_0:
  227. mock_context_close(ctx[0]);
  228. err_ctx_0:
  229. mock_device_flush(i915);
  230. return err;
  231. }
  232. struct smoketest {
  233. struct intel_engine_cs *engine;
  234. struct i915_gem_context **contexts;
  235. atomic_long_t num_waits, num_fences;
  236. int ncontexts, max_batch;
  237. struct i915_request *(*request_alloc)(struct intel_context *ce);
  238. };
  239. static struct i915_request *
  240. __mock_request_alloc(struct intel_context *ce)
  241. {
  242. return mock_request(ce, 0);
  243. }
  244. static struct i915_request *
  245. __live_request_alloc(struct intel_context *ce)
  246. {
  247. return intel_context_create_request(ce);
  248. }
  249. struct smoke_thread {
  250. struct kthread_worker *worker;
  251. struct kthread_work work;
  252. struct smoketest *t;
  253. bool stop;
  254. int result;
  255. };
  256. static void __igt_breadcrumbs_smoketest(struct kthread_work *work)
  257. {
  258. struct smoke_thread *thread = container_of(work, typeof(*thread), work);
  259. struct smoketest *t = thread->t;
  260. const unsigned int max_batch = min(t->ncontexts, t->max_batch) - 1;
  261. const unsigned int total = 4 * t->ncontexts + 1;
  262. unsigned int num_waits = 0, num_fences = 0;
  263. struct i915_request **requests;
  264. I915_RND_STATE(prng);
  265. unsigned int *order;
  266. int err = 0;
  267. /*
  268. * A very simple test to catch the most egregious of list handling bugs.
  269. *
  270. * At its heart, we simply create oodles of requests running across
  271. * multiple kthreads and enable signaling on them, for the sole purpose
  272. * of stressing our breadcrumb handling. The only inspection we do is
  273. * that the fences were marked as signaled.
  274. */
  275. requests = kzalloc_objs(*requests, total);
  276. if (!requests) {
  277. thread->result = -ENOMEM;
  278. return;
  279. }
  280. order = i915_random_order(total, &prng);
  281. if (!order) {
  282. err = -ENOMEM;
  283. goto out_requests;
  284. }
  285. while (!READ_ONCE(thread->stop)) {
  286. struct i915_sw_fence *submit, *wait;
  287. unsigned int n, count;
  288. submit = heap_fence_create(GFP_KERNEL);
  289. if (!submit) {
  290. err = -ENOMEM;
  291. break;
  292. }
  293. wait = heap_fence_create(GFP_KERNEL);
  294. if (!wait) {
  295. i915_sw_fence_commit(submit);
  296. heap_fence_put(submit);
  297. err = -ENOMEM;
  298. break;
  299. }
  300. i915_random_reorder(order, total, &prng);
  301. count = 1 + i915_prandom_u32_max_state(max_batch, &prng);
  302. for (n = 0; n < count; n++) {
  303. struct i915_gem_context *ctx =
  304. t->contexts[order[n] % t->ncontexts];
  305. struct i915_request *rq;
  306. struct intel_context *ce;
  307. ce = i915_gem_context_get_engine(ctx, t->engine->legacy_idx);
  308. GEM_BUG_ON(IS_ERR(ce));
  309. rq = t->request_alloc(ce);
  310. intel_context_put(ce);
  311. if (IS_ERR(rq)) {
  312. err = PTR_ERR(rq);
  313. count = n;
  314. break;
  315. }
  316. err = i915_sw_fence_await_sw_fence_gfp(&rq->submit,
  317. submit,
  318. GFP_KERNEL);
  319. requests[n] = i915_request_get(rq);
  320. i915_request_add(rq);
  321. if (err >= 0)
  322. err = i915_sw_fence_await_dma_fence(wait,
  323. &rq->fence,
  324. 0,
  325. GFP_KERNEL);
  326. if (err < 0) {
  327. i915_request_put(rq);
  328. count = n;
  329. break;
  330. }
  331. }
  332. i915_sw_fence_commit(submit);
  333. i915_sw_fence_commit(wait);
  334. if (!wait_event_timeout(wait->wait,
  335. i915_sw_fence_done(wait),
  336. 5 * HZ)) {
  337. struct i915_request *rq = requests[count - 1];
  338. pr_err("waiting for %d/%d fences (last %llx:%lld) on %s timed out!\n",
  339. atomic_read(&wait->pending), count,
  340. rq->fence.context, rq->fence.seqno,
  341. t->engine->name);
  342. GEM_TRACE_DUMP();
  343. intel_gt_set_wedged(t->engine->gt);
  344. GEM_BUG_ON(!i915_request_completed(rq));
  345. i915_sw_fence_wait(wait);
  346. err = -EIO;
  347. }
  348. for (n = 0; n < count; n++) {
  349. struct i915_request *rq = requests[n];
  350. if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,
  351. &rq->fence.flags)) {
  352. pr_err("%llu:%llu was not signaled!\n",
  353. rq->fence.context, rq->fence.seqno);
  354. err = -EINVAL;
  355. }
  356. i915_request_put(rq);
  357. }
  358. heap_fence_put(wait);
  359. heap_fence_put(submit);
  360. if (err < 0)
  361. break;
  362. num_fences += count;
  363. num_waits++;
  364. cond_resched();
  365. }
  366. atomic_long_add(num_fences, &t->num_fences);
  367. atomic_long_add(num_waits, &t->num_waits);
  368. kfree(order);
  369. out_requests:
  370. kfree(requests);
  371. thread->result = err;
  372. }
  373. static int mock_breadcrumbs_smoketest(void *arg)
  374. {
  375. struct drm_i915_private *i915 = arg;
  376. struct smoketest t = {
  377. .engine = rcs0(i915),
  378. .ncontexts = 1024,
  379. .max_batch = 1024,
  380. .request_alloc = __mock_request_alloc
  381. };
  382. unsigned int ncpus = num_online_cpus();
  383. struct smoke_thread *threads;
  384. unsigned int n;
  385. int ret = 0;
  386. /*
  387. * Smoketest our breadcrumb/signal handling for requests across multiple
  388. * threads. A very simple test to only catch the most egregious of bugs.
  389. * See __igt_breadcrumbs_smoketest();
  390. */
  391. threads = kzalloc_objs(*threads, ncpus);
  392. if (!threads)
  393. return -ENOMEM;
  394. t.contexts = kzalloc_objs(*t.contexts, t.ncontexts);
  395. if (!t.contexts) {
  396. ret = -ENOMEM;
  397. goto out_threads;
  398. }
  399. for (n = 0; n < t.ncontexts; n++) {
  400. t.contexts[n] = mock_context(t.engine->i915, "mock");
  401. if (!t.contexts[n]) {
  402. ret = -ENOMEM;
  403. goto out_contexts;
  404. }
  405. }
  406. for (n = 0; n < ncpus; n++) {
  407. struct kthread_worker *worker;
  408. worker = kthread_run_worker(0, "igt/%d", n);
  409. if (IS_ERR(worker)) {
  410. ret = PTR_ERR(worker);
  411. ncpus = n;
  412. break;
  413. }
  414. threads[n].worker = worker;
  415. threads[n].t = &t;
  416. threads[n].stop = false;
  417. threads[n].result = 0;
  418. kthread_init_work(&threads[n].work,
  419. __igt_breadcrumbs_smoketest);
  420. kthread_queue_work(worker, &threads[n].work);
  421. }
  422. msleep(jiffies_to_msecs(i915_selftest.timeout_jiffies));
  423. for (n = 0; n < ncpus; n++) {
  424. int err;
  425. WRITE_ONCE(threads[n].stop, true);
  426. kthread_flush_work(&threads[n].work);
  427. err = READ_ONCE(threads[n].result);
  428. if (err < 0 && !ret)
  429. ret = err;
  430. kthread_destroy_worker(threads[n].worker);
  431. }
  432. pr_info("Completed %lu waits for %lu fence across %d cpus\n",
  433. atomic_long_read(&t.num_waits),
  434. atomic_long_read(&t.num_fences),
  435. ncpus);
  436. out_contexts:
  437. for (n = 0; n < t.ncontexts; n++) {
  438. if (!t.contexts[n])
  439. break;
  440. mock_context_close(t.contexts[n]);
  441. }
  442. kfree(t.contexts);
  443. out_threads:
  444. kfree(threads);
  445. return ret;
  446. }
  447. int i915_request_mock_selftests(void)
  448. {
  449. static const struct i915_subtest tests[] = {
  450. SUBTEST(igt_add_request),
  451. SUBTEST(igt_wait_request),
  452. SUBTEST(igt_fence_wait),
  453. SUBTEST(igt_request_rewind),
  454. SUBTEST(mock_breadcrumbs_smoketest),
  455. };
  456. struct drm_i915_private *i915;
  457. intel_wakeref_t wakeref;
  458. int err = 0;
  459. i915 = mock_gem_device();
  460. if (!i915)
  461. return -ENOMEM;
  462. with_intel_runtime_pm(&i915->runtime_pm, wakeref)
  463. err = i915_subtests(tests, i915);
  464. mock_destroy_device(i915);
  465. return err;
  466. }
  467. static int live_nop_request(void *arg)
  468. {
  469. struct drm_i915_private *i915 = arg;
  470. struct intel_engine_cs *engine;
  471. struct igt_live_test t;
  472. int err = -ENODEV;
  473. /*
  474. * Submit various sized batches of empty requests, to each engine
  475. * (individually), and wait for the batch to complete. We can check
  476. * the overhead of submitting requests to the hardware.
  477. */
  478. for_each_uabi_engine(engine, i915) {
  479. unsigned long n, prime;
  480. IGT_TIMEOUT(end_time);
  481. ktime_t times[2] = {};
  482. err = igt_live_test_begin(&t, i915, __func__, engine->name);
  483. if (err)
  484. return err;
  485. intel_engine_pm_get(engine);
  486. for_each_prime_number_from(prime, 1, 8192) {
  487. struct i915_request *request = NULL;
  488. times[1] = ktime_get_raw();
  489. for (n = 0; n < prime; n++) {
  490. i915_request_put(request);
  491. request = i915_request_create(engine->kernel_context);
  492. if (IS_ERR(request))
  493. return PTR_ERR(request);
  494. /*
  495. * This space is left intentionally blank.
  496. *
  497. * We do not actually want to perform any
  498. * action with this request, we just want
  499. * to measure the latency in allocation
  500. * and submission of our breadcrumbs -
  501. * ensuring that the bare request is sufficient
  502. * for the system to work (i.e. proper HEAD
  503. * tracking of the rings, interrupt handling,
  504. * etc). It also gives us the lowest bounds
  505. * for latency.
  506. */
  507. i915_request_get(request);
  508. i915_request_add(request);
  509. }
  510. i915_request_wait(request, 0, MAX_SCHEDULE_TIMEOUT);
  511. i915_request_put(request);
  512. times[1] = ktime_sub(ktime_get_raw(), times[1]);
  513. if (prime == 1)
  514. times[0] = times[1];
  515. if (__igt_timeout(end_time, NULL))
  516. break;
  517. }
  518. intel_engine_pm_put(engine);
  519. err = igt_live_test_end(&t);
  520. if (err)
  521. return err;
  522. pr_info("Request latencies on %s: 1 = %lluns, %lu = %lluns\n",
  523. engine->name,
  524. ktime_to_ns(times[0]),
  525. prime, div64_u64(ktime_to_ns(times[1]), prime));
  526. }
  527. return err;
  528. }
  529. static int __cancel_inactive(struct intel_engine_cs *engine)
  530. {
  531. struct intel_context *ce;
  532. struct igt_spinner spin;
  533. struct i915_request *rq;
  534. int err = 0;
  535. if (igt_spinner_init(&spin, engine->gt))
  536. return -ENOMEM;
  537. ce = intel_context_create(engine);
  538. if (IS_ERR(ce)) {
  539. err = PTR_ERR(ce);
  540. goto out_spin;
  541. }
  542. rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK);
  543. if (IS_ERR(rq)) {
  544. err = PTR_ERR(rq);
  545. goto out_ce;
  546. }
  547. pr_debug("%s: Cancelling inactive request\n", engine->name);
  548. i915_request_cancel(rq, -EINTR);
  549. i915_request_get(rq);
  550. i915_request_add(rq);
  551. if (i915_request_wait(rq, 0, HZ / 5) < 0) {
  552. struct drm_printer p = drm_info_printer(engine->i915->drm.dev);
  553. pr_err("%s: Failed to cancel inactive request\n", engine->name);
  554. intel_engine_dump(engine, &p, "%s\n", engine->name);
  555. err = -ETIME;
  556. goto out_rq;
  557. }
  558. if (rq->fence.error != -EINTR) {
  559. pr_err("%s: fence not cancelled (%u)\n",
  560. engine->name, rq->fence.error);
  561. err = -EINVAL;
  562. }
  563. out_rq:
  564. i915_request_put(rq);
  565. out_ce:
  566. intel_context_put(ce);
  567. out_spin:
  568. igt_spinner_fini(&spin);
  569. if (err)
  570. pr_err("%s: %s error %d\n", __func__, engine->name, err);
  571. return err;
  572. }
  573. static int __cancel_active(struct intel_engine_cs *engine)
  574. {
  575. struct intel_context *ce;
  576. struct igt_spinner spin;
  577. struct i915_request *rq;
  578. int err = 0;
  579. if (igt_spinner_init(&spin, engine->gt))
  580. return -ENOMEM;
  581. ce = intel_context_create(engine);
  582. if (IS_ERR(ce)) {
  583. err = PTR_ERR(ce);
  584. goto out_spin;
  585. }
  586. rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK);
  587. if (IS_ERR(rq)) {
  588. err = PTR_ERR(rq);
  589. goto out_ce;
  590. }
  591. pr_debug("%s: Cancelling active request\n", engine->name);
  592. i915_request_get(rq);
  593. i915_request_add(rq);
  594. if (!igt_wait_for_spinner(&spin, rq)) {
  595. struct drm_printer p = drm_info_printer(engine->i915->drm.dev);
  596. pr_err("Failed to start spinner on %s\n", engine->name);
  597. intel_engine_dump(engine, &p, "%s\n", engine->name);
  598. err = -ETIME;
  599. goto out_rq;
  600. }
  601. i915_request_cancel(rq, -EINTR);
  602. if (i915_request_wait(rq, 0, HZ / 5) < 0) {
  603. struct drm_printer p = drm_info_printer(engine->i915->drm.dev);
  604. pr_err("%s: Failed to cancel active request\n", engine->name);
  605. intel_engine_dump(engine, &p, "%s\n", engine->name);
  606. err = -ETIME;
  607. goto out_rq;
  608. }
  609. if (rq->fence.error != -EINTR) {
  610. pr_err("%s: fence not cancelled (%u)\n",
  611. engine->name, rq->fence.error);
  612. err = -EINVAL;
  613. }
  614. out_rq:
  615. i915_request_put(rq);
  616. out_ce:
  617. intel_context_put(ce);
  618. out_spin:
  619. igt_spinner_fini(&spin);
  620. if (err)
  621. pr_err("%s: %s error %d\n", __func__, engine->name, err);
  622. return err;
  623. }
  624. static int __cancel_completed(struct intel_engine_cs *engine)
  625. {
  626. struct intel_context *ce;
  627. struct igt_spinner spin;
  628. struct i915_request *rq;
  629. int err = 0;
  630. if (igt_spinner_init(&spin, engine->gt))
  631. return -ENOMEM;
  632. ce = intel_context_create(engine);
  633. if (IS_ERR(ce)) {
  634. err = PTR_ERR(ce);
  635. goto out_spin;
  636. }
  637. rq = igt_spinner_create_request(&spin, ce, MI_ARB_CHECK);
  638. if (IS_ERR(rq)) {
  639. err = PTR_ERR(rq);
  640. goto out_ce;
  641. }
  642. igt_spinner_end(&spin);
  643. i915_request_get(rq);
  644. i915_request_add(rq);
  645. if (i915_request_wait(rq, 0, HZ / 5) < 0) {
  646. err = -ETIME;
  647. goto out_rq;
  648. }
  649. pr_debug("%s: Cancelling completed request\n", engine->name);
  650. i915_request_cancel(rq, -EINTR);
  651. if (rq->fence.error) {
  652. pr_err("%s: fence not cancelled (%u)\n",
  653. engine->name, rq->fence.error);
  654. err = -EINVAL;
  655. }
  656. out_rq:
  657. i915_request_put(rq);
  658. out_ce:
  659. intel_context_put(ce);
  660. out_spin:
  661. igt_spinner_fini(&spin);
  662. if (err)
  663. pr_err("%s: %s error %d\n", __func__, engine->name, err);
  664. return err;
  665. }
  666. /*
  667. * Test to prove a non-preemptable request can be cancelled and a subsequent
  668. * request on the same context can successfully complete after cancellation.
  669. *
  670. * Testing methodology is to create a non-preemptible request and submit it,
  671. * wait for spinner to start, create a NOP request and submit it, cancel the
  672. * spinner, wait for spinner to complete and verify it failed with an error,
  673. * finally wait for NOP request to complete verify it succeeded without an
  674. * error. Preemption timeout also reduced / restored so test runs in a timely
  675. * maner.
  676. */
  677. static int __cancel_reset(struct drm_i915_private *i915,
  678. struct intel_engine_cs *engine)
  679. {
  680. struct intel_context *ce;
  681. struct igt_spinner spin;
  682. struct i915_request *rq, *nop;
  683. unsigned long preempt_timeout_ms;
  684. int err = 0;
  685. if (!CONFIG_DRM_I915_PREEMPT_TIMEOUT ||
  686. !intel_has_reset_engine(engine->gt))
  687. return 0;
  688. preempt_timeout_ms = engine->props.preempt_timeout_ms;
  689. engine->props.preempt_timeout_ms = 100;
  690. if (igt_spinner_init(&spin, engine->gt))
  691. goto out_restore;
  692. ce = intel_context_create(engine);
  693. if (IS_ERR(ce)) {
  694. err = PTR_ERR(ce);
  695. goto out_spin;
  696. }
  697. rq = igt_spinner_create_request(&spin, ce, MI_NOOP);
  698. if (IS_ERR(rq)) {
  699. err = PTR_ERR(rq);
  700. goto out_ce;
  701. }
  702. pr_debug("%s: Cancelling active non-preemptable request\n",
  703. engine->name);
  704. i915_request_get(rq);
  705. i915_request_add(rq);
  706. if (!igt_wait_for_spinner(&spin, rq)) {
  707. struct drm_printer p = drm_info_printer(engine->i915->drm.dev);
  708. pr_err("Failed to start spinner on %s\n", engine->name);
  709. intel_engine_dump(engine, &p, "%s\n", engine->name);
  710. err = -ETIME;
  711. goto out_rq;
  712. }
  713. nop = intel_context_create_request(ce);
  714. if (IS_ERR(nop))
  715. goto out_rq;
  716. i915_request_get(nop);
  717. i915_request_add(nop);
  718. i915_request_cancel(rq, -EINTR);
  719. if (i915_request_wait(rq, 0, HZ) < 0) {
  720. struct drm_printer p = drm_info_printer(engine->i915->drm.dev);
  721. pr_err("%s: Failed to cancel hung request\n", engine->name);
  722. intel_engine_dump(engine, &p, "%s\n", engine->name);
  723. err = -ETIME;
  724. goto out_nop;
  725. }
  726. if (rq->fence.error != -EINTR) {
  727. pr_err("%s: fence not cancelled (%u)\n",
  728. engine->name, rq->fence.error);
  729. err = -EINVAL;
  730. goto out_nop;
  731. }
  732. if (i915_request_wait(nop, 0, HZ) < 0) {
  733. struct drm_printer p = drm_info_printer(engine->i915->drm.dev);
  734. pr_err("%s: Failed to complete nop request\n", engine->name);
  735. intel_engine_dump(engine, &p, "%s\n", engine->name);
  736. err = -ETIME;
  737. goto out_nop;
  738. }
  739. if (nop->fence.error != 0) {
  740. pr_err("%s: Nop request errored (%u)\n",
  741. engine->name, nop->fence.error);
  742. err = -EINVAL;
  743. }
  744. out_nop:
  745. i915_request_put(nop);
  746. out_rq:
  747. i915_request_put(rq);
  748. out_ce:
  749. intel_context_put(ce);
  750. out_spin:
  751. igt_spinner_fini(&spin);
  752. out_restore:
  753. engine->props.preempt_timeout_ms = preempt_timeout_ms;
  754. if (err)
  755. pr_err("%s: %s error %d\n", __func__, engine->name, err);
  756. return err;
  757. }
  758. static int live_cancel_request(void *arg)
  759. {
  760. struct drm_i915_private *i915 = arg;
  761. struct intel_engine_cs *engine;
  762. /*
  763. * Check cancellation of requests. We expect to be able to immediately
  764. * cancel active requests, even if they are currently on the GPU.
  765. */
  766. for_each_uabi_engine(engine, i915) {
  767. struct igt_live_test t;
  768. int err, err2;
  769. if (!intel_engine_has_preemption(engine))
  770. continue;
  771. err = igt_live_test_begin(&t, i915, __func__, engine->name);
  772. if (err)
  773. return err;
  774. err = __cancel_inactive(engine);
  775. if (err == 0)
  776. err = __cancel_active(engine);
  777. if (err == 0)
  778. err = __cancel_completed(engine);
  779. err2 = igt_live_test_end(&t);
  780. if (err)
  781. return err;
  782. if (err2)
  783. return err2;
  784. /* Expects reset so call outside of igt_live_test_* */
  785. err = __cancel_reset(i915, engine);
  786. if (err)
  787. return err;
  788. if (igt_flush_test(i915))
  789. return -EIO;
  790. }
  791. return 0;
  792. }
  793. static struct i915_vma *empty_batch(struct intel_gt *gt)
  794. {
  795. struct drm_i915_gem_object *obj;
  796. struct i915_vma *vma;
  797. u32 *cmd;
  798. int err;
  799. obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
  800. if (IS_ERR(obj))
  801. return ERR_CAST(obj);
  802. cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
  803. if (IS_ERR(cmd)) {
  804. err = PTR_ERR(cmd);
  805. goto err;
  806. }
  807. *cmd = MI_BATCH_BUFFER_END;
  808. __i915_gem_object_flush_map(obj, 0, 64);
  809. i915_gem_object_unpin_map(obj);
  810. intel_gt_chipset_flush(gt);
  811. vma = i915_vma_instance(obj, gt->vm, NULL);
  812. if (IS_ERR(vma)) {
  813. err = PTR_ERR(vma);
  814. goto err;
  815. }
  816. err = i915_vma_pin(vma, 0, 0, PIN_USER);
  817. if (err)
  818. goto err;
  819. /* Force the wait now to avoid including it in the benchmark */
  820. err = i915_vma_sync(vma);
  821. if (err)
  822. goto err_pin;
  823. return vma;
  824. err_pin:
  825. i915_vma_unpin(vma);
  826. err:
  827. i915_gem_object_put(obj);
  828. return ERR_PTR(err);
  829. }
  830. static int emit_bb_start(struct i915_request *rq, struct i915_vma *batch)
  831. {
  832. return rq->engine->emit_bb_start(rq,
  833. i915_vma_offset(batch),
  834. i915_vma_size(batch),
  835. 0);
  836. }
  837. static struct i915_request *
  838. empty_request(struct intel_engine_cs *engine,
  839. struct i915_vma *batch)
  840. {
  841. struct i915_request *request;
  842. int err;
  843. request = i915_request_create(engine->kernel_context);
  844. if (IS_ERR(request))
  845. return request;
  846. err = emit_bb_start(request, batch);
  847. if (err)
  848. goto out_request;
  849. i915_request_get(request);
  850. out_request:
  851. i915_request_add(request);
  852. return err ? ERR_PTR(err) : request;
  853. }
  854. static int live_empty_request(void *arg)
  855. {
  856. struct drm_i915_private *i915 = arg;
  857. struct intel_engine_cs *engine;
  858. struct igt_live_test t;
  859. int err;
  860. /*
  861. * Submit various sized batches of empty requests, to each engine
  862. * (individually), and wait for the batch to complete. We can check
  863. * the overhead of submitting requests to the hardware.
  864. */
  865. for_each_uabi_engine(engine, i915) {
  866. IGT_TIMEOUT(end_time);
  867. struct i915_request *request;
  868. struct i915_vma *batch;
  869. unsigned long n, prime;
  870. ktime_t times[2] = {};
  871. batch = empty_batch(engine->gt);
  872. if (IS_ERR(batch))
  873. return PTR_ERR(batch);
  874. err = igt_live_test_begin(&t, i915, __func__, engine->name);
  875. if (err)
  876. goto out_batch;
  877. intel_engine_pm_get(engine);
  878. /* Warmup / preload */
  879. request = empty_request(engine, batch);
  880. if (IS_ERR(request)) {
  881. err = PTR_ERR(request);
  882. intel_engine_pm_put(engine);
  883. goto out_batch;
  884. }
  885. i915_request_wait(request, 0, MAX_SCHEDULE_TIMEOUT);
  886. for_each_prime_number_from(prime, 1, 8192) {
  887. times[1] = ktime_get_raw();
  888. for (n = 0; n < prime; n++) {
  889. i915_request_put(request);
  890. request = empty_request(engine, batch);
  891. if (IS_ERR(request)) {
  892. err = PTR_ERR(request);
  893. intel_engine_pm_put(engine);
  894. goto out_batch;
  895. }
  896. }
  897. i915_request_wait(request, 0, MAX_SCHEDULE_TIMEOUT);
  898. times[1] = ktime_sub(ktime_get_raw(), times[1]);
  899. if (prime == 1)
  900. times[0] = times[1];
  901. if (__igt_timeout(end_time, NULL))
  902. break;
  903. }
  904. i915_request_put(request);
  905. intel_engine_pm_put(engine);
  906. err = igt_live_test_end(&t);
  907. if (err)
  908. goto out_batch;
  909. pr_info("Batch latencies on %s: 1 = %lluns, %lu = %lluns\n",
  910. engine->name,
  911. ktime_to_ns(times[0]),
  912. prime, div64_u64(ktime_to_ns(times[1]), prime));
  913. out_batch:
  914. i915_vma_unpin(batch);
  915. i915_vma_put(batch);
  916. if (err)
  917. break;
  918. }
  919. return err;
  920. }
  921. static struct i915_vma *recursive_batch(struct intel_gt *gt)
  922. {
  923. struct drm_i915_gem_object *obj;
  924. const int ver = GRAPHICS_VER(gt->i915);
  925. struct i915_vma *vma;
  926. u32 *cmd;
  927. int err;
  928. obj = i915_gem_object_create_internal(gt->i915, PAGE_SIZE);
  929. if (IS_ERR(obj))
  930. return ERR_CAST(obj);
  931. vma = i915_vma_instance(obj, gt->vm, NULL);
  932. if (IS_ERR(vma)) {
  933. err = PTR_ERR(vma);
  934. goto err;
  935. }
  936. err = i915_vma_pin(vma, 0, 0, PIN_USER);
  937. if (err)
  938. goto err;
  939. cmd = i915_gem_object_pin_map_unlocked(obj, I915_MAP_WC);
  940. if (IS_ERR(cmd)) {
  941. err = PTR_ERR(cmd);
  942. goto err;
  943. }
  944. if (ver >= 8) {
  945. *cmd++ = MI_BATCH_BUFFER_START | 1 << 8 | 1;
  946. *cmd++ = lower_32_bits(i915_vma_offset(vma));
  947. *cmd++ = upper_32_bits(i915_vma_offset(vma));
  948. } else if (ver >= 6) {
  949. *cmd++ = MI_BATCH_BUFFER_START | 1 << 8;
  950. *cmd++ = lower_32_bits(i915_vma_offset(vma));
  951. } else {
  952. *cmd++ = MI_BATCH_BUFFER_START | MI_BATCH_GTT;
  953. *cmd++ = lower_32_bits(i915_vma_offset(vma));
  954. }
  955. *cmd++ = MI_BATCH_BUFFER_END; /* terminate early in case of error */
  956. __i915_gem_object_flush_map(obj, 0, 64);
  957. i915_gem_object_unpin_map(obj);
  958. intel_gt_chipset_flush(gt);
  959. return vma;
  960. err:
  961. i915_gem_object_put(obj);
  962. return ERR_PTR(err);
  963. }
  964. static int recursive_batch_resolve(struct i915_vma *batch)
  965. {
  966. u32 *cmd;
  967. cmd = i915_gem_object_pin_map_unlocked(batch->obj, I915_MAP_WC);
  968. if (IS_ERR(cmd))
  969. return PTR_ERR(cmd);
  970. *cmd = MI_BATCH_BUFFER_END;
  971. __i915_gem_object_flush_map(batch->obj, 0, sizeof(*cmd));
  972. i915_gem_object_unpin_map(batch->obj);
  973. intel_gt_chipset_flush(batch->vm->gt);
  974. return 0;
  975. }
  976. static int live_all_engines(void *arg)
  977. {
  978. struct drm_i915_private *i915 = arg;
  979. const unsigned int nengines = num_uabi_engines(i915);
  980. struct intel_engine_cs *engine;
  981. struct i915_request **request;
  982. struct igt_live_test t;
  983. unsigned int idx;
  984. int err;
  985. /*
  986. * Check we can submit requests to all engines simultaneously. We
  987. * send a recursive batch to each engine - checking that we don't
  988. * block doing so, and that they don't complete too soon.
  989. */
  990. request = kzalloc_objs(*request, nengines);
  991. if (!request)
  992. return -ENOMEM;
  993. err = igt_live_test_begin(&t, i915, __func__, "");
  994. if (err)
  995. goto out_free;
  996. idx = 0;
  997. for_each_uabi_engine(engine, i915) {
  998. struct i915_vma *batch;
  999. batch = recursive_batch(engine->gt);
  1000. if (IS_ERR(batch)) {
  1001. err = PTR_ERR(batch);
  1002. pr_err("%s: Unable to create batch, err=%d\n",
  1003. __func__, err);
  1004. goto out_free;
  1005. }
  1006. i915_vma_lock(batch);
  1007. request[idx] = intel_engine_create_kernel_request(engine);
  1008. if (IS_ERR(request[idx])) {
  1009. err = PTR_ERR(request[idx]);
  1010. pr_err("%s: Request allocation failed with err=%d\n",
  1011. __func__, err);
  1012. goto out_unlock;
  1013. }
  1014. GEM_BUG_ON(request[idx]->context->vm != batch->vm);
  1015. err = i915_vma_move_to_active(batch, request[idx], 0);
  1016. GEM_BUG_ON(err);
  1017. err = emit_bb_start(request[idx], batch);
  1018. GEM_BUG_ON(err);
  1019. request[idx]->batch = batch;
  1020. i915_request_get(request[idx]);
  1021. i915_request_add(request[idx]);
  1022. idx++;
  1023. out_unlock:
  1024. i915_vma_unlock(batch);
  1025. if (err)
  1026. goto out_request;
  1027. }
  1028. idx = 0;
  1029. for_each_uabi_engine(engine, i915) {
  1030. if (i915_request_completed(request[idx])) {
  1031. pr_err("%s(%s): request completed too early!\n",
  1032. __func__, engine->name);
  1033. err = -EINVAL;
  1034. goto out_request;
  1035. }
  1036. idx++;
  1037. }
  1038. idx = 0;
  1039. for_each_uabi_engine(engine, i915) {
  1040. err = recursive_batch_resolve(request[idx]->batch);
  1041. if (err) {
  1042. pr_err("%s: failed to resolve batch, err=%d\n",
  1043. __func__, err);
  1044. goto out_request;
  1045. }
  1046. idx++;
  1047. }
  1048. idx = 0;
  1049. for_each_uabi_engine(engine, i915) {
  1050. struct i915_request *rq = request[idx];
  1051. long timeout;
  1052. timeout = i915_request_wait(rq, 0,
  1053. MAX_SCHEDULE_TIMEOUT);
  1054. if (timeout < 0) {
  1055. err = timeout;
  1056. pr_err("%s: error waiting for request on %s, err=%d\n",
  1057. __func__, engine->name, err);
  1058. goto out_request;
  1059. }
  1060. GEM_BUG_ON(!i915_request_completed(rq));
  1061. i915_vma_unpin(rq->batch);
  1062. i915_vma_put(rq->batch);
  1063. i915_request_put(rq);
  1064. request[idx] = NULL;
  1065. idx++;
  1066. }
  1067. err = igt_live_test_end(&t);
  1068. out_request:
  1069. idx = 0;
  1070. for_each_uabi_engine(engine, i915) {
  1071. struct i915_request *rq = request[idx];
  1072. if (!rq)
  1073. continue;
  1074. if (rq->batch) {
  1075. i915_vma_unpin(rq->batch);
  1076. i915_vma_put(rq->batch);
  1077. }
  1078. i915_request_put(rq);
  1079. idx++;
  1080. }
  1081. out_free:
  1082. kfree(request);
  1083. return err;
  1084. }
  1085. static int live_sequential_engines(void *arg)
  1086. {
  1087. struct drm_i915_private *i915 = arg;
  1088. const unsigned int nengines = num_uabi_engines(i915);
  1089. struct i915_request **request;
  1090. struct i915_request *prev = NULL;
  1091. struct intel_engine_cs *engine;
  1092. struct igt_live_test t;
  1093. unsigned int idx;
  1094. int err;
  1095. /*
  1096. * Check we can submit requests to all engines sequentially, such
  1097. * that each successive request waits for the earlier ones. This
  1098. * tests that we don't execute requests out of order, even though
  1099. * they are running on independent engines.
  1100. */
  1101. request = kzalloc_objs(*request, nengines);
  1102. if (!request)
  1103. return -ENOMEM;
  1104. err = igt_live_test_begin(&t, i915, __func__, "");
  1105. if (err)
  1106. goto out_free;
  1107. idx = 0;
  1108. for_each_uabi_engine(engine, i915) {
  1109. struct i915_vma *batch;
  1110. batch = recursive_batch(engine->gt);
  1111. if (IS_ERR(batch)) {
  1112. err = PTR_ERR(batch);
  1113. pr_err("%s: Unable to create batch for %s, err=%d\n",
  1114. __func__, engine->name, err);
  1115. goto out_free;
  1116. }
  1117. i915_vma_lock(batch);
  1118. request[idx] = intel_engine_create_kernel_request(engine);
  1119. if (IS_ERR(request[idx])) {
  1120. err = PTR_ERR(request[idx]);
  1121. pr_err("%s: Request allocation failed for %s with err=%d\n",
  1122. __func__, engine->name, err);
  1123. goto out_unlock;
  1124. }
  1125. GEM_BUG_ON(request[idx]->context->vm != batch->vm);
  1126. if (prev) {
  1127. err = i915_request_await_dma_fence(request[idx],
  1128. &prev->fence);
  1129. if (err) {
  1130. i915_request_add(request[idx]);
  1131. pr_err("%s: Request await failed for %s with err=%d\n",
  1132. __func__, engine->name, err);
  1133. goto out_unlock;
  1134. }
  1135. }
  1136. err = i915_vma_move_to_active(batch, request[idx], 0);
  1137. GEM_BUG_ON(err);
  1138. err = emit_bb_start(request[idx], batch);
  1139. GEM_BUG_ON(err);
  1140. request[idx]->batch = batch;
  1141. i915_request_get(request[idx]);
  1142. i915_request_add(request[idx]);
  1143. prev = request[idx];
  1144. idx++;
  1145. out_unlock:
  1146. i915_vma_unlock(batch);
  1147. if (err)
  1148. goto out_request;
  1149. }
  1150. idx = 0;
  1151. for_each_uabi_engine(engine, i915) {
  1152. long timeout;
  1153. if (i915_request_completed(request[idx])) {
  1154. pr_err("%s(%s): request completed too early!\n",
  1155. __func__, engine->name);
  1156. err = -EINVAL;
  1157. goto out_request;
  1158. }
  1159. err = recursive_batch_resolve(request[idx]->batch);
  1160. if (err) {
  1161. pr_err("%s: failed to resolve batch, err=%d\n",
  1162. __func__, err);
  1163. goto out_request;
  1164. }
  1165. timeout = i915_request_wait(request[idx], 0,
  1166. MAX_SCHEDULE_TIMEOUT);
  1167. if (timeout < 0) {
  1168. err = timeout;
  1169. pr_err("%s: error waiting for request on %s, err=%d\n",
  1170. __func__, engine->name, err);
  1171. goto out_request;
  1172. }
  1173. GEM_BUG_ON(!i915_request_completed(request[idx]));
  1174. idx++;
  1175. }
  1176. err = igt_live_test_end(&t);
  1177. out_request:
  1178. idx = 0;
  1179. for_each_uabi_engine(engine, i915) {
  1180. u32 *cmd;
  1181. if (!request[idx])
  1182. break;
  1183. cmd = i915_gem_object_pin_map_unlocked(request[idx]->batch->obj,
  1184. I915_MAP_WC);
  1185. if (!IS_ERR(cmd)) {
  1186. *cmd = MI_BATCH_BUFFER_END;
  1187. __i915_gem_object_flush_map(request[idx]->batch->obj,
  1188. 0, sizeof(*cmd));
  1189. i915_gem_object_unpin_map(request[idx]->batch->obj);
  1190. intel_gt_chipset_flush(engine->gt);
  1191. }
  1192. i915_vma_put(request[idx]->batch);
  1193. i915_request_put(request[idx]);
  1194. idx++;
  1195. }
  1196. out_free:
  1197. kfree(request);
  1198. return err;
  1199. }
  1200. struct parallel_thread {
  1201. struct kthread_worker *worker;
  1202. struct kthread_work work;
  1203. struct intel_engine_cs *engine;
  1204. int result;
  1205. };
  1206. static void __live_parallel_engine1(struct kthread_work *work)
  1207. {
  1208. struct parallel_thread *thread =
  1209. container_of(work, typeof(*thread), work);
  1210. struct intel_engine_cs *engine = thread->engine;
  1211. IGT_TIMEOUT(end_time);
  1212. unsigned long count;
  1213. int err = 0;
  1214. count = 0;
  1215. intel_engine_pm_get(engine);
  1216. do {
  1217. struct i915_request *rq;
  1218. rq = i915_request_create(engine->kernel_context);
  1219. if (IS_ERR(rq)) {
  1220. err = PTR_ERR(rq);
  1221. break;
  1222. }
  1223. i915_request_get(rq);
  1224. i915_request_add(rq);
  1225. err = 0;
  1226. if (i915_request_wait(rq, 0, HZ) < 0)
  1227. err = -ETIME;
  1228. i915_request_put(rq);
  1229. if (err)
  1230. break;
  1231. count++;
  1232. } while (!__igt_timeout(end_time, NULL));
  1233. intel_engine_pm_put(engine);
  1234. pr_info("%s: %lu request + sync\n", engine->name, count);
  1235. thread->result = err;
  1236. }
  1237. static void __live_parallel_engineN(struct kthread_work *work)
  1238. {
  1239. struct parallel_thread *thread =
  1240. container_of(work, typeof(*thread), work);
  1241. struct intel_engine_cs *engine = thread->engine;
  1242. IGT_TIMEOUT(end_time);
  1243. unsigned long count;
  1244. int err = 0;
  1245. count = 0;
  1246. intel_engine_pm_get(engine);
  1247. do {
  1248. struct i915_request *rq;
  1249. rq = i915_request_create(engine->kernel_context);
  1250. if (IS_ERR(rq)) {
  1251. err = PTR_ERR(rq);
  1252. break;
  1253. }
  1254. i915_request_add(rq);
  1255. count++;
  1256. } while (!__igt_timeout(end_time, NULL));
  1257. intel_engine_pm_put(engine);
  1258. pr_info("%s: %lu requests\n", engine->name, count);
  1259. thread->result = err;
  1260. }
  1261. static bool wake_all(struct drm_i915_private *i915)
  1262. {
  1263. if (atomic_dec_and_test(&i915->selftest.counter)) {
  1264. wake_up_var(&i915->selftest.counter);
  1265. return true;
  1266. }
  1267. return false;
  1268. }
  1269. static int wait_for_all(struct drm_i915_private *i915)
  1270. {
  1271. if (wake_all(i915))
  1272. return 0;
  1273. if (wait_var_event_timeout(&i915->selftest.counter,
  1274. !atomic_read(&i915->selftest.counter),
  1275. i915_selftest.timeout_jiffies))
  1276. return 0;
  1277. return -ETIME;
  1278. }
  1279. static void __live_parallel_spin(struct kthread_work *work)
  1280. {
  1281. struct parallel_thread *thread =
  1282. container_of(work, typeof(*thread), work);
  1283. struct intel_engine_cs *engine = thread->engine;
  1284. struct igt_spinner spin;
  1285. struct i915_request *rq;
  1286. int err = 0;
  1287. /*
  1288. * Create a spinner running for eternity on each engine. If a second
  1289. * spinner is incorrectly placed on the same engine, it will not be
  1290. * able to start in time.
  1291. */
  1292. if (igt_spinner_init(&spin, engine->gt)) {
  1293. wake_all(engine->i915);
  1294. thread->result = -ENOMEM;
  1295. return;
  1296. }
  1297. intel_engine_pm_get(engine);
  1298. rq = igt_spinner_create_request(&spin,
  1299. engine->kernel_context,
  1300. MI_NOOP); /* no preemption */
  1301. intel_engine_pm_put(engine);
  1302. if (IS_ERR(rq)) {
  1303. err = PTR_ERR(rq);
  1304. if (err == -ENODEV)
  1305. err = 0;
  1306. wake_all(engine->i915);
  1307. goto out_spin;
  1308. }
  1309. i915_request_get(rq);
  1310. i915_request_add(rq);
  1311. if (igt_wait_for_spinner(&spin, rq)) {
  1312. /* Occupy this engine for the whole test */
  1313. err = wait_for_all(engine->i915);
  1314. } else {
  1315. pr_err("Failed to start spinner on %s\n", engine->name);
  1316. err = -EINVAL;
  1317. }
  1318. igt_spinner_end(&spin);
  1319. if (err == 0 && i915_request_wait(rq, 0, HZ) < 0)
  1320. err = -EIO;
  1321. i915_request_put(rq);
  1322. out_spin:
  1323. igt_spinner_fini(&spin);
  1324. thread->result = err;
  1325. }
  1326. static int live_parallel_engines(void *arg)
  1327. {
  1328. struct drm_i915_private *i915 = arg;
  1329. static void (* const func[])(struct kthread_work *) = {
  1330. __live_parallel_engine1,
  1331. __live_parallel_engineN,
  1332. __live_parallel_spin,
  1333. NULL,
  1334. };
  1335. const unsigned int nengines = num_uabi_engines(i915);
  1336. struct parallel_thread *threads;
  1337. struct intel_engine_cs *engine;
  1338. void (* const *fn)(struct kthread_work *);
  1339. int err = 0;
  1340. /*
  1341. * Check we can submit requests to all engines concurrently. This
  1342. * tests that we load up the system maximally.
  1343. */
  1344. threads = kzalloc_objs(*threads, nengines);
  1345. if (!threads)
  1346. return -ENOMEM;
  1347. for (fn = func; !err && *fn; fn++) {
  1348. char name[KSYM_NAME_LEN];
  1349. struct igt_live_test t;
  1350. unsigned int idx;
  1351. snprintf(name, sizeof(name), "%ps", *fn);
  1352. err = igt_live_test_begin(&t, i915, __func__, name);
  1353. if (err)
  1354. break;
  1355. atomic_set(&i915->selftest.counter, nengines);
  1356. idx = 0;
  1357. for_each_uabi_engine(engine, i915) {
  1358. struct kthread_worker *worker;
  1359. worker = kthread_run_worker(0, "igt/parallel:%s",
  1360. engine->name);
  1361. if (IS_ERR(worker)) {
  1362. err = PTR_ERR(worker);
  1363. break;
  1364. }
  1365. threads[idx].worker = worker;
  1366. threads[idx].result = 0;
  1367. threads[idx].engine = engine;
  1368. kthread_init_work(&threads[idx].work, *fn);
  1369. kthread_queue_work(worker, &threads[idx].work);
  1370. idx++;
  1371. }
  1372. idx = 0;
  1373. for_each_uabi_engine(engine, i915) {
  1374. int status;
  1375. if (!threads[idx].worker)
  1376. break;
  1377. kthread_flush_work(&threads[idx].work);
  1378. status = READ_ONCE(threads[idx].result);
  1379. if (status && !err)
  1380. err = status;
  1381. kthread_destroy_worker(threads[idx++].worker);
  1382. }
  1383. if (igt_live_test_end(&t))
  1384. err = -EIO;
  1385. }
  1386. kfree(threads);
  1387. return err;
  1388. }
  1389. static int
  1390. max_batches(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
  1391. {
  1392. struct i915_request *rq;
  1393. int ret;
  1394. /*
  1395. * Before execlists, all contexts share the same ringbuffer. With
  1396. * execlists, each context/engine has a separate ringbuffer and
  1397. * for the purposes of this test, inexhaustible.
  1398. *
  1399. * For the global ringbuffer though, we have to be very careful
  1400. * that we do not wrap while preventing the execution of requests
  1401. * with a unsignaled fence.
  1402. */
  1403. if (HAS_EXECLISTS(ctx->i915))
  1404. return INT_MAX;
  1405. rq = igt_request_alloc(ctx, engine);
  1406. if (IS_ERR(rq)) {
  1407. ret = PTR_ERR(rq);
  1408. } else {
  1409. int sz;
  1410. ret = rq->ring->size - rq->reserved_space;
  1411. i915_request_add(rq);
  1412. sz = rq->ring->emit - rq->head;
  1413. if (sz < 0)
  1414. sz += rq->ring->size;
  1415. ret /= sz;
  1416. ret /= 2; /* leave half spare, in case of emergency! */
  1417. }
  1418. return ret;
  1419. }
  1420. static int live_breadcrumbs_smoketest(void *arg)
  1421. {
  1422. struct drm_i915_private *i915 = arg;
  1423. const unsigned int nengines = num_uabi_engines(i915);
  1424. const unsigned int ncpus = /* saturate with nengines * ncpus */
  1425. max_t(int, 2, DIV_ROUND_UP(num_online_cpus(), nengines));
  1426. unsigned long num_waits, num_fences;
  1427. struct intel_engine_cs *engine;
  1428. struct smoke_thread *threads;
  1429. struct igt_live_test live;
  1430. intel_wakeref_t wakeref;
  1431. struct smoketest *smoke;
  1432. unsigned int n, idx;
  1433. struct file *file;
  1434. int ret = 0;
  1435. /*
  1436. * Smoketest our breadcrumb/signal handling for requests across multiple
  1437. * threads. A very simple test to only catch the most egregious of bugs.
  1438. * See __igt_breadcrumbs_smoketest();
  1439. *
  1440. * On real hardware this time.
  1441. */
  1442. wakeref = intel_runtime_pm_get(&i915->runtime_pm);
  1443. file = mock_file(i915);
  1444. if (IS_ERR(file)) {
  1445. ret = PTR_ERR(file);
  1446. goto out_rpm;
  1447. }
  1448. smoke = kzalloc_objs(*smoke, nengines);
  1449. if (!smoke) {
  1450. ret = -ENOMEM;
  1451. goto out_file;
  1452. }
  1453. threads = kzalloc_objs(*threads, ncpus * nengines);
  1454. if (!threads) {
  1455. ret = -ENOMEM;
  1456. goto out_smoke;
  1457. }
  1458. smoke[0].request_alloc = __live_request_alloc;
  1459. smoke[0].ncontexts = 64;
  1460. smoke[0].contexts = kzalloc_objs(*smoke[0].contexts, smoke[0].ncontexts);
  1461. if (!smoke[0].contexts) {
  1462. ret = -ENOMEM;
  1463. goto out_threads;
  1464. }
  1465. for (n = 0; n < smoke[0].ncontexts; n++) {
  1466. smoke[0].contexts[n] = live_context(i915, file);
  1467. if (IS_ERR(smoke[0].contexts[n])) {
  1468. ret = PTR_ERR(smoke[0].contexts[n]);
  1469. goto out_contexts;
  1470. }
  1471. }
  1472. ret = igt_live_test_begin(&live, i915, __func__, "");
  1473. if (ret)
  1474. goto out_contexts;
  1475. idx = 0;
  1476. for_each_uabi_engine(engine, i915) {
  1477. smoke[idx] = smoke[0];
  1478. smoke[idx].engine = engine;
  1479. smoke[idx].max_batch =
  1480. max_batches(smoke[0].contexts[0], engine);
  1481. if (smoke[idx].max_batch < 0) {
  1482. ret = smoke[idx].max_batch;
  1483. goto out_flush;
  1484. }
  1485. /* One ring interleaved between requests from all cpus */
  1486. smoke[idx].max_batch /= ncpus + 1;
  1487. pr_debug("Limiting batches to %d requests on %s\n",
  1488. smoke[idx].max_batch, engine->name);
  1489. for (n = 0; n < ncpus; n++) {
  1490. unsigned int i = idx * ncpus + n;
  1491. struct kthread_worker *worker;
  1492. worker = kthread_run_worker(0, "igt/%d.%d", idx, n);
  1493. if (IS_ERR(worker)) {
  1494. ret = PTR_ERR(worker);
  1495. goto out_flush;
  1496. }
  1497. threads[i].worker = worker;
  1498. threads[i].t = &smoke[idx];
  1499. kthread_init_work(&threads[i].work,
  1500. __igt_breadcrumbs_smoketest);
  1501. kthread_queue_work(worker, &threads[i].work);
  1502. }
  1503. idx++;
  1504. }
  1505. msleep(jiffies_to_msecs(i915_selftest.timeout_jiffies));
  1506. out_flush:
  1507. idx = 0;
  1508. num_waits = 0;
  1509. num_fences = 0;
  1510. for_each_uabi_engine(engine, i915) {
  1511. for (n = 0; n < ncpus; n++) {
  1512. unsigned int i = idx * ncpus + n;
  1513. int err;
  1514. if (!threads[i].worker)
  1515. continue;
  1516. WRITE_ONCE(threads[i].stop, true);
  1517. kthread_flush_work(&threads[i].work);
  1518. err = READ_ONCE(threads[i].result);
  1519. if (err < 0 && !ret)
  1520. ret = err;
  1521. kthread_destroy_worker(threads[i].worker);
  1522. }
  1523. num_waits += atomic_long_read(&smoke[idx].num_waits);
  1524. num_fences += atomic_long_read(&smoke[idx].num_fences);
  1525. idx++;
  1526. }
  1527. pr_info("Completed %lu waits for %lu fences across %d engines and %d cpus\n",
  1528. num_waits, num_fences, idx, ncpus);
  1529. ret = igt_live_test_end(&live) ?: ret;
  1530. out_contexts:
  1531. kfree(smoke[0].contexts);
  1532. out_threads:
  1533. kfree(threads);
  1534. out_smoke:
  1535. kfree(smoke);
  1536. out_file:
  1537. fput(file);
  1538. out_rpm:
  1539. intel_runtime_pm_put(&i915->runtime_pm, wakeref);
  1540. return ret;
  1541. }
  1542. int i915_request_live_selftests(struct drm_i915_private *i915)
  1543. {
  1544. static const struct i915_subtest tests[] = {
  1545. SUBTEST(live_nop_request),
  1546. SUBTEST(live_all_engines),
  1547. SUBTEST(live_sequential_engines),
  1548. SUBTEST(live_parallel_engines),
  1549. SUBTEST(live_empty_request),
  1550. SUBTEST(live_cancel_request),
  1551. SUBTEST(live_breadcrumbs_smoketest),
  1552. };
  1553. if (intel_gt_is_wedged(to_gt(i915)))
  1554. return 0;
  1555. return i915_live_subtests(tests, i915);
  1556. }
  1557. static int switch_to_kernel_sync(struct intel_context *ce, int err)
  1558. {
  1559. struct i915_request *rq;
  1560. struct dma_fence *fence;
  1561. rq = intel_engine_create_kernel_request(ce->engine);
  1562. if (IS_ERR(rq))
  1563. return PTR_ERR(rq);
  1564. fence = i915_active_fence_get(&ce->timeline->last_request);
  1565. if (fence) {
  1566. i915_request_await_dma_fence(rq, fence);
  1567. dma_fence_put(fence);
  1568. }
  1569. rq = i915_request_get(rq);
  1570. i915_request_add(rq);
  1571. if (i915_request_wait(rq, 0, HZ / 2) < 0 && !err)
  1572. err = -ETIME;
  1573. i915_request_put(rq);
  1574. while (!err && !intel_engine_is_idle(ce->engine))
  1575. intel_engine_flush_submission(ce->engine);
  1576. return err;
  1577. }
  1578. struct perf_stats {
  1579. struct intel_engine_cs *engine;
  1580. unsigned long count;
  1581. ktime_t time;
  1582. ktime_t busy;
  1583. u64 runtime;
  1584. };
  1585. struct perf_series {
  1586. struct drm_i915_private *i915;
  1587. unsigned int nengines;
  1588. struct intel_context *ce[] __counted_by(nengines);
  1589. };
  1590. static int cmp_u32(const void *A, const void *B)
  1591. {
  1592. const u32 *a = A, *b = B;
  1593. return *a - *b;
  1594. }
  1595. static u32 trifilter(u32 *a)
  1596. {
  1597. u64 sum;
  1598. #define TF_COUNT 5
  1599. sort(a, TF_COUNT, sizeof(*a), cmp_u32, NULL);
  1600. sum = mul_u32_u32(a[2], 2);
  1601. sum += a[1];
  1602. sum += a[3];
  1603. GEM_BUG_ON(sum > U32_MAX);
  1604. return sum;
  1605. #define TF_BIAS 2
  1606. }
  1607. static u64 cycles_to_ns(struct intel_engine_cs *engine, u32 cycles)
  1608. {
  1609. u64 ns = intel_gt_clock_interval_to_ns(engine->gt, cycles);
  1610. return DIV_ROUND_CLOSEST(ns, 1 << TF_BIAS);
  1611. }
  1612. static u32 *emit_timestamp_store(u32 *cs, struct intel_context *ce, u32 offset)
  1613. {
  1614. *cs++ = MI_STORE_REGISTER_MEM_GEN8 | MI_USE_GGTT;
  1615. *cs++ = i915_mmio_reg_offset(RING_TIMESTAMP((ce->engine->mmio_base)));
  1616. *cs++ = offset;
  1617. *cs++ = 0;
  1618. return cs;
  1619. }
  1620. static u32 *emit_store_dw(u32 *cs, u32 offset, u32 value)
  1621. {
  1622. *cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
  1623. *cs++ = offset;
  1624. *cs++ = 0;
  1625. *cs++ = value;
  1626. return cs;
  1627. }
  1628. static u32 *emit_semaphore_poll(u32 *cs, u32 mode, u32 value, u32 offset)
  1629. {
  1630. *cs++ = MI_SEMAPHORE_WAIT |
  1631. MI_SEMAPHORE_GLOBAL_GTT |
  1632. MI_SEMAPHORE_POLL |
  1633. mode;
  1634. *cs++ = value;
  1635. *cs++ = offset;
  1636. *cs++ = 0;
  1637. return cs;
  1638. }
  1639. static u32 *emit_semaphore_poll_until(u32 *cs, u32 offset, u32 value)
  1640. {
  1641. return emit_semaphore_poll(cs, MI_SEMAPHORE_SAD_EQ_SDD, value, offset);
  1642. }
  1643. static void semaphore_set(u32 *sema, u32 value)
  1644. {
  1645. WRITE_ONCE(*sema, value);
  1646. wmb(); /* flush the update to the cache, and beyond */
  1647. }
  1648. static u32 *hwsp_scratch(const struct intel_context *ce)
  1649. {
  1650. return memset32(ce->engine->status_page.addr + 1000, 0, 21);
  1651. }
  1652. static u32 hwsp_offset(const struct intel_context *ce, u32 *dw)
  1653. {
  1654. return (i915_ggtt_offset(ce->engine->status_page.vma) +
  1655. offset_in_page(dw));
  1656. }
  1657. static int measure_semaphore_response(struct intel_context *ce)
  1658. {
  1659. u32 *sema = hwsp_scratch(ce);
  1660. const u32 offset = hwsp_offset(ce, sema);
  1661. u32 elapsed[TF_COUNT], cycles;
  1662. struct i915_request *rq;
  1663. u32 *cs;
  1664. int err;
  1665. int i;
  1666. /*
  1667. * Measure how many cycles it takes for the HW to detect the change
  1668. * in a semaphore value.
  1669. *
  1670. * A: read CS_TIMESTAMP from CPU
  1671. * poke semaphore
  1672. * B: read CS_TIMESTAMP on GPU
  1673. *
  1674. * Semaphore latency: B - A
  1675. */
  1676. semaphore_set(sema, -1);
  1677. rq = i915_request_create(ce);
  1678. if (IS_ERR(rq))
  1679. return PTR_ERR(rq);
  1680. cs = intel_ring_begin(rq, 4 + 12 * ARRAY_SIZE(elapsed));
  1681. if (IS_ERR(cs)) {
  1682. i915_request_add(rq);
  1683. err = PTR_ERR(cs);
  1684. goto err;
  1685. }
  1686. cs = emit_store_dw(cs, offset, 0);
  1687. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  1688. cs = emit_semaphore_poll_until(cs, offset, i);
  1689. cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
  1690. cs = emit_store_dw(cs, offset, 0);
  1691. }
  1692. intel_ring_advance(rq, cs);
  1693. i915_request_add(rq);
  1694. if (wait_for(READ_ONCE(*sema) == 0, 50)) {
  1695. err = -EIO;
  1696. goto err;
  1697. }
  1698. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  1699. preempt_disable();
  1700. cycles = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
  1701. semaphore_set(sema, i);
  1702. preempt_enable();
  1703. if (wait_for(READ_ONCE(*sema) == 0, 50)) {
  1704. err = -EIO;
  1705. goto err;
  1706. }
  1707. elapsed[i - 1] = sema[i] - cycles;
  1708. }
  1709. cycles = trifilter(elapsed);
  1710. pr_info("%s: semaphore response %d cycles, %lluns\n",
  1711. ce->engine->name, cycles >> TF_BIAS,
  1712. cycles_to_ns(ce->engine, cycles));
  1713. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  1714. err:
  1715. intel_gt_set_wedged(ce->engine->gt);
  1716. return err;
  1717. }
  1718. static int measure_idle_dispatch(struct intel_context *ce)
  1719. {
  1720. u32 *sema = hwsp_scratch(ce);
  1721. const u32 offset = hwsp_offset(ce, sema);
  1722. u32 elapsed[TF_COUNT], cycles;
  1723. u32 *cs;
  1724. int err;
  1725. int i;
  1726. /*
  1727. * Measure how long it takes for us to submit a request while the
  1728. * engine is idle, but is resting in our context.
  1729. *
  1730. * A: read CS_TIMESTAMP from CPU
  1731. * submit request
  1732. * B: read CS_TIMESTAMP on GPU
  1733. *
  1734. * Submission latency: B - A
  1735. */
  1736. for (i = 0; i < ARRAY_SIZE(elapsed); i++) {
  1737. struct i915_request *rq;
  1738. err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
  1739. if (err)
  1740. return err;
  1741. rq = i915_request_create(ce);
  1742. if (IS_ERR(rq)) {
  1743. err = PTR_ERR(rq);
  1744. goto err;
  1745. }
  1746. cs = intel_ring_begin(rq, 4);
  1747. if (IS_ERR(cs)) {
  1748. i915_request_add(rq);
  1749. err = PTR_ERR(cs);
  1750. goto err;
  1751. }
  1752. cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
  1753. intel_ring_advance(rq, cs);
  1754. preempt_disable();
  1755. local_bh_disable();
  1756. elapsed[i] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
  1757. i915_request_add(rq);
  1758. local_bh_enable();
  1759. preempt_enable();
  1760. }
  1761. err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
  1762. if (err)
  1763. goto err;
  1764. for (i = 0; i < ARRAY_SIZE(elapsed); i++)
  1765. elapsed[i] = sema[i] - elapsed[i];
  1766. cycles = trifilter(elapsed);
  1767. pr_info("%s: idle dispatch latency %d cycles, %lluns\n",
  1768. ce->engine->name, cycles >> TF_BIAS,
  1769. cycles_to_ns(ce->engine, cycles));
  1770. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  1771. err:
  1772. intel_gt_set_wedged(ce->engine->gt);
  1773. return err;
  1774. }
  1775. static int measure_busy_dispatch(struct intel_context *ce)
  1776. {
  1777. u32 *sema = hwsp_scratch(ce);
  1778. const u32 offset = hwsp_offset(ce, sema);
  1779. u32 elapsed[TF_COUNT + 1], cycles;
  1780. u32 *cs;
  1781. int err;
  1782. int i;
  1783. /*
  1784. * Measure how long it takes for us to submit a request while the
  1785. * engine is busy, polling on a semaphore in our context. With
  1786. * direct submission, this will include the cost of a lite restore.
  1787. *
  1788. * A: read CS_TIMESTAMP from CPU
  1789. * submit request
  1790. * B: read CS_TIMESTAMP on GPU
  1791. *
  1792. * Submission latency: B - A
  1793. */
  1794. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  1795. struct i915_request *rq;
  1796. rq = i915_request_create(ce);
  1797. if (IS_ERR(rq)) {
  1798. err = PTR_ERR(rq);
  1799. goto err;
  1800. }
  1801. cs = intel_ring_begin(rq, 12);
  1802. if (IS_ERR(cs)) {
  1803. i915_request_add(rq);
  1804. err = PTR_ERR(cs);
  1805. goto err;
  1806. }
  1807. cs = emit_store_dw(cs, offset + i * sizeof(u32), -1);
  1808. cs = emit_semaphore_poll_until(cs, offset, i);
  1809. cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
  1810. intel_ring_advance(rq, cs);
  1811. if (i > 1 && wait_for(READ_ONCE(sema[i - 1]), 500)) {
  1812. err = -EIO;
  1813. goto err;
  1814. }
  1815. preempt_disable();
  1816. local_bh_disable();
  1817. elapsed[i - 1] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
  1818. i915_request_add(rq);
  1819. local_bh_enable();
  1820. semaphore_set(sema, i - 1);
  1821. preempt_enable();
  1822. }
  1823. wait_for(READ_ONCE(sema[i - 1]), 500);
  1824. semaphore_set(sema, i - 1);
  1825. for (i = 1; i <= TF_COUNT; i++) {
  1826. GEM_BUG_ON(sema[i] == -1);
  1827. elapsed[i - 1] = sema[i] - elapsed[i];
  1828. }
  1829. cycles = trifilter(elapsed);
  1830. pr_info("%s: busy dispatch latency %d cycles, %lluns\n",
  1831. ce->engine->name, cycles >> TF_BIAS,
  1832. cycles_to_ns(ce->engine, cycles));
  1833. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  1834. err:
  1835. intel_gt_set_wedged(ce->engine->gt);
  1836. return err;
  1837. }
  1838. static int plug(struct intel_engine_cs *engine, u32 *sema, u32 mode, int value)
  1839. {
  1840. const u32 offset =
  1841. i915_ggtt_offset(engine->status_page.vma) +
  1842. offset_in_page(sema);
  1843. struct i915_request *rq;
  1844. u32 *cs;
  1845. rq = i915_request_create(engine->kernel_context);
  1846. if (IS_ERR(rq))
  1847. return PTR_ERR(rq);
  1848. cs = intel_ring_begin(rq, 4);
  1849. if (IS_ERR(cs)) {
  1850. i915_request_add(rq);
  1851. return PTR_ERR(cs);
  1852. }
  1853. cs = emit_semaphore_poll(cs, mode, value, offset);
  1854. intel_ring_advance(rq, cs);
  1855. i915_request_add(rq);
  1856. return 0;
  1857. }
  1858. static int measure_inter_request(struct intel_context *ce)
  1859. {
  1860. u32 *sema = hwsp_scratch(ce);
  1861. const u32 offset = hwsp_offset(ce, sema);
  1862. u32 elapsed[TF_COUNT + 1], cycles;
  1863. struct i915_sw_fence *submit;
  1864. int i, err;
  1865. /*
  1866. * Measure how long it takes to advance from one request into the
  1867. * next. Between each request we flush the GPU caches to memory,
  1868. * update the breadcrumbs, and then invalidate those caches.
  1869. * We queue up all the requests to be submitted in one batch so
  1870. * it should be one set of contiguous measurements.
  1871. *
  1872. * A: read CS_TIMESTAMP on GPU
  1873. * advance request
  1874. * B: read CS_TIMESTAMP on GPU
  1875. *
  1876. * Request latency: B - A
  1877. */
  1878. err = plug(ce->engine, sema, MI_SEMAPHORE_SAD_NEQ_SDD, 0);
  1879. if (err)
  1880. return err;
  1881. submit = heap_fence_create(GFP_KERNEL);
  1882. if (!submit) {
  1883. semaphore_set(sema, 1);
  1884. return -ENOMEM;
  1885. }
  1886. intel_engine_flush_submission(ce->engine);
  1887. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  1888. struct i915_request *rq;
  1889. u32 *cs;
  1890. rq = i915_request_create(ce);
  1891. if (IS_ERR(rq)) {
  1892. err = PTR_ERR(rq);
  1893. goto err_submit;
  1894. }
  1895. err = i915_sw_fence_await_sw_fence_gfp(&rq->submit,
  1896. submit,
  1897. GFP_KERNEL);
  1898. if (err < 0) {
  1899. i915_request_add(rq);
  1900. goto err_submit;
  1901. }
  1902. cs = intel_ring_begin(rq, 4);
  1903. if (IS_ERR(cs)) {
  1904. i915_request_add(rq);
  1905. err = PTR_ERR(cs);
  1906. goto err_submit;
  1907. }
  1908. cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
  1909. intel_ring_advance(rq, cs);
  1910. i915_request_add(rq);
  1911. }
  1912. i915_sw_fence_commit(submit);
  1913. intel_engine_flush_submission(ce->engine);
  1914. heap_fence_put(submit);
  1915. semaphore_set(sema, 1);
  1916. err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
  1917. if (err)
  1918. goto err;
  1919. for (i = 1; i <= TF_COUNT; i++)
  1920. elapsed[i - 1] = sema[i + 1] - sema[i];
  1921. cycles = trifilter(elapsed);
  1922. pr_info("%s: inter-request latency %d cycles, %lluns\n",
  1923. ce->engine->name, cycles >> TF_BIAS,
  1924. cycles_to_ns(ce->engine, cycles));
  1925. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  1926. err_submit:
  1927. i915_sw_fence_commit(submit);
  1928. heap_fence_put(submit);
  1929. semaphore_set(sema, 1);
  1930. err:
  1931. intel_gt_set_wedged(ce->engine->gt);
  1932. return err;
  1933. }
  1934. static int measure_context_switch(struct intel_context *ce)
  1935. {
  1936. u32 *sema = hwsp_scratch(ce);
  1937. const u32 offset = hwsp_offset(ce, sema);
  1938. struct i915_request *fence = NULL;
  1939. u32 elapsed[TF_COUNT + 1], cycles;
  1940. int i, j, err;
  1941. u32 *cs;
  1942. /*
  1943. * Measure how long it takes to advance from one request in one
  1944. * context to a request in another context. This allows us to
  1945. * measure how long the context save/restore take, along with all
  1946. * the inter-context setup we require.
  1947. *
  1948. * A: read CS_TIMESTAMP on GPU
  1949. * switch context
  1950. * B: read CS_TIMESTAMP on GPU
  1951. *
  1952. * Context switch latency: B - A
  1953. */
  1954. err = plug(ce->engine, sema, MI_SEMAPHORE_SAD_NEQ_SDD, 0);
  1955. if (err)
  1956. return err;
  1957. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  1958. struct intel_context *arr[] = {
  1959. ce, ce->engine->kernel_context
  1960. };
  1961. u32 addr = offset + ARRAY_SIZE(arr) * i * sizeof(u32);
  1962. for (j = 0; j < ARRAY_SIZE(arr); j++) {
  1963. struct i915_request *rq;
  1964. rq = i915_request_create(arr[j]);
  1965. if (IS_ERR(rq)) {
  1966. err = PTR_ERR(rq);
  1967. goto err_fence;
  1968. }
  1969. if (fence) {
  1970. err = i915_request_await_dma_fence(rq,
  1971. &fence->fence);
  1972. if (err) {
  1973. i915_request_add(rq);
  1974. goto err_fence;
  1975. }
  1976. }
  1977. cs = intel_ring_begin(rq, 4);
  1978. if (IS_ERR(cs)) {
  1979. i915_request_add(rq);
  1980. err = PTR_ERR(cs);
  1981. goto err_fence;
  1982. }
  1983. cs = emit_timestamp_store(cs, ce, addr);
  1984. addr += sizeof(u32);
  1985. intel_ring_advance(rq, cs);
  1986. i915_request_put(fence);
  1987. fence = i915_request_get(rq);
  1988. i915_request_add(rq);
  1989. }
  1990. }
  1991. i915_request_put(fence);
  1992. intel_engine_flush_submission(ce->engine);
  1993. semaphore_set(sema, 1);
  1994. err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
  1995. if (err)
  1996. goto err;
  1997. for (i = 1; i <= TF_COUNT; i++)
  1998. elapsed[i - 1] = sema[2 * i + 2] - sema[2 * i + 1];
  1999. cycles = trifilter(elapsed);
  2000. pr_info("%s: context switch latency %d cycles, %lluns\n",
  2001. ce->engine->name, cycles >> TF_BIAS,
  2002. cycles_to_ns(ce->engine, cycles));
  2003. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  2004. err_fence:
  2005. i915_request_put(fence);
  2006. semaphore_set(sema, 1);
  2007. err:
  2008. intel_gt_set_wedged(ce->engine->gt);
  2009. return err;
  2010. }
  2011. static int measure_preemption(struct intel_context *ce)
  2012. {
  2013. u32 *sema = hwsp_scratch(ce);
  2014. const u32 offset = hwsp_offset(ce, sema);
  2015. u32 elapsed[TF_COUNT], cycles;
  2016. u32 *cs;
  2017. int err;
  2018. int i;
  2019. /*
  2020. * We measure two latencies while triggering preemption. The first
  2021. * latency is how long it takes for us to submit a preempting request.
  2022. * The second latency is how it takes for us to return from the
  2023. * preemption back to the original context.
  2024. *
  2025. * A: read CS_TIMESTAMP from CPU
  2026. * submit preemption
  2027. * B: read CS_TIMESTAMP on GPU (in preempting context)
  2028. * context switch
  2029. * C: read CS_TIMESTAMP on GPU (in original context)
  2030. *
  2031. * Preemption dispatch latency: B - A
  2032. * Preemption switch latency: C - B
  2033. */
  2034. if (!intel_engine_has_preemption(ce->engine))
  2035. return 0;
  2036. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  2037. u32 addr = offset + 2 * i * sizeof(u32);
  2038. struct i915_request *rq;
  2039. rq = i915_request_create(ce);
  2040. if (IS_ERR(rq)) {
  2041. err = PTR_ERR(rq);
  2042. goto err;
  2043. }
  2044. cs = intel_ring_begin(rq, 12);
  2045. if (IS_ERR(cs)) {
  2046. i915_request_add(rq);
  2047. err = PTR_ERR(cs);
  2048. goto err;
  2049. }
  2050. cs = emit_store_dw(cs, addr, -1);
  2051. cs = emit_semaphore_poll_until(cs, offset, i);
  2052. cs = emit_timestamp_store(cs, ce, addr + sizeof(u32));
  2053. intel_ring_advance(rq, cs);
  2054. i915_request_add(rq);
  2055. if (wait_for(READ_ONCE(sema[2 * i]) == -1, 500)) {
  2056. err = -EIO;
  2057. goto err;
  2058. }
  2059. rq = i915_request_create(ce->engine->kernel_context);
  2060. if (IS_ERR(rq)) {
  2061. err = PTR_ERR(rq);
  2062. goto err;
  2063. }
  2064. cs = intel_ring_begin(rq, 8);
  2065. if (IS_ERR(cs)) {
  2066. i915_request_add(rq);
  2067. err = PTR_ERR(cs);
  2068. goto err;
  2069. }
  2070. cs = emit_timestamp_store(cs, ce, addr);
  2071. cs = emit_store_dw(cs, offset, i);
  2072. intel_ring_advance(rq, cs);
  2073. rq->sched.attr.priority = I915_PRIORITY_BARRIER;
  2074. elapsed[i - 1] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
  2075. i915_request_add(rq);
  2076. }
  2077. if (wait_for(READ_ONCE(sema[2 * i - 2]) != -1, 500)) {
  2078. err = -EIO;
  2079. goto err;
  2080. }
  2081. for (i = 1; i <= TF_COUNT; i++)
  2082. elapsed[i - 1] = sema[2 * i + 0] - elapsed[i - 1];
  2083. cycles = trifilter(elapsed);
  2084. pr_info("%s: preemption dispatch latency %d cycles, %lluns\n",
  2085. ce->engine->name, cycles >> TF_BIAS,
  2086. cycles_to_ns(ce->engine, cycles));
  2087. for (i = 1; i <= TF_COUNT; i++)
  2088. elapsed[i - 1] = sema[2 * i + 1] - sema[2 * i + 0];
  2089. cycles = trifilter(elapsed);
  2090. pr_info("%s: preemption switch latency %d cycles, %lluns\n",
  2091. ce->engine->name, cycles >> TF_BIAS,
  2092. cycles_to_ns(ce->engine, cycles));
  2093. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  2094. err:
  2095. intel_gt_set_wedged(ce->engine->gt);
  2096. return err;
  2097. }
  2098. struct signal_cb {
  2099. struct dma_fence_cb base;
  2100. bool seen;
  2101. };
  2102. static void signal_cb(struct dma_fence *fence, struct dma_fence_cb *cb)
  2103. {
  2104. struct signal_cb *s = container_of(cb, typeof(*s), base);
  2105. smp_store_mb(s->seen, true); /* be safe, be strong */
  2106. }
  2107. static int measure_completion(struct intel_context *ce)
  2108. {
  2109. u32 *sema = hwsp_scratch(ce);
  2110. const u32 offset = hwsp_offset(ce, sema);
  2111. u32 elapsed[TF_COUNT], cycles;
  2112. u32 *cs;
  2113. int err;
  2114. int i;
  2115. /*
  2116. * Measure how long it takes for the signal (interrupt) to be
  2117. * sent from the GPU to be processed by the CPU.
  2118. *
  2119. * A: read CS_TIMESTAMP on GPU
  2120. * signal
  2121. * B: read CS_TIMESTAMP from CPU
  2122. *
  2123. * Completion latency: B - A
  2124. */
  2125. for (i = 1; i <= ARRAY_SIZE(elapsed); i++) {
  2126. struct signal_cb cb = { .seen = false };
  2127. struct i915_request *rq;
  2128. rq = i915_request_create(ce);
  2129. if (IS_ERR(rq)) {
  2130. err = PTR_ERR(rq);
  2131. goto err;
  2132. }
  2133. cs = intel_ring_begin(rq, 12);
  2134. if (IS_ERR(cs)) {
  2135. i915_request_add(rq);
  2136. err = PTR_ERR(cs);
  2137. goto err;
  2138. }
  2139. cs = emit_store_dw(cs, offset + i * sizeof(u32), -1);
  2140. cs = emit_semaphore_poll_until(cs, offset, i);
  2141. cs = emit_timestamp_store(cs, ce, offset + i * sizeof(u32));
  2142. intel_ring_advance(rq, cs);
  2143. dma_fence_add_callback(&rq->fence, &cb.base, signal_cb);
  2144. i915_request_add(rq);
  2145. intel_engine_flush_submission(ce->engine);
  2146. if (wait_for(READ_ONCE(sema[i]) == -1, 50)) {
  2147. err = -EIO;
  2148. goto err;
  2149. }
  2150. preempt_disable();
  2151. semaphore_set(sema, i);
  2152. while (!READ_ONCE(cb.seen))
  2153. cpu_relax();
  2154. elapsed[i - 1] = ENGINE_READ_FW(ce->engine, RING_TIMESTAMP);
  2155. preempt_enable();
  2156. }
  2157. err = intel_gt_wait_for_idle(ce->engine->gt, HZ / 2);
  2158. if (err)
  2159. goto err;
  2160. for (i = 0; i < ARRAY_SIZE(elapsed); i++) {
  2161. GEM_BUG_ON(sema[i + 1] == -1);
  2162. elapsed[i] = elapsed[i] - sema[i + 1];
  2163. }
  2164. cycles = trifilter(elapsed);
  2165. pr_info("%s: completion latency %d cycles, %lluns\n",
  2166. ce->engine->name, cycles >> TF_BIAS,
  2167. cycles_to_ns(ce->engine, cycles));
  2168. return intel_gt_wait_for_idle(ce->engine->gt, HZ);
  2169. err:
  2170. intel_gt_set_wedged(ce->engine->gt);
  2171. return err;
  2172. }
  2173. static void rps_pin(struct intel_gt *gt)
  2174. {
  2175. /* Pin the frequency to max */
  2176. atomic_inc(&gt->rps.num_waiters);
  2177. intel_uncore_forcewake_get(gt->uncore, FORCEWAKE_ALL);
  2178. mutex_lock(&gt->rps.lock);
  2179. intel_rps_set(&gt->rps, gt->rps.max_freq);
  2180. mutex_unlock(&gt->rps.lock);
  2181. }
  2182. static void rps_unpin(struct intel_gt *gt)
  2183. {
  2184. intel_uncore_forcewake_put(gt->uncore, FORCEWAKE_ALL);
  2185. atomic_dec(&gt->rps.num_waiters);
  2186. }
  2187. static int perf_request_latency(void *arg)
  2188. {
  2189. struct drm_i915_private *i915 = arg;
  2190. struct intel_engine_cs *engine;
  2191. struct pm_qos_request qos;
  2192. int err = 0;
  2193. if (GRAPHICS_VER(i915) < 8) /* per-engine CS timestamp, semaphores */
  2194. return 0;
  2195. cpu_latency_qos_add_request(&qos, 0); /* disable cstates */
  2196. for_each_uabi_engine(engine, i915) {
  2197. struct intel_context *ce;
  2198. ce = intel_context_create(engine);
  2199. if (IS_ERR(ce)) {
  2200. err = PTR_ERR(ce);
  2201. goto out;
  2202. }
  2203. err = intel_context_pin(ce);
  2204. if (err) {
  2205. intel_context_put(ce);
  2206. goto out;
  2207. }
  2208. st_engine_heartbeat_disable(engine);
  2209. rps_pin(engine->gt);
  2210. if (err == 0)
  2211. err = measure_semaphore_response(ce);
  2212. if (err == 0)
  2213. err = measure_idle_dispatch(ce);
  2214. if (err == 0)
  2215. err = measure_busy_dispatch(ce);
  2216. if (err == 0)
  2217. err = measure_inter_request(ce);
  2218. if (err == 0)
  2219. err = measure_context_switch(ce);
  2220. if (err == 0)
  2221. err = measure_preemption(ce);
  2222. if (err == 0)
  2223. err = measure_completion(ce);
  2224. rps_unpin(engine->gt);
  2225. st_engine_heartbeat_enable(engine);
  2226. intel_context_unpin(ce);
  2227. intel_context_put(ce);
  2228. if (err)
  2229. goto out;
  2230. }
  2231. out:
  2232. if (igt_flush_test(i915))
  2233. err = -EIO;
  2234. cpu_latency_qos_remove_request(&qos);
  2235. return err;
  2236. }
  2237. static int s_sync0(void *arg)
  2238. {
  2239. struct perf_series *ps = arg;
  2240. IGT_TIMEOUT(end_time);
  2241. unsigned int idx = 0;
  2242. int err = 0;
  2243. GEM_BUG_ON(!ps->nengines);
  2244. do {
  2245. struct i915_request *rq;
  2246. rq = i915_request_create(ps->ce[idx]);
  2247. if (IS_ERR(rq)) {
  2248. err = PTR_ERR(rq);
  2249. break;
  2250. }
  2251. i915_request_get(rq);
  2252. i915_request_add(rq);
  2253. if (i915_request_wait(rq, 0, HZ / 5) < 0)
  2254. err = -ETIME;
  2255. i915_request_put(rq);
  2256. if (err)
  2257. break;
  2258. if (++idx == ps->nengines)
  2259. idx = 0;
  2260. } while (!__igt_timeout(end_time, NULL));
  2261. return err;
  2262. }
  2263. static int s_sync1(void *arg)
  2264. {
  2265. struct perf_series *ps = arg;
  2266. struct i915_request *prev = NULL;
  2267. IGT_TIMEOUT(end_time);
  2268. unsigned int idx = 0;
  2269. int err = 0;
  2270. GEM_BUG_ON(!ps->nengines);
  2271. do {
  2272. struct i915_request *rq;
  2273. rq = i915_request_create(ps->ce[idx]);
  2274. if (IS_ERR(rq)) {
  2275. err = PTR_ERR(rq);
  2276. break;
  2277. }
  2278. i915_request_get(rq);
  2279. i915_request_add(rq);
  2280. if (prev && i915_request_wait(prev, 0, HZ / 5) < 0)
  2281. err = -ETIME;
  2282. i915_request_put(prev);
  2283. prev = rq;
  2284. if (err)
  2285. break;
  2286. if (++idx == ps->nengines)
  2287. idx = 0;
  2288. } while (!__igt_timeout(end_time, NULL));
  2289. i915_request_put(prev);
  2290. return err;
  2291. }
  2292. static int s_many(void *arg)
  2293. {
  2294. struct perf_series *ps = arg;
  2295. IGT_TIMEOUT(end_time);
  2296. unsigned int idx = 0;
  2297. GEM_BUG_ON(!ps->nengines);
  2298. do {
  2299. struct i915_request *rq;
  2300. rq = i915_request_create(ps->ce[idx]);
  2301. if (IS_ERR(rq))
  2302. return PTR_ERR(rq);
  2303. i915_request_add(rq);
  2304. if (++idx == ps->nengines)
  2305. idx = 0;
  2306. } while (!__igt_timeout(end_time, NULL));
  2307. return 0;
  2308. }
  2309. static int perf_series_engines(void *arg)
  2310. {
  2311. struct drm_i915_private *i915 = arg;
  2312. static int (* const func[])(void *arg) = {
  2313. s_sync0,
  2314. s_sync1,
  2315. s_many,
  2316. NULL,
  2317. };
  2318. const unsigned int nengines = num_uabi_engines(i915);
  2319. struct intel_engine_cs *engine;
  2320. int (* const *fn)(void *arg);
  2321. struct pm_qos_request qos;
  2322. struct perf_stats *stats;
  2323. struct perf_series *ps;
  2324. unsigned int idx;
  2325. int err = 0;
  2326. stats = kzalloc_objs(*stats, nengines);
  2327. if (!stats)
  2328. return -ENOMEM;
  2329. ps = kzalloc_flex(*ps, ce, nengines);
  2330. if (!ps) {
  2331. kfree(stats);
  2332. return -ENOMEM;
  2333. }
  2334. cpu_latency_qos_add_request(&qos, 0); /* disable cstates */
  2335. ps->i915 = i915;
  2336. ps->nengines = nengines;
  2337. idx = 0;
  2338. for_each_uabi_engine(engine, i915) {
  2339. struct intel_context *ce;
  2340. ce = intel_context_create(engine);
  2341. if (IS_ERR(ce)) {
  2342. err = PTR_ERR(ce);
  2343. goto out;
  2344. }
  2345. err = intel_context_pin(ce);
  2346. if (err) {
  2347. intel_context_put(ce);
  2348. goto out;
  2349. }
  2350. ps->ce[idx++] = ce;
  2351. }
  2352. GEM_BUG_ON(idx != ps->nengines);
  2353. for (fn = func; *fn && !err; fn++) {
  2354. char name[KSYM_NAME_LEN];
  2355. struct igt_live_test t;
  2356. snprintf(name, sizeof(name), "%ps", *fn);
  2357. err = igt_live_test_begin(&t, i915, __func__, name);
  2358. if (err)
  2359. break;
  2360. for (idx = 0; idx < nengines; idx++) {
  2361. struct perf_stats *p =
  2362. memset(&stats[idx], 0, sizeof(stats[idx]));
  2363. struct intel_context *ce = ps->ce[idx];
  2364. p->engine = ps->ce[idx]->engine;
  2365. intel_engine_pm_get(p->engine);
  2366. if (intel_engine_supports_stats(p->engine))
  2367. p->busy = intel_engine_get_busy_time(p->engine,
  2368. &p->time) + 1;
  2369. else
  2370. p->time = ktime_get();
  2371. p->runtime = -intel_context_get_total_runtime_ns(ce);
  2372. }
  2373. err = (*fn)(ps);
  2374. if (igt_live_test_end(&t))
  2375. err = -EIO;
  2376. for (idx = 0; idx < nengines; idx++) {
  2377. struct perf_stats *p = &stats[idx];
  2378. struct intel_context *ce = ps->ce[idx];
  2379. int integer, decimal;
  2380. u64 busy, dt, now;
  2381. if (p->busy)
  2382. p->busy = ktime_sub(intel_engine_get_busy_time(p->engine,
  2383. &now),
  2384. p->busy - 1);
  2385. else
  2386. now = ktime_get();
  2387. p->time = ktime_sub(now, p->time);
  2388. err = switch_to_kernel_sync(ce, err);
  2389. p->runtime += intel_context_get_total_runtime_ns(ce);
  2390. intel_engine_pm_put(p->engine);
  2391. busy = 100 * ktime_to_ns(p->busy);
  2392. dt = ktime_to_ns(p->time);
  2393. if (dt) {
  2394. integer = div64_u64(busy, dt);
  2395. busy -= integer * dt;
  2396. decimal = div64_u64(100 * busy, dt);
  2397. } else {
  2398. integer = 0;
  2399. decimal = 0;
  2400. }
  2401. pr_info("%s %5s: { seqno:%d, busy:%d.%02d%%, runtime:%lldms, walltime:%lldms }\n",
  2402. name, p->engine->name, ce->timeline->seqno,
  2403. integer, decimal,
  2404. div_u64(p->runtime, 1000 * 1000),
  2405. div_u64(ktime_to_ns(p->time), 1000 * 1000));
  2406. }
  2407. }
  2408. out:
  2409. for (idx = 0; idx < nengines; idx++) {
  2410. if (IS_ERR_OR_NULL(ps->ce[idx]))
  2411. break;
  2412. intel_context_unpin(ps->ce[idx]);
  2413. intel_context_put(ps->ce[idx]);
  2414. }
  2415. kfree(ps);
  2416. cpu_latency_qos_remove_request(&qos);
  2417. kfree(stats);
  2418. return err;
  2419. }
  2420. struct p_thread {
  2421. struct perf_stats p;
  2422. struct kthread_worker *worker;
  2423. struct kthread_work work;
  2424. struct intel_engine_cs *engine;
  2425. int result;
  2426. };
  2427. static void p_sync0(struct kthread_work *work)
  2428. {
  2429. struct p_thread *thread = container_of(work, typeof(*thread), work);
  2430. struct perf_stats *p = &thread->p;
  2431. struct intel_engine_cs *engine = p->engine;
  2432. struct intel_context *ce;
  2433. IGT_TIMEOUT(end_time);
  2434. unsigned long count;
  2435. bool busy;
  2436. int err = 0;
  2437. ce = intel_context_create(engine);
  2438. if (IS_ERR(ce)) {
  2439. thread->result = PTR_ERR(ce);
  2440. return;
  2441. }
  2442. err = intel_context_pin(ce);
  2443. if (err) {
  2444. intel_context_put(ce);
  2445. thread->result = err;
  2446. return;
  2447. }
  2448. if (intel_engine_supports_stats(engine)) {
  2449. p->busy = intel_engine_get_busy_time(engine, &p->time);
  2450. busy = true;
  2451. } else {
  2452. p->time = ktime_get();
  2453. busy = false;
  2454. }
  2455. count = 0;
  2456. do {
  2457. struct i915_request *rq;
  2458. rq = i915_request_create(ce);
  2459. if (IS_ERR(rq)) {
  2460. err = PTR_ERR(rq);
  2461. break;
  2462. }
  2463. i915_request_get(rq);
  2464. i915_request_add(rq);
  2465. err = 0;
  2466. if (i915_request_wait(rq, 0, HZ) < 0)
  2467. err = -ETIME;
  2468. i915_request_put(rq);
  2469. if (err)
  2470. break;
  2471. count++;
  2472. } while (!__igt_timeout(end_time, NULL));
  2473. if (busy) {
  2474. ktime_t now;
  2475. p->busy = ktime_sub(intel_engine_get_busy_time(engine, &now),
  2476. p->busy);
  2477. p->time = ktime_sub(now, p->time);
  2478. } else {
  2479. p->time = ktime_sub(ktime_get(), p->time);
  2480. }
  2481. err = switch_to_kernel_sync(ce, err);
  2482. p->runtime = intel_context_get_total_runtime_ns(ce);
  2483. p->count = count;
  2484. intel_context_unpin(ce);
  2485. intel_context_put(ce);
  2486. thread->result = err;
  2487. }
  2488. static void p_sync1(struct kthread_work *work)
  2489. {
  2490. struct p_thread *thread = container_of(work, typeof(*thread), work);
  2491. struct perf_stats *p = &thread->p;
  2492. struct intel_engine_cs *engine = p->engine;
  2493. struct i915_request *prev = NULL;
  2494. struct intel_context *ce;
  2495. IGT_TIMEOUT(end_time);
  2496. unsigned long count;
  2497. bool busy;
  2498. int err = 0;
  2499. ce = intel_context_create(engine);
  2500. if (IS_ERR(ce)) {
  2501. thread->result = PTR_ERR(ce);
  2502. return;
  2503. }
  2504. err = intel_context_pin(ce);
  2505. if (err) {
  2506. intel_context_put(ce);
  2507. thread->result = err;
  2508. return;
  2509. }
  2510. if (intel_engine_supports_stats(engine)) {
  2511. p->busy = intel_engine_get_busy_time(engine, &p->time);
  2512. busy = true;
  2513. } else {
  2514. p->time = ktime_get();
  2515. busy = false;
  2516. }
  2517. count = 0;
  2518. do {
  2519. struct i915_request *rq;
  2520. rq = i915_request_create(ce);
  2521. if (IS_ERR(rq)) {
  2522. err = PTR_ERR(rq);
  2523. break;
  2524. }
  2525. i915_request_get(rq);
  2526. i915_request_add(rq);
  2527. err = 0;
  2528. if (prev && i915_request_wait(prev, 0, HZ) < 0)
  2529. err = -ETIME;
  2530. i915_request_put(prev);
  2531. prev = rq;
  2532. if (err)
  2533. break;
  2534. count++;
  2535. } while (!__igt_timeout(end_time, NULL));
  2536. i915_request_put(prev);
  2537. if (busy) {
  2538. ktime_t now;
  2539. p->busy = ktime_sub(intel_engine_get_busy_time(engine, &now),
  2540. p->busy);
  2541. p->time = ktime_sub(now, p->time);
  2542. } else {
  2543. p->time = ktime_sub(ktime_get(), p->time);
  2544. }
  2545. err = switch_to_kernel_sync(ce, err);
  2546. p->runtime = intel_context_get_total_runtime_ns(ce);
  2547. p->count = count;
  2548. intel_context_unpin(ce);
  2549. intel_context_put(ce);
  2550. thread->result = err;
  2551. }
  2552. static void p_many(struct kthread_work *work)
  2553. {
  2554. struct p_thread *thread = container_of(work, typeof(*thread), work);
  2555. struct perf_stats *p = &thread->p;
  2556. struct intel_engine_cs *engine = p->engine;
  2557. struct intel_context *ce;
  2558. IGT_TIMEOUT(end_time);
  2559. unsigned long count;
  2560. int err = 0;
  2561. bool busy;
  2562. ce = intel_context_create(engine);
  2563. if (IS_ERR(ce)) {
  2564. thread->result = PTR_ERR(ce);
  2565. return;
  2566. }
  2567. err = intel_context_pin(ce);
  2568. if (err) {
  2569. intel_context_put(ce);
  2570. thread->result = err;
  2571. return;
  2572. }
  2573. if (intel_engine_supports_stats(engine)) {
  2574. p->busy = intel_engine_get_busy_time(engine, &p->time);
  2575. busy = true;
  2576. } else {
  2577. p->time = ktime_get();
  2578. busy = false;
  2579. }
  2580. count = 0;
  2581. do {
  2582. struct i915_request *rq;
  2583. rq = i915_request_create(ce);
  2584. if (IS_ERR(rq)) {
  2585. err = PTR_ERR(rq);
  2586. break;
  2587. }
  2588. i915_request_add(rq);
  2589. count++;
  2590. } while (!__igt_timeout(end_time, NULL));
  2591. if (busy) {
  2592. ktime_t now;
  2593. p->busy = ktime_sub(intel_engine_get_busy_time(engine, &now),
  2594. p->busy);
  2595. p->time = ktime_sub(now, p->time);
  2596. } else {
  2597. p->time = ktime_sub(ktime_get(), p->time);
  2598. }
  2599. err = switch_to_kernel_sync(ce, err);
  2600. p->runtime = intel_context_get_total_runtime_ns(ce);
  2601. p->count = count;
  2602. intel_context_unpin(ce);
  2603. intel_context_put(ce);
  2604. thread->result = err;
  2605. }
  2606. static int perf_parallel_engines(void *arg)
  2607. {
  2608. struct drm_i915_private *i915 = arg;
  2609. static void (* const func[])(struct kthread_work *) = {
  2610. p_sync0,
  2611. p_sync1,
  2612. p_many,
  2613. NULL,
  2614. };
  2615. const unsigned int nengines = num_uabi_engines(i915);
  2616. void (* const *fn)(struct kthread_work *);
  2617. struct intel_engine_cs *engine;
  2618. struct pm_qos_request qos;
  2619. struct p_thread *engines;
  2620. int err = 0;
  2621. engines = kzalloc_objs(*engines, nengines);
  2622. if (!engines)
  2623. return -ENOMEM;
  2624. cpu_latency_qos_add_request(&qos, 0);
  2625. for (fn = func; *fn; fn++) {
  2626. char name[KSYM_NAME_LEN];
  2627. struct igt_live_test t;
  2628. unsigned int idx;
  2629. snprintf(name, sizeof(name), "%ps", *fn);
  2630. err = igt_live_test_begin(&t, i915, __func__, name);
  2631. if (err)
  2632. break;
  2633. atomic_set(&i915->selftest.counter, nengines);
  2634. idx = 0;
  2635. for_each_uabi_engine(engine, i915) {
  2636. struct kthread_worker *worker;
  2637. intel_engine_pm_get(engine);
  2638. memset(&engines[idx].p, 0, sizeof(engines[idx].p));
  2639. worker = kthread_run_worker(0, "igt:%s",
  2640. engine->name);
  2641. if (IS_ERR(worker)) {
  2642. err = PTR_ERR(worker);
  2643. intel_engine_pm_put(engine);
  2644. break;
  2645. }
  2646. engines[idx].worker = worker;
  2647. engines[idx].result = 0;
  2648. engines[idx].p.engine = engine;
  2649. engines[idx].engine = engine;
  2650. kthread_init_work(&engines[idx].work, *fn);
  2651. kthread_queue_work(worker, &engines[idx].work);
  2652. idx++;
  2653. }
  2654. idx = 0;
  2655. for_each_uabi_engine(engine, i915) {
  2656. int status;
  2657. if (!engines[idx].worker)
  2658. break;
  2659. kthread_flush_work(&engines[idx].work);
  2660. status = READ_ONCE(engines[idx].result);
  2661. if (status && !err)
  2662. err = status;
  2663. intel_engine_pm_put(engine);
  2664. kthread_destroy_worker(engines[idx].worker);
  2665. idx++;
  2666. }
  2667. if (igt_live_test_end(&t))
  2668. err = -EIO;
  2669. if (err)
  2670. break;
  2671. idx = 0;
  2672. for_each_uabi_engine(engine, i915) {
  2673. struct perf_stats *p = &engines[idx].p;
  2674. u64 busy = 100 * ktime_to_ns(p->busy);
  2675. u64 dt = ktime_to_ns(p->time);
  2676. int integer, decimal;
  2677. if (dt) {
  2678. integer = div64_u64(busy, dt);
  2679. busy -= integer * dt;
  2680. decimal = div64_u64(100 * busy, dt);
  2681. } else {
  2682. integer = 0;
  2683. decimal = 0;
  2684. }
  2685. GEM_BUG_ON(engine != p->engine);
  2686. pr_info("%s %5s: { count:%lu, busy:%d.%02d%%, runtime:%lldms, walltime:%lldms }\n",
  2687. name, engine->name, p->count, integer, decimal,
  2688. div_u64(p->runtime, 1000 * 1000),
  2689. div_u64(ktime_to_ns(p->time), 1000 * 1000));
  2690. idx++;
  2691. }
  2692. }
  2693. cpu_latency_qos_remove_request(&qos);
  2694. kfree(engines);
  2695. return err;
  2696. }
  2697. int i915_request_perf_selftests(struct drm_i915_private *i915)
  2698. {
  2699. static const struct i915_subtest tests[] = {
  2700. SUBTEST(perf_request_latency),
  2701. SUBTEST(perf_series_engines),
  2702. SUBTEST(perf_parallel_engines),
  2703. };
  2704. if (intel_gt_is_wedged(to_gt(i915)))
  2705. return 0;
  2706. return i915_subtests(tests, i915);
  2707. }