session.c 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <errno.h>
  3. #include <signal.h>
  4. #include <inttypes.h>
  5. #include <linux/err.h>
  6. #include <linux/kernel.h>
  7. #include <linux/zalloc.h>
  8. #include <api/fs/fs.h>
  9. #include <byteswap.h>
  10. #include <unistd.h>
  11. #include <sys/types.h>
  12. #include <sys/mman.h>
  13. #include <perf/cpumap.h>
  14. #include <perf/event.h>
  15. #include "map_symbol.h"
  16. #include "branch.h"
  17. #include "debug.h"
  18. #include "dwarf-regs.h"
  19. #include "env.h"
  20. #include "evlist.h"
  21. #include "evsel.h"
  22. #include "memswap.h"
  23. #include "map.h"
  24. #include "symbol.h"
  25. #include "session.h"
  26. #include "tool.h"
  27. #include "perf_regs.h"
  28. #include "asm/bug.h"
  29. #include "auxtrace.h"
  30. #include "thread.h"
  31. #include "thread-stack.h"
  32. #include "sample-raw.h"
  33. #include "stat.h"
  34. #include "tsc.h"
  35. #include "ui/progress.h"
  36. #include "util.h"
  37. #include "arch/common.h"
  38. #include "units.h"
  39. #include "annotate.h"
  40. #include "perf.h"
  41. #include <internal/lib.h>
  42. static int perf_session__deliver_event(struct perf_session *session,
  43. union perf_event *event,
  44. const struct perf_tool *tool,
  45. u64 file_offset,
  46. const char *file_path);
  47. static int perf_session__open(struct perf_session *session)
  48. {
  49. struct perf_data *data = session->data;
  50. if (perf_session__read_header(session) < 0) {
  51. pr_err("incompatible file format (rerun with -v to learn more)\n");
  52. return -1;
  53. }
  54. if (perf_header__has_feat(&session->header, HEADER_AUXTRACE)) {
  55. /* Auxiliary events may reference exited threads, hold onto dead ones. */
  56. symbol_conf.keep_exited_threads = true;
  57. }
  58. if (perf_data__is_pipe(data))
  59. return 0;
  60. if (perf_header__has_feat(&session->header, HEADER_STAT))
  61. return 0;
  62. if (!evlist__valid_sample_type(session->evlist)) {
  63. pr_err("non matching sample_type\n");
  64. return -1;
  65. }
  66. if (!evlist__valid_sample_id_all(session->evlist)) {
  67. pr_err("non matching sample_id_all\n");
  68. return -1;
  69. }
  70. if (!evlist__valid_read_format(session->evlist)) {
  71. pr_err("non matching read_format\n");
  72. return -1;
  73. }
  74. return 0;
  75. }
  76. void perf_session__set_id_hdr_size(struct perf_session *session)
  77. {
  78. u16 id_hdr_size = evlist__id_hdr_size(session->evlist);
  79. machines__set_id_hdr_size(&session->machines, id_hdr_size);
  80. }
  81. int perf_session__create_kernel_maps(struct perf_session *session)
  82. {
  83. int ret = machine__create_kernel_maps(&session->machines.host);
  84. if (ret >= 0)
  85. ret = machines__create_guest_kernel_maps(&session->machines);
  86. return ret;
  87. }
  88. static void perf_session__destroy_kernel_maps(struct perf_session *session)
  89. {
  90. machines__destroy_kernel_maps(&session->machines);
  91. }
  92. static bool perf_session__has_comm_exec(struct perf_session *session)
  93. {
  94. struct evsel *evsel;
  95. evlist__for_each_entry(session->evlist, evsel) {
  96. if (evsel->core.attr.comm_exec)
  97. return true;
  98. }
  99. return false;
  100. }
  101. static void perf_session__set_comm_exec(struct perf_session *session)
  102. {
  103. bool comm_exec = perf_session__has_comm_exec(session);
  104. machines__set_comm_exec(&session->machines, comm_exec);
  105. }
  106. static int ordered_events__deliver_event(struct ordered_events *oe,
  107. struct ordered_event *event)
  108. {
  109. struct perf_session *session = container_of(oe, struct perf_session,
  110. ordered_events);
  111. return perf_session__deliver_event(session, event->event,
  112. session->tool, event->file_offset,
  113. event->file_path);
  114. }
  115. struct perf_session *__perf_session__new(struct perf_data *data,
  116. struct perf_tool *tool,
  117. bool trace_event_repipe,
  118. struct perf_env *host_env)
  119. {
  120. int ret = -ENOMEM;
  121. struct perf_session *session = zalloc(sizeof(*session));
  122. if (!session)
  123. goto out;
  124. session->trace_event_repipe = trace_event_repipe;
  125. session->tool = tool;
  126. session->decomp_data.zstd_decomp = &session->zstd_data;
  127. session->active_decomp = &session->decomp_data;
  128. INIT_LIST_HEAD(&session->auxtrace_index);
  129. machines__init(&session->machines);
  130. ordered_events__init(&session->ordered_events,
  131. ordered_events__deliver_event, NULL);
  132. perf_env__init(&session->header.env);
  133. if (data) {
  134. ret = perf_data__open(data);
  135. if (ret < 0)
  136. goto out_delete;
  137. session->data = data;
  138. if (perf_data__is_read(data)) {
  139. ret = perf_session__open(session);
  140. if (ret < 0)
  141. goto out_delete;
  142. /*
  143. * set session attributes that are present in perf.data
  144. * but not in pipe-mode.
  145. */
  146. if (!data->is_pipe) {
  147. perf_session__set_id_hdr_size(session);
  148. perf_session__set_comm_exec(session);
  149. }
  150. evlist__init_trace_event_sample_raw(session->evlist, &session->header.env);
  151. /* Open the directory data. */
  152. if (data->is_dir) {
  153. ret = perf_data__open_dir(data);
  154. if (ret)
  155. goto out_delete;
  156. }
  157. if (!symbol_conf.kallsyms_name &&
  158. !symbol_conf.vmlinux_name)
  159. symbol_conf.kallsyms_name = perf_data__kallsyms_name(data);
  160. }
  161. } else {
  162. assert(host_env != NULL);
  163. session->machines.host.env = host_env;
  164. }
  165. if (session->evlist)
  166. session->evlist->session = session;
  167. session->machines.host.single_address_space =
  168. perf_env__single_address_space(session->machines.host.env);
  169. if (!data || perf_data__is_write(data)) {
  170. /*
  171. * In O_RDONLY mode this will be performed when reading the
  172. * kernel MMAP event, in perf_event__process_mmap().
  173. */
  174. if (perf_session__create_kernel_maps(session) < 0)
  175. pr_warning("Cannot read kernel map\n");
  176. }
  177. /*
  178. * In pipe-mode, evlist is empty until PERF_RECORD_HEADER_ATTR is
  179. * processed, so evlist__sample_id_all is not meaningful here.
  180. */
  181. if ((!data || !data->is_pipe) && tool && tool->ordering_requires_timestamps &&
  182. tool->ordered_events && !evlist__sample_id_all(session->evlist)) {
  183. dump_printf("WARNING: No sample_id_all support, falling back to unordered processing\n");
  184. tool->ordered_events = false;
  185. }
  186. return session;
  187. out_delete:
  188. perf_session__delete(session);
  189. out:
  190. return ERR_PTR(ret);
  191. }
  192. static void perf_decomp__release_events(struct decomp *next)
  193. {
  194. struct decomp *decomp;
  195. size_t mmap_len;
  196. do {
  197. decomp = next;
  198. if (decomp == NULL)
  199. break;
  200. next = decomp->next;
  201. mmap_len = decomp->mmap_len;
  202. munmap(decomp, mmap_len);
  203. } while (1);
  204. }
  205. void perf_session__delete(struct perf_session *session)
  206. {
  207. if (session == NULL)
  208. return;
  209. auxtrace__free(session);
  210. auxtrace_index__free(&session->auxtrace_index);
  211. debuginfo_cache__delete();
  212. perf_session__destroy_kernel_maps(session);
  213. perf_decomp__release_events(session->decomp_data.decomp);
  214. perf_env__exit(&session->header.env);
  215. machines__exit(&session->machines);
  216. if (session->data) {
  217. if (perf_data__is_read(session->data))
  218. evlist__delete(session->evlist);
  219. perf_data__close(session->data);
  220. }
  221. #ifdef HAVE_LIBTRACEEVENT
  222. trace_event__cleanup(&session->tevent);
  223. #endif
  224. free(session);
  225. }
  226. static void swap_sample_id_all(union perf_event *event, void *data)
  227. {
  228. void *end = (void *) event + event->header.size;
  229. int size = end - data;
  230. BUG_ON(size % sizeof(u64));
  231. mem_bswap_64(data, size);
  232. }
  233. static void perf_event__all64_swap(union perf_event *event,
  234. bool sample_id_all __maybe_unused)
  235. {
  236. struct perf_event_header *hdr = &event->header;
  237. mem_bswap_64(hdr + 1, event->header.size - sizeof(*hdr));
  238. }
  239. static void perf_event__comm_swap(union perf_event *event, bool sample_id_all)
  240. {
  241. event->comm.pid = bswap_32(event->comm.pid);
  242. event->comm.tid = bswap_32(event->comm.tid);
  243. if (sample_id_all) {
  244. void *data = &event->comm.comm;
  245. data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
  246. swap_sample_id_all(event, data);
  247. }
  248. }
  249. static void perf_event__mmap_swap(union perf_event *event,
  250. bool sample_id_all)
  251. {
  252. event->mmap.pid = bswap_32(event->mmap.pid);
  253. event->mmap.tid = bswap_32(event->mmap.tid);
  254. event->mmap.start = bswap_64(event->mmap.start);
  255. event->mmap.len = bswap_64(event->mmap.len);
  256. event->mmap.pgoff = bswap_64(event->mmap.pgoff);
  257. if (sample_id_all) {
  258. void *data = &event->mmap.filename;
  259. data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
  260. swap_sample_id_all(event, data);
  261. }
  262. }
  263. static void perf_event__mmap2_swap(union perf_event *event,
  264. bool sample_id_all)
  265. {
  266. event->mmap2.pid = bswap_32(event->mmap2.pid);
  267. event->mmap2.tid = bswap_32(event->mmap2.tid);
  268. event->mmap2.start = bswap_64(event->mmap2.start);
  269. event->mmap2.len = bswap_64(event->mmap2.len);
  270. event->mmap2.pgoff = bswap_64(event->mmap2.pgoff);
  271. if (!(event->header.misc & PERF_RECORD_MISC_MMAP_BUILD_ID)) {
  272. event->mmap2.maj = bswap_32(event->mmap2.maj);
  273. event->mmap2.min = bswap_32(event->mmap2.min);
  274. event->mmap2.ino = bswap_64(event->mmap2.ino);
  275. event->mmap2.ino_generation = bswap_64(event->mmap2.ino_generation);
  276. }
  277. if (sample_id_all) {
  278. void *data = &event->mmap2.filename;
  279. data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
  280. swap_sample_id_all(event, data);
  281. }
  282. }
  283. static void perf_event__task_swap(union perf_event *event, bool sample_id_all)
  284. {
  285. event->fork.pid = bswap_32(event->fork.pid);
  286. event->fork.tid = bswap_32(event->fork.tid);
  287. event->fork.ppid = bswap_32(event->fork.ppid);
  288. event->fork.ptid = bswap_32(event->fork.ptid);
  289. event->fork.time = bswap_64(event->fork.time);
  290. if (sample_id_all)
  291. swap_sample_id_all(event, &event->fork + 1);
  292. }
  293. static void perf_event__read_swap(union perf_event *event, bool sample_id_all)
  294. {
  295. event->read.pid = bswap_32(event->read.pid);
  296. event->read.tid = bswap_32(event->read.tid);
  297. event->read.value = bswap_64(event->read.value);
  298. event->read.time_enabled = bswap_64(event->read.time_enabled);
  299. event->read.time_running = bswap_64(event->read.time_running);
  300. event->read.id = bswap_64(event->read.id);
  301. if (sample_id_all)
  302. swap_sample_id_all(event, &event->read + 1);
  303. }
  304. static void perf_event__aux_swap(union perf_event *event, bool sample_id_all)
  305. {
  306. event->aux.aux_offset = bswap_64(event->aux.aux_offset);
  307. event->aux.aux_size = bswap_64(event->aux.aux_size);
  308. event->aux.flags = bswap_64(event->aux.flags);
  309. if (sample_id_all)
  310. swap_sample_id_all(event, &event->aux + 1);
  311. }
  312. static void perf_event__itrace_start_swap(union perf_event *event,
  313. bool sample_id_all)
  314. {
  315. event->itrace_start.pid = bswap_32(event->itrace_start.pid);
  316. event->itrace_start.tid = bswap_32(event->itrace_start.tid);
  317. if (sample_id_all)
  318. swap_sample_id_all(event, &event->itrace_start + 1);
  319. }
  320. static void perf_event__switch_swap(union perf_event *event, bool sample_id_all)
  321. {
  322. if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE) {
  323. event->context_switch.next_prev_pid =
  324. bswap_32(event->context_switch.next_prev_pid);
  325. event->context_switch.next_prev_tid =
  326. bswap_32(event->context_switch.next_prev_tid);
  327. }
  328. if (sample_id_all)
  329. swap_sample_id_all(event, &event->context_switch + 1);
  330. }
  331. static void perf_event__text_poke_swap(union perf_event *event, bool sample_id_all)
  332. {
  333. event->text_poke.addr = bswap_64(event->text_poke.addr);
  334. event->text_poke.old_len = bswap_16(event->text_poke.old_len);
  335. event->text_poke.new_len = bswap_16(event->text_poke.new_len);
  336. if (sample_id_all) {
  337. size_t len = sizeof(event->text_poke.old_len) +
  338. sizeof(event->text_poke.new_len) +
  339. event->text_poke.old_len +
  340. event->text_poke.new_len;
  341. void *data = &event->text_poke.old_len;
  342. data += PERF_ALIGN(len, sizeof(u64));
  343. swap_sample_id_all(event, data);
  344. }
  345. }
  346. static void perf_event__throttle_swap(union perf_event *event,
  347. bool sample_id_all)
  348. {
  349. event->throttle.time = bswap_64(event->throttle.time);
  350. event->throttle.id = bswap_64(event->throttle.id);
  351. event->throttle.stream_id = bswap_64(event->throttle.stream_id);
  352. if (sample_id_all)
  353. swap_sample_id_all(event, &event->throttle + 1);
  354. }
  355. static void perf_event__namespaces_swap(union perf_event *event,
  356. bool sample_id_all)
  357. {
  358. u64 i;
  359. event->namespaces.pid = bswap_32(event->namespaces.pid);
  360. event->namespaces.tid = bswap_32(event->namespaces.tid);
  361. event->namespaces.nr_namespaces = bswap_64(event->namespaces.nr_namespaces);
  362. for (i = 0; i < event->namespaces.nr_namespaces; i++) {
  363. struct perf_ns_link_info *ns = &event->namespaces.link_info[i];
  364. ns->dev = bswap_64(ns->dev);
  365. ns->ino = bswap_64(ns->ino);
  366. }
  367. if (sample_id_all)
  368. swap_sample_id_all(event, &event->namespaces.link_info[i]);
  369. }
  370. static void perf_event__cgroup_swap(union perf_event *event, bool sample_id_all)
  371. {
  372. event->cgroup.id = bswap_64(event->cgroup.id);
  373. if (sample_id_all) {
  374. void *data = &event->cgroup.path;
  375. data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
  376. swap_sample_id_all(event, data);
  377. }
  378. }
  379. static u8 revbyte(u8 b)
  380. {
  381. int rev = (b >> 4) | ((b & 0xf) << 4);
  382. rev = ((rev & 0xcc) >> 2) | ((rev & 0x33) << 2);
  383. rev = ((rev & 0xaa) >> 1) | ((rev & 0x55) << 1);
  384. return (u8) rev;
  385. }
  386. /*
  387. * XXX this is hack in attempt to carry flags bitfield
  388. * through endian village. ABI says:
  389. *
  390. * Bit-fields are allocated from right to left (least to most significant)
  391. * on little-endian implementations and from left to right (most to least
  392. * significant) on big-endian implementations.
  393. *
  394. * The above seems to be byte specific, so we need to reverse each
  395. * byte of the bitfield. 'Internet' also says this might be implementation
  396. * specific and we probably need proper fix and carry perf_event_attr
  397. * bitfield flags in separate data file FEAT_ section. Thought this seems
  398. * to work for now.
  399. */
  400. static void swap_bitfield(u8 *p, unsigned len)
  401. {
  402. unsigned i;
  403. for (i = 0; i < len; i++) {
  404. *p = revbyte(*p);
  405. p++;
  406. }
  407. }
  408. /* exported for swapping attributes in file header */
  409. void perf_event__attr_swap(struct perf_event_attr *attr)
  410. {
  411. attr->type = bswap_32(attr->type);
  412. attr->size = bswap_32(attr->size);
  413. #define bswap_safe(f, n) \
  414. (attr->size > (offsetof(struct perf_event_attr, f) + \
  415. sizeof(attr->f) * (n)))
  416. #define bswap_field(f, sz) \
  417. do { \
  418. if (bswap_safe(f, 0)) \
  419. attr->f = bswap_##sz(attr->f); \
  420. } while(0)
  421. #define bswap_field_16(f) bswap_field(f, 16)
  422. #define bswap_field_32(f) bswap_field(f, 32)
  423. #define bswap_field_64(f) bswap_field(f, 64)
  424. bswap_field_64(config);
  425. bswap_field_64(sample_period);
  426. bswap_field_64(sample_type);
  427. bswap_field_64(read_format);
  428. bswap_field_32(wakeup_events);
  429. bswap_field_32(bp_type);
  430. bswap_field_64(bp_addr);
  431. bswap_field_64(bp_len);
  432. bswap_field_64(branch_sample_type);
  433. bswap_field_64(sample_regs_user);
  434. bswap_field_32(sample_stack_user);
  435. bswap_field_32(aux_watermark);
  436. bswap_field_16(sample_max_stack);
  437. bswap_field_32(aux_sample_size);
  438. /*
  439. * After read_format are bitfields. Check read_format because
  440. * we are unable to use offsetof on bitfield.
  441. */
  442. if (bswap_safe(read_format, 1))
  443. swap_bitfield((u8 *) (&attr->read_format + 1),
  444. sizeof(u64));
  445. #undef bswap_field_64
  446. #undef bswap_field_32
  447. #undef bswap_field
  448. #undef bswap_safe
  449. }
  450. static void perf_event__hdr_attr_swap(union perf_event *event,
  451. bool sample_id_all __maybe_unused)
  452. {
  453. size_t size;
  454. perf_event__attr_swap(&event->attr.attr);
  455. size = event->header.size;
  456. size -= perf_record_header_attr_id(event) - (void *)event;
  457. mem_bswap_64(perf_record_header_attr_id(event), size);
  458. }
  459. static void perf_event__event_update_swap(union perf_event *event,
  460. bool sample_id_all __maybe_unused)
  461. {
  462. event->event_update.type = bswap_64(event->event_update.type);
  463. event->event_update.id = bswap_64(event->event_update.id);
  464. }
  465. static void perf_event__event_type_swap(union perf_event *event,
  466. bool sample_id_all __maybe_unused)
  467. {
  468. event->event_type.event_type.event_id =
  469. bswap_64(event->event_type.event_type.event_id);
  470. }
  471. static void perf_event__tracing_data_swap(union perf_event *event,
  472. bool sample_id_all __maybe_unused)
  473. {
  474. event->tracing_data.size = bswap_32(event->tracing_data.size);
  475. }
  476. static void perf_event__auxtrace_info_swap(union perf_event *event,
  477. bool sample_id_all __maybe_unused)
  478. {
  479. size_t size;
  480. event->auxtrace_info.type = bswap_32(event->auxtrace_info.type);
  481. size = event->header.size;
  482. size -= (void *)&event->auxtrace_info.priv - (void *)event;
  483. mem_bswap_64(event->auxtrace_info.priv, size);
  484. }
  485. static void perf_event__auxtrace_swap(union perf_event *event,
  486. bool sample_id_all __maybe_unused)
  487. {
  488. event->auxtrace.size = bswap_64(event->auxtrace.size);
  489. event->auxtrace.offset = bswap_64(event->auxtrace.offset);
  490. event->auxtrace.reference = bswap_64(event->auxtrace.reference);
  491. event->auxtrace.idx = bswap_32(event->auxtrace.idx);
  492. event->auxtrace.tid = bswap_32(event->auxtrace.tid);
  493. event->auxtrace.cpu = bswap_32(event->auxtrace.cpu);
  494. }
  495. static void perf_event__auxtrace_error_swap(union perf_event *event,
  496. bool sample_id_all __maybe_unused)
  497. {
  498. event->auxtrace_error.type = bswap_32(event->auxtrace_error.type);
  499. event->auxtrace_error.code = bswap_32(event->auxtrace_error.code);
  500. event->auxtrace_error.cpu = bswap_32(event->auxtrace_error.cpu);
  501. event->auxtrace_error.pid = bswap_32(event->auxtrace_error.pid);
  502. event->auxtrace_error.tid = bswap_32(event->auxtrace_error.tid);
  503. event->auxtrace_error.fmt = bswap_32(event->auxtrace_error.fmt);
  504. event->auxtrace_error.ip = bswap_64(event->auxtrace_error.ip);
  505. if (event->auxtrace_error.fmt)
  506. event->auxtrace_error.time = bswap_64(event->auxtrace_error.time);
  507. if (event->auxtrace_error.fmt >= 2) {
  508. event->auxtrace_error.machine_pid = bswap_32(event->auxtrace_error.machine_pid);
  509. event->auxtrace_error.vcpu = bswap_32(event->auxtrace_error.vcpu);
  510. }
  511. }
  512. static void perf_event__thread_map_swap(union perf_event *event,
  513. bool sample_id_all __maybe_unused)
  514. {
  515. unsigned i;
  516. event->thread_map.nr = bswap_64(event->thread_map.nr);
  517. for (i = 0; i < event->thread_map.nr; i++)
  518. event->thread_map.entries[i].pid = bswap_64(event->thread_map.entries[i].pid);
  519. }
  520. static void perf_event__cpu_map_swap(union perf_event *event,
  521. bool sample_id_all __maybe_unused)
  522. {
  523. struct perf_record_cpu_map_data *data = &event->cpu_map.data;
  524. data->type = bswap_16(data->type);
  525. switch (data->type) {
  526. case PERF_CPU_MAP__CPUS:
  527. data->cpus_data.nr = bswap_16(data->cpus_data.nr);
  528. for (unsigned i = 0; i < data->cpus_data.nr; i++)
  529. data->cpus_data.cpu[i] = bswap_16(data->cpus_data.cpu[i]);
  530. break;
  531. case PERF_CPU_MAP__MASK:
  532. data->mask32_data.long_size = bswap_16(data->mask32_data.long_size);
  533. switch (data->mask32_data.long_size) {
  534. case 4:
  535. data->mask32_data.nr = bswap_16(data->mask32_data.nr);
  536. for (unsigned i = 0; i < data->mask32_data.nr; i++)
  537. data->mask32_data.mask[i] = bswap_32(data->mask32_data.mask[i]);
  538. break;
  539. case 8:
  540. data->mask64_data.nr = bswap_16(data->mask64_data.nr);
  541. for (unsigned i = 0; i < data->mask64_data.nr; i++)
  542. data->mask64_data.mask[i] = bswap_64(data->mask64_data.mask[i]);
  543. break;
  544. default:
  545. pr_err("cpu_map swap: unsupported long size\n");
  546. }
  547. break;
  548. case PERF_CPU_MAP__RANGE_CPUS:
  549. data->range_cpu_data.start_cpu = bswap_16(data->range_cpu_data.start_cpu);
  550. data->range_cpu_data.end_cpu = bswap_16(data->range_cpu_data.end_cpu);
  551. break;
  552. default:
  553. break;
  554. }
  555. }
  556. static void perf_event__stat_config_swap(union perf_event *event,
  557. bool sample_id_all __maybe_unused)
  558. {
  559. u64 size;
  560. size = bswap_64(event->stat_config.nr) * sizeof(event->stat_config.data[0]);
  561. size += 1; /* nr item itself */
  562. mem_bswap_64(&event->stat_config.nr, size);
  563. }
  564. static void perf_event__stat_swap(union perf_event *event,
  565. bool sample_id_all __maybe_unused)
  566. {
  567. event->stat.id = bswap_64(event->stat.id);
  568. event->stat.thread = bswap_32(event->stat.thread);
  569. event->stat.cpu = bswap_32(event->stat.cpu);
  570. event->stat.val = bswap_64(event->stat.val);
  571. event->stat.ena = bswap_64(event->stat.ena);
  572. event->stat.run = bswap_64(event->stat.run);
  573. }
  574. static void perf_event__stat_round_swap(union perf_event *event,
  575. bool sample_id_all __maybe_unused)
  576. {
  577. event->stat_round.type = bswap_64(event->stat_round.type);
  578. event->stat_round.time = bswap_64(event->stat_round.time);
  579. }
  580. static void perf_event__time_conv_swap(union perf_event *event,
  581. bool sample_id_all __maybe_unused)
  582. {
  583. event->time_conv.time_shift = bswap_64(event->time_conv.time_shift);
  584. event->time_conv.time_mult = bswap_64(event->time_conv.time_mult);
  585. event->time_conv.time_zero = bswap_64(event->time_conv.time_zero);
  586. if (event_contains(event->time_conv, time_cycles)) {
  587. event->time_conv.time_cycles = bswap_64(event->time_conv.time_cycles);
  588. event->time_conv.time_mask = bswap_64(event->time_conv.time_mask);
  589. }
  590. }
  591. static void
  592. perf_event__schedstat_cpu_swap(union perf_event *event __maybe_unused,
  593. bool sample_id_all __maybe_unused)
  594. {
  595. /* FIXME */
  596. }
  597. static void
  598. perf_event__schedstat_domain_swap(union perf_event *event __maybe_unused,
  599. bool sample_id_all __maybe_unused)
  600. {
  601. /* FIXME */
  602. }
  603. typedef void (*perf_event__swap_op)(union perf_event *event,
  604. bool sample_id_all);
  605. static perf_event__swap_op perf_event__swap_ops[] = {
  606. [PERF_RECORD_MMAP] = perf_event__mmap_swap,
  607. [PERF_RECORD_MMAP2] = perf_event__mmap2_swap,
  608. [PERF_RECORD_COMM] = perf_event__comm_swap,
  609. [PERF_RECORD_FORK] = perf_event__task_swap,
  610. [PERF_RECORD_EXIT] = perf_event__task_swap,
  611. [PERF_RECORD_LOST] = perf_event__all64_swap,
  612. [PERF_RECORD_READ] = perf_event__read_swap,
  613. [PERF_RECORD_THROTTLE] = perf_event__throttle_swap,
  614. [PERF_RECORD_UNTHROTTLE] = perf_event__throttle_swap,
  615. [PERF_RECORD_SAMPLE] = perf_event__all64_swap,
  616. [PERF_RECORD_AUX] = perf_event__aux_swap,
  617. [PERF_RECORD_ITRACE_START] = perf_event__itrace_start_swap,
  618. [PERF_RECORD_LOST_SAMPLES] = perf_event__all64_swap,
  619. [PERF_RECORD_SWITCH] = perf_event__switch_swap,
  620. [PERF_RECORD_SWITCH_CPU_WIDE] = perf_event__switch_swap,
  621. [PERF_RECORD_NAMESPACES] = perf_event__namespaces_swap,
  622. [PERF_RECORD_CGROUP] = perf_event__cgroup_swap,
  623. [PERF_RECORD_TEXT_POKE] = perf_event__text_poke_swap,
  624. [PERF_RECORD_AUX_OUTPUT_HW_ID] = perf_event__all64_swap,
  625. [PERF_RECORD_CALLCHAIN_DEFERRED] = perf_event__all64_swap,
  626. [PERF_RECORD_HEADER_ATTR] = perf_event__hdr_attr_swap,
  627. [PERF_RECORD_HEADER_EVENT_TYPE] = perf_event__event_type_swap,
  628. [PERF_RECORD_HEADER_TRACING_DATA] = perf_event__tracing_data_swap,
  629. [PERF_RECORD_HEADER_BUILD_ID] = NULL,
  630. [PERF_RECORD_ID_INDEX] = perf_event__all64_swap,
  631. [PERF_RECORD_AUXTRACE_INFO] = perf_event__auxtrace_info_swap,
  632. [PERF_RECORD_AUXTRACE] = perf_event__auxtrace_swap,
  633. [PERF_RECORD_AUXTRACE_ERROR] = perf_event__auxtrace_error_swap,
  634. [PERF_RECORD_THREAD_MAP] = perf_event__thread_map_swap,
  635. [PERF_RECORD_CPU_MAP] = perf_event__cpu_map_swap,
  636. [PERF_RECORD_STAT_CONFIG] = perf_event__stat_config_swap,
  637. [PERF_RECORD_STAT] = perf_event__stat_swap,
  638. [PERF_RECORD_STAT_ROUND] = perf_event__stat_round_swap,
  639. [PERF_RECORD_EVENT_UPDATE] = perf_event__event_update_swap,
  640. [PERF_RECORD_TIME_CONV] = perf_event__time_conv_swap,
  641. [PERF_RECORD_SCHEDSTAT_CPU] = perf_event__schedstat_cpu_swap,
  642. [PERF_RECORD_SCHEDSTAT_DOMAIN] = perf_event__schedstat_domain_swap,
  643. [PERF_RECORD_HEADER_MAX] = NULL,
  644. };
  645. /*
  646. * When perf record finishes a pass on every buffers, it records this pseudo
  647. * event.
  648. * We record the max timestamp t found in the pass n.
  649. * Assuming these timestamps are monotonic across cpus, we know that if
  650. * a buffer still has events with timestamps below t, they will be all
  651. * available and then read in the pass n + 1.
  652. * Hence when we start to read the pass n + 2, we can safely flush every
  653. * events with timestamps below t.
  654. *
  655. * ============ PASS n =================
  656. * CPU 0 | CPU 1
  657. * |
  658. * cnt1 timestamps | cnt2 timestamps
  659. * 1 | 2
  660. * 2 | 3
  661. * - | 4 <--- max recorded
  662. *
  663. * ============ PASS n + 1 ==============
  664. * CPU 0 | CPU 1
  665. * |
  666. * cnt1 timestamps | cnt2 timestamps
  667. * 3 | 5
  668. * 4 | 6
  669. * 5 | 7 <---- max recorded
  670. *
  671. * Flush every events below timestamp 4
  672. *
  673. * ============ PASS n + 2 ==============
  674. * CPU 0 | CPU 1
  675. * |
  676. * cnt1 timestamps | cnt2 timestamps
  677. * 6 | 8
  678. * 7 | 9
  679. * - | 10
  680. *
  681. * Flush every events below timestamp 7
  682. * etc...
  683. */
  684. int perf_event__process_finished_round(const struct perf_tool *tool __maybe_unused,
  685. union perf_event *event __maybe_unused,
  686. struct ordered_events *oe)
  687. {
  688. if (dump_trace)
  689. fprintf(stdout, "\n");
  690. return ordered_events__flush(oe, OE_FLUSH__ROUND);
  691. }
  692. int perf_session__queue_event(struct perf_session *s, union perf_event *event,
  693. u64 timestamp, u64 file_offset, const char *file_path)
  694. {
  695. return ordered_events__queue(&s->ordered_events, event, timestamp, file_offset, file_path);
  696. }
  697. static void callchain__lbr_callstack_printf(struct perf_sample *sample)
  698. {
  699. struct ip_callchain *callchain = sample->callchain;
  700. struct branch_stack *lbr_stack = sample->branch_stack;
  701. struct branch_entry *entries = perf_sample__branch_entries(sample);
  702. u64 kernel_callchain_nr = callchain->nr;
  703. unsigned int i;
  704. for (i = 0; i < kernel_callchain_nr; i++) {
  705. if (callchain->ips[i] == PERF_CONTEXT_USER)
  706. break;
  707. }
  708. if ((i != kernel_callchain_nr) && lbr_stack->nr) {
  709. u64 total_nr;
  710. /*
  711. * LBR callstack can only get user call chain,
  712. * i is kernel call chain number,
  713. * 1 is PERF_CONTEXT_USER.
  714. *
  715. * The user call chain is stored in LBR registers.
  716. * LBR are pair registers. The caller is stored
  717. * in "from" register, while the callee is stored
  718. * in "to" register.
  719. * For example, there is a call stack
  720. * "A"->"B"->"C"->"D".
  721. * The LBR registers will be recorded like
  722. * "C"->"D", "B"->"C", "A"->"B".
  723. * So only the first "to" register and all "from"
  724. * registers are needed to construct the whole stack.
  725. */
  726. total_nr = i + 1 + lbr_stack->nr + 1;
  727. kernel_callchain_nr = i + 1;
  728. printf("... LBR call chain: nr:%" PRIu64 "\n", total_nr);
  729. for (i = 0; i < kernel_callchain_nr; i++)
  730. printf("..... %2d: %016" PRIx64 "\n",
  731. i, callchain->ips[i]);
  732. printf("..... %2d: %016" PRIx64 "\n",
  733. (int)(kernel_callchain_nr), entries[0].to);
  734. for (i = 0; i < lbr_stack->nr; i++)
  735. printf("..... %2d: %016" PRIx64 "\n",
  736. (int)(i + kernel_callchain_nr + 1), entries[i].from);
  737. }
  738. }
  739. static const char *callchain_context_str(u64 ip)
  740. {
  741. switch (ip) {
  742. case PERF_CONTEXT_HV:
  743. return " (PERF_CONTEXT_HV)";
  744. case PERF_CONTEXT_KERNEL:
  745. return " (PERF_CONTEXT_KERNEL)";
  746. case PERF_CONTEXT_USER:
  747. return " (PERF_CONTEXT_USER)";
  748. case PERF_CONTEXT_GUEST:
  749. return " (PERF_CONTEXT_GUEST)";
  750. case PERF_CONTEXT_GUEST_KERNEL:
  751. return " (PERF_CONTEXT_GUEST_KERNEL)";
  752. case PERF_CONTEXT_GUEST_USER:
  753. return " (PERF_CONTEXT_GUEST_USER)";
  754. case PERF_CONTEXT_USER_DEFERRED:
  755. return " (PERF_CONTEXT_USER_DEFERRED)";
  756. default:
  757. return "";
  758. }
  759. }
  760. static void callchain__printf(struct evsel *evsel,
  761. struct perf_sample *sample)
  762. {
  763. unsigned int i;
  764. struct ip_callchain *callchain = sample->callchain;
  765. if (evsel__has_branch_callstack(evsel))
  766. callchain__lbr_callstack_printf(sample);
  767. printf("... FP chain: nr:%" PRIu64 "\n", callchain->nr);
  768. for (i = 0; i < callchain->nr; i++)
  769. printf("..... %2d: %016" PRIx64 "%s\n",
  770. i, callchain->ips[i],
  771. callchain_context_str(callchain->ips[i]));
  772. if (sample->deferred_callchain)
  773. printf("...... (deferred)\n");
  774. }
  775. static void branch_stack__printf(struct perf_sample *sample,
  776. struct evsel *evsel)
  777. {
  778. struct branch_entry *entries = perf_sample__branch_entries(sample);
  779. bool callstack = evsel__has_branch_callstack(evsel);
  780. u64 *branch_stack_cntr = sample->branch_stack_cntr;
  781. uint64_t i;
  782. if (!callstack) {
  783. printf("%s: nr:%" PRIu64 "\n", "... branch stack", sample->branch_stack->nr);
  784. } else {
  785. /* the reason of adding 1 to nr is because after expanding
  786. * branch stack it generates nr + 1 callstack records. e.g.,
  787. * B()->C()
  788. * A()->B()
  789. * the final callstack should be:
  790. * C()
  791. * B()
  792. * A()
  793. */
  794. printf("%s: nr:%" PRIu64 "\n", "... branch callstack", sample->branch_stack->nr+1);
  795. }
  796. for (i = 0; i < sample->branch_stack->nr; i++) {
  797. struct branch_entry *e = &entries[i];
  798. if (!callstack) {
  799. printf("..... %2"PRIu64": %016" PRIx64 " -> %016" PRIx64 " %hu cycles %s%s%s%s %x %s %s\n",
  800. i, e->from, e->to,
  801. (unsigned short)e->flags.cycles,
  802. e->flags.mispred ? "M" : " ",
  803. e->flags.predicted ? "P" : " ",
  804. e->flags.abort ? "A" : " ",
  805. e->flags.in_tx ? "T" : " ",
  806. (unsigned)e->flags.reserved,
  807. get_branch_type(e),
  808. e->flags.spec ? branch_spec_desc(e->flags.spec) : "");
  809. } else {
  810. if (i == 0) {
  811. printf("..... %2"PRIu64": %016" PRIx64 "\n"
  812. "..... %2"PRIu64": %016" PRIx64 "\n",
  813. i, e->to, i+1, e->from);
  814. } else {
  815. printf("..... %2"PRIu64": %016" PRIx64 "\n", i+1, e->from);
  816. }
  817. }
  818. }
  819. if (branch_stack_cntr) {
  820. unsigned int br_cntr_width, br_cntr_nr;
  821. perf_env__find_br_cntr_info(evsel__env(evsel), &br_cntr_nr, &br_cntr_width);
  822. printf("... branch stack counters: nr:%" PRIu64 " (counter width: %u max counter nr:%u)\n",
  823. sample->branch_stack->nr, br_cntr_width, br_cntr_nr);
  824. for (i = 0; i < sample->branch_stack->nr; i++)
  825. printf("..... %2"PRIu64": %016" PRIx64 "\n", i, branch_stack_cntr[i]);
  826. }
  827. }
  828. static void regs_dump__printf(u64 mask, u64 *regs, uint16_t e_machine, uint32_t e_flags)
  829. {
  830. unsigned rid, i = 0;
  831. for_each_set_bit(rid, (unsigned long *) &mask, sizeof(mask) * 8) {
  832. u64 val = regs[i++];
  833. printf(".... %-5s 0x%016" PRIx64 "\n",
  834. perf_reg_name(rid, e_machine, e_flags), val);
  835. }
  836. }
  837. static const char *regs_abi[] = {
  838. [PERF_SAMPLE_REGS_ABI_NONE] = "none",
  839. [PERF_SAMPLE_REGS_ABI_32] = "32-bit",
  840. [PERF_SAMPLE_REGS_ABI_64] = "64-bit",
  841. };
  842. static inline const char *regs_dump_abi(struct regs_dump *d)
  843. {
  844. if (d->abi > PERF_SAMPLE_REGS_ABI_64)
  845. return "unknown";
  846. return regs_abi[d->abi];
  847. }
  848. static void regs__printf(const char *type, struct regs_dump *regs,
  849. uint16_t e_machine, uint32_t e_flags)
  850. {
  851. u64 mask = regs->mask;
  852. printf("... %s regs: mask 0x%" PRIx64 " ABI %s\n",
  853. type,
  854. mask,
  855. regs_dump_abi(regs));
  856. regs_dump__printf(mask, regs->regs, e_machine, e_flags);
  857. }
  858. static void regs_user__printf(struct perf_sample *sample, uint16_t e_machine, uint32_t e_flags)
  859. {
  860. struct regs_dump *user_regs;
  861. if (!sample->user_regs)
  862. return;
  863. user_regs = perf_sample__user_regs(sample);
  864. if (user_regs->regs)
  865. regs__printf("user", user_regs, e_machine, e_flags);
  866. }
  867. static void regs_intr__printf(struct perf_sample *sample, uint16_t e_machine, uint32_t e_flags)
  868. {
  869. struct regs_dump *intr_regs;
  870. if (!sample->intr_regs)
  871. return;
  872. intr_regs = perf_sample__intr_regs(sample);
  873. if (intr_regs->regs)
  874. regs__printf("intr", intr_regs, e_machine, e_flags);
  875. }
  876. static void stack_user__printf(struct stack_dump *dump)
  877. {
  878. printf("... ustack: size %" PRIu64 ", offset 0x%x\n",
  879. dump->size, dump->offset);
  880. }
  881. static void evlist__print_tstamp(struct evlist *evlist, union perf_event *event, struct perf_sample *sample)
  882. {
  883. u64 sample_type = __evlist__combined_sample_type(evlist);
  884. if (event->header.type != PERF_RECORD_SAMPLE &&
  885. !evlist__sample_id_all(evlist)) {
  886. fputs("-1 -1 ", stdout);
  887. return;
  888. }
  889. if ((sample_type & PERF_SAMPLE_CPU))
  890. printf("%u ", sample->cpu);
  891. if (sample_type & PERF_SAMPLE_TIME)
  892. printf("%" PRIu64 " ", sample->time);
  893. }
  894. static void sample_read__printf(struct perf_sample *sample, u64 read_format)
  895. {
  896. printf("... sample_read:\n");
  897. if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
  898. printf("...... time enabled %016" PRIx64 "\n",
  899. sample->read.time_enabled);
  900. if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
  901. printf("...... time running %016" PRIx64 "\n",
  902. sample->read.time_running);
  903. if (read_format & PERF_FORMAT_GROUP) {
  904. struct sample_read_value *value = sample->read.group.values;
  905. printf(".... group nr %" PRIu64 "\n", sample->read.group.nr);
  906. sample_read_group__for_each(value, sample->read.group.nr, read_format) {
  907. printf("..... id %016" PRIx64
  908. ", value %016" PRIx64,
  909. value->id, value->value);
  910. if (read_format & PERF_FORMAT_LOST)
  911. printf(", lost %" PRIu64, value->lost);
  912. printf("\n");
  913. }
  914. } else {
  915. printf("..... id %016" PRIx64 ", value %016" PRIx64,
  916. sample->read.one.id, sample->read.one.value);
  917. if (read_format & PERF_FORMAT_LOST)
  918. printf(", lost %" PRIu64, sample->read.one.lost);
  919. printf("\n");
  920. }
  921. }
  922. static void dump_event(struct evlist *evlist, union perf_event *event,
  923. u64 file_offset, struct perf_sample *sample,
  924. const char *file_path)
  925. {
  926. if (!dump_trace)
  927. return;
  928. printf("\n%#" PRIx64 "@%s [%#x]: event: %d\n",
  929. file_offset, file_path, event->header.size, event->header.type);
  930. trace_event(event);
  931. if (event->header.type == PERF_RECORD_SAMPLE && evlist->trace_event_sample_raw)
  932. evlist->trace_event_sample_raw(evlist, event, sample);
  933. if (sample)
  934. evlist__print_tstamp(evlist, event, sample);
  935. printf("%#" PRIx64 " [%#x]: PERF_RECORD_%s", file_offset,
  936. event->header.size, perf_event__name(event->header.type));
  937. }
  938. char *get_page_size_name(u64 size, char *str)
  939. {
  940. if (!size || !unit_number__scnprintf(str, PAGE_SIZE_NAME_LEN, size))
  941. snprintf(str, PAGE_SIZE_NAME_LEN, "%s", "N/A");
  942. return str;
  943. }
  944. static void dump_sample(struct machine *machine, struct evsel *evsel, union perf_event *event,
  945. struct perf_sample *sample)
  946. {
  947. u64 sample_type;
  948. char str[PAGE_SIZE_NAME_LEN];
  949. uint16_t e_machine = EM_NONE;
  950. uint32_t e_flags = 0;
  951. if (!dump_trace)
  952. return;
  953. sample_type = evsel->core.attr.sample_type;
  954. if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_REGS_INTR)) {
  955. struct thread *thread = machine__find_thread(machine, sample->pid, sample->pid);
  956. e_machine = thread__e_machine(thread, machine, &e_flags);
  957. }
  958. printf("(IP, 0x%x): %d/%d: %#" PRIx64 " period: %" PRIu64 " addr: %#" PRIx64 "\n",
  959. event->header.misc, sample->pid, sample->tid, sample->ip,
  960. sample->period, sample->addr);
  961. if (evsel__has_callchain(evsel))
  962. callchain__printf(evsel, sample);
  963. if (evsel__has_br_stack(evsel))
  964. branch_stack__printf(sample, evsel);
  965. if (sample_type & PERF_SAMPLE_REGS_USER)
  966. regs_user__printf(sample, e_machine, e_flags);
  967. if (sample_type & PERF_SAMPLE_REGS_INTR)
  968. regs_intr__printf(sample, e_machine, e_flags);
  969. if (sample_type & PERF_SAMPLE_STACK_USER)
  970. stack_user__printf(&sample->user_stack);
  971. if (sample_type & PERF_SAMPLE_WEIGHT_TYPE) {
  972. printf("... weight: %" PRIu64 "", sample->weight);
  973. if (sample_type & PERF_SAMPLE_WEIGHT_STRUCT) {
  974. printf(",0x%"PRIx16"", sample->ins_lat);
  975. printf(",0x%"PRIx16"", sample->weight3);
  976. }
  977. printf("\n");
  978. }
  979. if (sample_type & PERF_SAMPLE_DATA_SRC)
  980. printf(" . data_src: 0x%"PRIx64"\n", sample->data_src);
  981. if (sample_type & PERF_SAMPLE_PHYS_ADDR)
  982. printf(" .. phys_addr: 0x%"PRIx64"\n", sample->phys_addr);
  983. if (sample_type & PERF_SAMPLE_DATA_PAGE_SIZE)
  984. printf(" .. data page size: %s\n", get_page_size_name(sample->data_page_size, str));
  985. if (sample_type & PERF_SAMPLE_CODE_PAGE_SIZE)
  986. printf(" .. code page size: %s\n", get_page_size_name(sample->code_page_size, str));
  987. if (sample_type & PERF_SAMPLE_TRANSACTION)
  988. printf("... transaction: %" PRIx64 "\n", sample->transaction);
  989. if (sample_type & PERF_SAMPLE_READ)
  990. sample_read__printf(sample, evsel->core.attr.read_format);
  991. }
  992. static void dump_deferred_callchain(struct evsel *evsel, union perf_event *event,
  993. struct perf_sample *sample)
  994. {
  995. if (!dump_trace)
  996. return;
  997. printf("(IP, 0x%x): %d/%d: %#" PRIx64 "\n",
  998. event->header.misc, sample->pid, sample->tid, sample->deferred_cookie);
  999. if (evsel__has_callchain(evsel))
  1000. callchain__printf(evsel, sample);
  1001. }
  1002. static void dump_read(struct evsel *evsel, union perf_event *event)
  1003. {
  1004. struct perf_record_read *read_event = &event->read;
  1005. u64 read_format;
  1006. if (!dump_trace)
  1007. return;
  1008. printf(": %d %d %s %" PRI_lu64 "\n", event->read.pid, event->read.tid,
  1009. evsel__name(evsel), event->read.value);
  1010. if (!evsel)
  1011. return;
  1012. read_format = evsel->core.attr.read_format;
  1013. if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
  1014. printf("... time enabled : %" PRI_lu64 "\n", read_event->time_enabled);
  1015. if (read_format & PERF_FORMAT_TOTAL_TIME_RUNNING)
  1016. printf("... time running : %" PRI_lu64 "\n", read_event->time_running);
  1017. if (read_format & PERF_FORMAT_ID)
  1018. printf("... id : %" PRI_lu64 "\n", read_event->id);
  1019. if (read_format & PERF_FORMAT_LOST)
  1020. printf("... lost : %" PRI_lu64 "\n", read_event->lost);
  1021. }
  1022. static struct machine *machines__find_for_cpumode(struct machines *machines,
  1023. union perf_event *event,
  1024. struct perf_sample *sample)
  1025. {
  1026. if (perf_guest &&
  1027. ((sample->cpumode == PERF_RECORD_MISC_GUEST_KERNEL) ||
  1028. (sample->cpumode == PERF_RECORD_MISC_GUEST_USER))) {
  1029. u32 pid;
  1030. if (sample->machine_pid)
  1031. pid = sample->machine_pid;
  1032. else if (event->header.type == PERF_RECORD_MMAP
  1033. || event->header.type == PERF_RECORD_MMAP2)
  1034. pid = event->mmap.pid;
  1035. else
  1036. pid = sample->pid;
  1037. /*
  1038. * Guest code machine is created as needed and does not use
  1039. * DEFAULT_GUEST_KERNEL_ID.
  1040. */
  1041. if (symbol_conf.guest_code)
  1042. return machines__findnew(machines, pid);
  1043. return machines__find_guest(machines, pid);
  1044. }
  1045. return &machines->host;
  1046. }
  1047. static int deliver_sample_value(struct evlist *evlist,
  1048. const struct perf_tool *tool,
  1049. union perf_event *event,
  1050. struct perf_sample *sample,
  1051. struct sample_read_value *v,
  1052. struct machine *machine,
  1053. bool per_thread)
  1054. {
  1055. struct perf_sample_id *sid = evlist__id2sid(evlist, v->id);
  1056. struct evsel *evsel;
  1057. u64 *storage = NULL;
  1058. if (sid) {
  1059. storage = perf_sample_id__get_period_storage(sid, sample->tid, per_thread);
  1060. }
  1061. if (storage) {
  1062. sample->id = v->id;
  1063. sample->period = v->value - *storage;
  1064. *storage = v->value;
  1065. }
  1066. if (!storage || sid->evsel == NULL) {
  1067. ++evlist->stats.nr_unknown_id;
  1068. return 0;
  1069. }
  1070. /*
  1071. * There's no reason to deliver sample
  1072. * for zero period, bail out.
  1073. */
  1074. if (!sample->period)
  1075. return 0;
  1076. evsel = container_of(sid->evsel, struct evsel, core);
  1077. return tool->sample(tool, event, sample, evsel, machine);
  1078. }
  1079. static int deliver_sample_group(struct evlist *evlist,
  1080. const struct perf_tool *tool,
  1081. union perf_event *event,
  1082. struct perf_sample *sample,
  1083. struct machine *machine,
  1084. u64 read_format,
  1085. bool per_thread)
  1086. {
  1087. int ret = -EINVAL;
  1088. struct sample_read_value *v = sample->read.group.values;
  1089. if (tool->dont_split_sample_group)
  1090. return deliver_sample_value(evlist, tool, event, sample, v, machine,
  1091. per_thread);
  1092. sample_read_group__for_each(v, sample->read.group.nr, read_format) {
  1093. ret = deliver_sample_value(evlist, tool, event, sample, v,
  1094. machine, per_thread);
  1095. if (ret)
  1096. break;
  1097. }
  1098. return ret;
  1099. }
  1100. static int evlist__deliver_sample(struct evlist *evlist, const struct perf_tool *tool,
  1101. union perf_event *event, struct perf_sample *sample,
  1102. struct evsel *evsel, struct machine *machine)
  1103. {
  1104. /* We know evsel != NULL. */
  1105. u64 sample_type = evsel->core.attr.sample_type;
  1106. u64 read_format = evsel->core.attr.read_format;
  1107. bool per_thread = perf_evsel__attr_has_per_thread_sample_period(&evsel->core);
  1108. /* Standard sample delivery. */
  1109. if (!(sample_type & PERF_SAMPLE_READ))
  1110. return tool->sample(tool, event, sample, evsel, machine);
  1111. /* For PERF_SAMPLE_READ we have either single or group mode. */
  1112. if (read_format & PERF_FORMAT_GROUP)
  1113. return deliver_sample_group(evlist, tool, event, sample,
  1114. machine, read_format, per_thread);
  1115. else
  1116. return deliver_sample_value(evlist, tool, event, sample,
  1117. &sample->read.one, machine,
  1118. per_thread);
  1119. }
  1120. /*
  1121. * Samples with deferred callchains should wait for the next matching
  1122. * PERF_RECORD_CALLCHAIN_RECORD entries. Keep the events in a list and
  1123. * deliver them once it finds the callchains.
  1124. */
  1125. struct deferred_event {
  1126. struct list_head list;
  1127. union perf_event *event;
  1128. };
  1129. /*
  1130. * This is called when a deferred callchain record comes up. Find all matching
  1131. * samples, merge the callchains and process them.
  1132. */
  1133. static int evlist__deliver_deferred_callchain(struct evlist *evlist,
  1134. const struct perf_tool *tool,
  1135. union perf_event *event,
  1136. struct perf_sample *sample,
  1137. struct machine *machine)
  1138. {
  1139. struct deferred_event *de, *tmp;
  1140. struct evsel *evsel;
  1141. int ret = 0;
  1142. if (!tool->merge_deferred_callchains) {
  1143. evsel = evlist__id2evsel(evlist, sample->id);
  1144. return tool->callchain_deferred(tool, event, sample,
  1145. evsel, machine);
  1146. }
  1147. list_for_each_entry_safe(de, tmp, &evlist->deferred_samples, list) {
  1148. struct perf_sample orig_sample;
  1149. ret = evlist__parse_sample(evlist, de->event, &orig_sample);
  1150. if (ret < 0) {
  1151. pr_err("failed to parse original sample\n");
  1152. break;
  1153. }
  1154. if (sample->tid != orig_sample.tid)
  1155. continue;
  1156. if (event->callchain_deferred.cookie == orig_sample.deferred_cookie)
  1157. sample__merge_deferred_callchain(&orig_sample, sample);
  1158. else
  1159. orig_sample.deferred_callchain = false;
  1160. evsel = evlist__id2evsel(evlist, orig_sample.id);
  1161. ret = evlist__deliver_sample(evlist, tool, de->event,
  1162. &orig_sample, evsel, machine);
  1163. if (orig_sample.deferred_callchain)
  1164. free(orig_sample.callchain);
  1165. list_del(&de->list);
  1166. free(de->event);
  1167. free(de);
  1168. if (ret)
  1169. break;
  1170. }
  1171. return ret;
  1172. }
  1173. /*
  1174. * This is called at the end of the data processing for the session. Flush the
  1175. * remaining samples as there's no hope for matching deferred callchains.
  1176. */
  1177. static int session__flush_deferred_samples(struct perf_session *session,
  1178. const struct perf_tool *tool)
  1179. {
  1180. struct evlist *evlist = session->evlist;
  1181. struct machine *machine = &session->machines.host;
  1182. struct deferred_event *de, *tmp;
  1183. struct evsel *evsel;
  1184. int ret = 0;
  1185. list_for_each_entry_safe(de, tmp, &evlist->deferred_samples, list) {
  1186. struct perf_sample sample;
  1187. ret = evlist__parse_sample(evlist, de->event, &sample);
  1188. if (ret < 0) {
  1189. pr_err("failed to parse original sample\n");
  1190. break;
  1191. }
  1192. evsel = evlist__id2evsel(evlist, sample.id);
  1193. ret = evlist__deliver_sample(evlist, tool, de->event,
  1194. &sample, evsel, machine);
  1195. list_del(&de->list);
  1196. free(de->event);
  1197. free(de);
  1198. if (ret)
  1199. break;
  1200. }
  1201. return ret;
  1202. }
  1203. static int machines__deliver_event(struct machines *machines,
  1204. struct evlist *evlist,
  1205. union perf_event *event,
  1206. struct perf_sample *sample,
  1207. const struct perf_tool *tool, u64 file_offset,
  1208. const char *file_path)
  1209. {
  1210. struct evsel *evsel;
  1211. struct machine *machine;
  1212. dump_event(evlist, event, file_offset, sample, file_path);
  1213. evsel = evlist__id2evsel(evlist, sample->id);
  1214. machine = machines__find_for_cpumode(machines, event, sample);
  1215. switch (event->header.type) {
  1216. case PERF_RECORD_SAMPLE:
  1217. if (evsel == NULL) {
  1218. ++evlist->stats.nr_unknown_id;
  1219. return 0;
  1220. }
  1221. if (machine == NULL) {
  1222. ++evlist->stats.nr_unprocessable_samples;
  1223. dump_sample(machine, evsel, event, sample);
  1224. return 0;
  1225. }
  1226. dump_sample(machine, evsel, event, sample);
  1227. if (sample->deferred_callchain && tool->merge_deferred_callchains) {
  1228. struct deferred_event *de = malloc(sizeof(*de));
  1229. size_t sz = event->header.size;
  1230. if (de == NULL)
  1231. return -ENOMEM;
  1232. de->event = malloc(sz);
  1233. if (de->event == NULL) {
  1234. free(de);
  1235. return -ENOMEM;
  1236. }
  1237. memcpy(de->event, event, sz);
  1238. list_add_tail(&de->list, &evlist->deferred_samples);
  1239. return 0;
  1240. }
  1241. return evlist__deliver_sample(evlist, tool, event, sample, evsel, machine);
  1242. case PERF_RECORD_MMAP:
  1243. return tool->mmap(tool, event, sample, machine);
  1244. case PERF_RECORD_MMAP2:
  1245. if (event->header.misc & PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT)
  1246. ++evlist->stats.nr_proc_map_timeout;
  1247. return tool->mmap2(tool, event, sample, machine);
  1248. case PERF_RECORD_COMM:
  1249. return tool->comm(tool, event, sample, machine);
  1250. case PERF_RECORD_NAMESPACES:
  1251. return tool->namespaces(tool, event, sample, machine);
  1252. case PERF_RECORD_CGROUP:
  1253. return tool->cgroup(tool, event, sample, machine);
  1254. case PERF_RECORD_FORK:
  1255. return tool->fork(tool, event, sample, machine);
  1256. case PERF_RECORD_EXIT:
  1257. return tool->exit(tool, event, sample, machine);
  1258. case PERF_RECORD_LOST:
  1259. if (tool->lost == perf_event__process_lost)
  1260. evlist->stats.total_lost += event->lost.lost;
  1261. return tool->lost(tool, event, sample, machine);
  1262. case PERF_RECORD_LOST_SAMPLES:
  1263. if (event->header.misc & PERF_RECORD_MISC_LOST_SAMPLES_BPF)
  1264. evlist->stats.total_dropped_samples += event->lost_samples.lost;
  1265. else if (tool->lost_samples == perf_event__process_lost_samples)
  1266. evlist->stats.total_lost_samples += event->lost_samples.lost;
  1267. return tool->lost_samples(tool, event, sample, machine);
  1268. case PERF_RECORD_READ:
  1269. dump_read(evsel, event);
  1270. return tool->read(tool, event, sample, evsel, machine);
  1271. case PERF_RECORD_THROTTLE:
  1272. return tool->throttle(tool, event, sample, machine);
  1273. case PERF_RECORD_UNTHROTTLE:
  1274. return tool->unthrottle(tool, event, sample, machine);
  1275. case PERF_RECORD_AUX:
  1276. if (tool->aux == perf_event__process_aux) {
  1277. if (event->aux.flags & PERF_AUX_FLAG_TRUNCATED)
  1278. evlist->stats.total_aux_lost += 1;
  1279. if (event->aux.flags & PERF_AUX_FLAG_PARTIAL)
  1280. evlist->stats.total_aux_partial += 1;
  1281. if (event->aux.flags & PERF_AUX_FLAG_COLLISION)
  1282. evlist->stats.total_aux_collision += 1;
  1283. }
  1284. return tool->aux(tool, event, sample, machine);
  1285. case PERF_RECORD_ITRACE_START:
  1286. return tool->itrace_start(tool, event, sample, machine);
  1287. case PERF_RECORD_SWITCH:
  1288. case PERF_RECORD_SWITCH_CPU_WIDE:
  1289. return tool->context_switch(tool, event, sample, machine);
  1290. case PERF_RECORD_KSYMBOL:
  1291. return tool->ksymbol(tool, event, sample, machine);
  1292. case PERF_RECORD_BPF_EVENT:
  1293. return tool->bpf(tool, event, sample, machine);
  1294. case PERF_RECORD_TEXT_POKE:
  1295. return tool->text_poke(tool, event, sample, machine);
  1296. case PERF_RECORD_AUX_OUTPUT_HW_ID:
  1297. return tool->aux_output_hw_id(tool, event, sample, machine);
  1298. case PERF_RECORD_CALLCHAIN_DEFERRED:
  1299. dump_deferred_callchain(evsel, event, sample);
  1300. return evlist__deliver_deferred_callchain(evlist, tool, event,
  1301. sample, machine);
  1302. default:
  1303. ++evlist->stats.nr_unknown_events;
  1304. return -1;
  1305. }
  1306. }
  1307. static int perf_session__deliver_event(struct perf_session *session,
  1308. union perf_event *event,
  1309. const struct perf_tool *tool,
  1310. u64 file_offset,
  1311. const char *file_path)
  1312. {
  1313. struct perf_sample sample;
  1314. int ret;
  1315. perf_sample__init(&sample, /*all=*/false);
  1316. ret = evlist__parse_sample(session->evlist, event, &sample);
  1317. if (ret) {
  1318. pr_err("Can't parse sample, err = %d\n", ret);
  1319. goto out;
  1320. }
  1321. ret = auxtrace__process_event(session, event, &sample, tool);
  1322. if (ret < 0)
  1323. goto out;
  1324. if (ret > 0) {
  1325. ret = 0;
  1326. goto out;
  1327. }
  1328. ret = machines__deliver_event(&session->machines, session->evlist,
  1329. event, &sample, tool, file_offset, file_path);
  1330. if (dump_trace && sample.aux_sample.size)
  1331. auxtrace__dump_auxtrace_sample(session, &sample);
  1332. out:
  1333. perf_sample__exit(&sample);
  1334. return ret;
  1335. }
  1336. static s64 perf_session__process_user_event(struct perf_session *session,
  1337. union perf_event *event,
  1338. u64 file_offset,
  1339. const char *file_path)
  1340. {
  1341. struct ordered_events *oe = &session->ordered_events;
  1342. const struct perf_tool *tool = session->tool;
  1343. struct perf_sample sample;
  1344. int fd = perf_data__fd(session->data);
  1345. s64 err;
  1346. perf_sample__init(&sample, /*all=*/true);
  1347. if ((event->header.type != PERF_RECORD_COMPRESSED &&
  1348. event->header.type != PERF_RECORD_COMPRESSED2) ||
  1349. perf_tool__compressed_is_stub(tool))
  1350. dump_event(session->evlist, event, file_offset, &sample, file_path);
  1351. /* These events are processed right away */
  1352. switch (event->header.type) {
  1353. case PERF_RECORD_HEADER_ATTR:
  1354. err = tool->attr(tool, event, &session->evlist);
  1355. if (err == 0) {
  1356. perf_session__set_id_hdr_size(session);
  1357. perf_session__set_comm_exec(session);
  1358. }
  1359. break;
  1360. case PERF_RECORD_EVENT_UPDATE:
  1361. err = tool->event_update(tool, event, &session->evlist);
  1362. break;
  1363. case PERF_RECORD_HEADER_EVENT_TYPE:
  1364. /*
  1365. * Deprecated, but we need to handle it for sake
  1366. * of old data files create in pipe mode.
  1367. */
  1368. err = 0;
  1369. break;
  1370. case PERF_RECORD_HEADER_TRACING_DATA:
  1371. /*
  1372. * Setup for reading amidst mmap, but only when we
  1373. * are in 'file' mode. The 'pipe' fd is in proper
  1374. * place already.
  1375. */
  1376. if (!perf_data__is_pipe(session->data))
  1377. lseek(fd, file_offset, SEEK_SET);
  1378. err = tool->tracing_data(tool, session, event);
  1379. break;
  1380. case PERF_RECORD_HEADER_BUILD_ID:
  1381. err = tool->build_id(tool, session, event);
  1382. break;
  1383. case PERF_RECORD_FINISHED_ROUND:
  1384. err = tool->finished_round(tool, event, oe);
  1385. break;
  1386. case PERF_RECORD_ID_INDEX:
  1387. err = tool->id_index(tool, session, event);
  1388. break;
  1389. case PERF_RECORD_AUXTRACE_INFO:
  1390. err = tool->auxtrace_info(tool, session, event);
  1391. break;
  1392. case PERF_RECORD_AUXTRACE:
  1393. /*
  1394. * Setup for reading amidst mmap, but only when we
  1395. * are in 'file' mode. The 'pipe' fd is in proper
  1396. * place already.
  1397. */
  1398. if (!perf_data__is_pipe(session->data))
  1399. lseek(fd, file_offset + event->header.size, SEEK_SET);
  1400. err = tool->auxtrace(tool, session, event);
  1401. break;
  1402. case PERF_RECORD_AUXTRACE_ERROR:
  1403. perf_session__auxtrace_error_inc(session, event);
  1404. err = tool->auxtrace_error(tool, session, event);
  1405. break;
  1406. case PERF_RECORD_THREAD_MAP:
  1407. err = tool->thread_map(tool, session, event);
  1408. break;
  1409. case PERF_RECORD_CPU_MAP:
  1410. err = tool->cpu_map(tool, session, event);
  1411. break;
  1412. case PERF_RECORD_STAT_CONFIG:
  1413. err = tool->stat_config(tool, session, event);
  1414. break;
  1415. case PERF_RECORD_STAT:
  1416. err = tool->stat(tool, session, event);
  1417. break;
  1418. case PERF_RECORD_STAT_ROUND:
  1419. err = tool->stat_round(tool, session, event);
  1420. break;
  1421. case PERF_RECORD_TIME_CONV:
  1422. session->time_conv = event->time_conv;
  1423. err = tool->time_conv(tool, session, event);
  1424. break;
  1425. case PERF_RECORD_HEADER_FEATURE:
  1426. err = tool->feature(tool, session, event);
  1427. break;
  1428. case PERF_RECORD_COMPRESSED:
  1429. case PERF_RECORD_COMPRESSED2:
  1430. err = tool->compressed(tool, session, event, file_offset, file_path);
  1431. if (err)
  1432. dump_event(session->evlist, event, file_offset, &sample, file_path);
  1433. break;
  1434. case PERF_RECORD_FINISHED_INIT:
  1435. err = tool->finished_init(tool, session, event);
  1436. break;
  1437. case PERF_RECORD_BPF_METADATA:
  1438. err = tool->bpf_metadata(tool, session, event);
  1439. break;
  1440. case PERF_RECORD_SCHEDSTAT_CPU:
  1441. err = tool->schedstat_cpu(tool, session, event);
  1442. break;
  1443. case PERF_RECORD_SCHEDSTAT_DOMAIN:
  1444. err = tool->schedstat_domain(tool, session, event);
  1445. break;
  1446. default:
  1447. err = -EINVAL;
  1448. break;
  1449. }
  1450. perf_sample__exit(&sample);
  1451. return err;
  1452. }
  1453. int perf_session__deliver_synth_event(struct perf_session *session,
  1454. union perf_event *event,
  1455. struct perf_sample *sample)
  1456. {
  1457. struct evlist *evlist = session->evlist;
  1458. const struct perf_tool *tool = session->tool;
  1459. events_stats__inc(&evlist->stats, event->header.type);
  1460. if (event->header.type >= PERF_RECORD_USER_TYPE_START)
  1461. return perf_session__process_user_event(session, event, 0, NULL);
  1462. return machines__deliver_event(&session->machines, evlist, event, sample, tool, 0, NULL);
  1463. }
  1464. int perf_session__deliver_synth_attr_event(struct perf_session *session,
  1465. const struct perf_event_attr *attr,
  1466. u64 id)
  1467. {
  1468. union {
  1469. struct {
  1470. struct perf_record_header_attr attr;
  1471. u64 ids[1];
  1472. } attr_id;
  1473. union perf_event ev;
  1474. } ev = {
  1475. .attr_id.attr.header.type = PERF_RECORD_HEADER_ATTR,
  1476. .attr_id.attr.header.size = sizeof(ev.attr_id),
  1477. .attr_id.ids[0] = id,
  1478. };
  1479. if (attr->size != sizeof(ev.attr_id.attr.attr)) {
  1480. pr_debug("Unexpected perf_event_attr size\n");
  1481. return -EINVAL;
  1482. }
  1483. ev.attr_id.attr.attr = *attr;
  1484. return perf_session__deliver_synth_event(session, &ev.ev, NULL);
  1485. }
  1486. static void event_swap(union perf_event *event, bool sample_id_all)
  1487. {
  1488. perf_event__swap_op swap;
  1489. swap = perf_event__swap_ops[event->header.type];
  1490. if (swap)
  1491. swap(event, sample_id_all);
  1492. }
  1493. int perf_session__peek_event(struct perf_session *session, off_t file_offset,
  1494. void *buf, size_t buf_sz,
  1495. union perf_event **event_ptr,
  1496. struct perf_sample *sample)
  1497. {
  1498. union perf_event *event;
  1499. size_t hdr_sz, rest;
  1500. int fd;
  1501. if (session->one_mmap && !session->header.needs_swap) {
  1502. event = file_offset - session->one_mmap_offset +
  1503. session->one_mmap_addr;
  1504. goto out_parse_sample;
  1505. }
  1506. if (perf_data__is_pipe(session->data))
  1507. return -1;
  1508. fd = perf_data__fd(session->data);
  1509. hdr_sz = sizeof(struct perf_event_header);
  1510. if (buf_sz < hdr_sz)
  1511. return -1;
  1512. if (lseek(fd, file_offset, SEEK_SET) == (off_t)-1 ||
  1513. readn(fd, buf, hdr_sz) != (ssize_t)hdr_sz)
  1514. return -1;
  1515. event = (union perf_event *)buf;
  1516. if (session->header.needs_swap)
  1517. perf_event_header__bswap(&event->header);
  1518. if (event->header.size < hdr_sz || event->header.size > buf_sz)
  1519. return -1;
  1520. buf += hdr_sz;
  1521. rest = event->header.size - hdr_sz;
  1522. if (readn(fd, buf, rest) != (ssize_t)rest)
  1523. return -1;
  1524. if (session->header.needs_swap)
  1525. event_swap(event, evlist__sample_id_all(session->evlist));
  1526. out_parse_sample:
  1527. if (sample && event->header.type < PERF_RECORD_USER_TYPE_START &&
  1528. evlist__parse_sample(session->evlist, event, sample))
  1529. return -1;
  1530. *event_ptr = event;
  1531. return 0;
  1532. }
  1533. int perf_session__peek_events(struct perf_session *session, u64 offset,
  1534. u64 size, peek_events_cb_t cb, void *data)
  1535. {
  1536. u64 max_offset = offset + size;
  1537. char buf[PERF_SAMPLE_MAX_SIZE];
  1538. union perf_event *event;
  1539. int err;
  1540. do {
  1541. err = perf_session__peek_event(session, offset, buf,
  1542. PERF_SAMPLE_MAX_SIZE, &event,
  1543. NULL);
  1544. if (err)
  1545. return err;
  1546. err = cb(session, event, offset, data);
  1547. if (err)
  1548. return err;
  1549. offset += event->header.size;
  1550. if (event->header.type == PERF_RECORD_AUXTRACE)
  1551. offset += event->auxtrace.size;
  1552. } while (offset < max_offset);
  1553. return err;
  1554. }
  1555. static s64 perf_session__process_event(struct perf_session *session,
  1556. union perf_event *event, u64 file_offset,
  1557. const char *file_path)
  1558. {
  1559. struct evlist *evlist = session->evlist;
  1560. const struct perf_tool *tool = session->tool;
  1561. int ret;
  1562. if (session->header.needs_swap)
  1563. event_swap(event, evlist__sample_id_all(evlist));
  1564. if (event->header.type >= PERF_RECORD_HEADER_MAX) {
  1565. /* perf should not support unaligned event, stop here. */
  1566. if (event->header.size % sizeof(u64))
  1567. return -EINVAL;
  1568. /* This perf is outdated and does not support the latest event type. */
  1569. ui__warning("Unsupported header type %u, please consider updating perf.\n",
  1570. event->header.type);
  1571. /* Skip unsupported event by returning its size. */
  1572. return event->header.size;
  1573. }
  1574. events_stats__inc(&evlist->stats, event->header.type);
  1575. if (event->header.type >= PERF_RECORD_USER_TYPE_START)
  1576. return perf_session__process_user_event(session, event, file_offset, file_path);
  1577. if (tool->ordered_events) {
  1578. u64 timestamp = -1ULL;
  1579. ret = evlist__parse_sample_timestamp(evlist, event, &timestamp);
  1580. if (ret && ret != -1)
  1581. return ret;
  1582. ret = perf_session__queue_event(session, event, timestamp, file_offset, file_path);
  1583. if (ret != -ETIME)
  1584. return ret;
  1585. }
  1586. return perf_session__deliver_event(session, event, tool, file_offset, file_path);
  1587. }
  1588. void perf_event_header__bswap(struct perf_event_header *hdr)
  1589. {
  1590. hdr->type = bswap_32(hdr->type);
  1591. hdr->misc = bswap_16(hdr->misc);
  1592. hdr->size = bswap_16(hdr->size);
  1593. }
  1594. struct thread *perf_session__findnew(struct perf_session *session, pid_t pid)
  1595. {
  1596. return machine__findnew_thread(&session->machines.host, -1, pid);
  1597. }
  1598. int perf_session__register_idle_thread(struct perf_session *session)
  1599. {
  1600. struct thread *thread = machine__idle_thread(&session->machines.host);
  1601. /* machine__idle_thread() got the thread, so put it */
  1602. thread__put(thread);
  1603. return thread ? 0 : -1;
  1604. }
  1605. static void
  1606. perf_session__warn_order(const struct perf_session *session)
  1607. {
  1608. const struct ordered_events *oe = &session->ordered_events;
  1609. struct evsel *evsel;
  1610. bool should_warn = true;
  1611. evlist__for_each_entry(session->evlist, evsel) {
  1612. if (evsel->core.attr.write_backward)
  1613. should_warn = false;
  1614. }
  1615. if (!should_warn)
  1616. return;
  1617. if (oe->nr_unordered_events != 0)
  1618. ui__warning("%u out of order events recorded.\n", oe->nr_unordered_events);
  1619. }
  1620. static void perf_session__warn_about_errors(const struct perf_session *session)
  1621. {
  1622. const struct events_stats *stats = &session->evlist->stats;
  1623. if (session->tool->lost == perf_event__process_lost &&
  1624. stats->nr_events[PERF_RECORD_LOST] != 0) {
  1625. ui__warning("Processed %d events and lost %d chunks!\n\n"
  1626. "Check IO/CPU overload!\n\n",
  1627. stats->nr_events[0],
  1628. stats->nr_events[PERF_RECORD_LOST]);
  1629. }
  1630. if (session->tool->lost_samples == perf_event__process_lost_samples) {
  1631. double drop_rate;
  1632. drop_rate = (double)stats->total_lost_samples /
  1633. (double) (stats->nr_events[PERF_RECORD_SAMPLE] + stats->total_lost_samples);
  1634. if (drop_rate > 0.05) {
  1635. ui__warning("Processed %" PRIu64 " samples and lost %3.2f%%!\n\n",
  1636. stats->nr_events[PERF_RECORD_SAMPLE] + stats->total_lost_samples,
  1637. drop_rate * 100.0);
  1638. }
  1639. }
  1640. if (session->tool->aux == perf_event__process_aux &&
  1641. stats->total_aux_lost != 0) {
  1642. ui__warning("AUX data lost %" PRIu64 " times out of %u!\n\n",
  1643. stats->total_aux_lost,
  1644. stats->nr_events[PERF_RECORD_AUX]);
  1645. }
  1646. if (session->tool->aux == perf_event__process_aux &&
  1647. stats->total_aux_partial != 0) {
  1648. bool vmm_exclusive = false;
  1649. (void)sysfs__read_bool("module/kvm_intel/parameters/vmm_exclusive",
  1650. &vmm_exclusive);
  1651. ui__warning("AUX data had gaps in it %" PRIu64 " times out of %u!\n\n"
  1652. "Are you running a KVM guest in the background?%s\n\n",
  1653. stats->total_aux_partial,
  1654. stats->nr_events[PERF_RECORD_AUX],
  1655. vmm_exclusive ?
  1656. "\nReloading kvm_intel module with vmm_exclusive=0\n"
  1657. "will reduce the gaps to only guest's timeslices." :
  1658. "");
  1659. }
  1660. if (session->tool->aux == perf_event__process_aux &&
  1661. stats->total_aux_collision != 0) {
  1662. ui__warning("AUX data detected collision %" PRIu64 " times out of %u!\n\n",
  1663. stats->total_aux_collision,
  1664. stats->nr_events[PERF_RECORD_AUX]);
  1665. }
  1666. if (stats->nr_unknown_events != 0) {
  1667. ui__warning("Found %u unknown events!\n\n"
  1668. "Is this an older tool processing a perf.data "
  1669. "file generated by a more recent tool?\n\n"
  1670. "If that is not the case, consider "
  1671. "reporting to linux-kernel@vger.kernel.org.\n\n",
  1672. stats->nr_unknown_events);
  1673. }
  1674. if (stats->nr_unknown_id != 0) {
  1675. ui__warning("%u samples with id not present in the header\n",
  1676. stats->nr_unknown_id);
  1677. }
  1678. if (stats->nr_invalid_chains != 0) {
  1679. ui__warning("Found invalid callchains!\n\n"
  1680. "%u out of %u events were discarded for this reason.\n\n"
  1681. "Consider reporting to linux-kernel@vger.kernel.org.\n\n",
  1682. stats->nr_invalid_chains,
  1683. stats->nr_events[PERF_RECORD_SAMPLE]);
  1684. }
  1685. if (stats->nr_unprocessable_samples != 0) {
  1686. ui__warning("%u unprocessable samples recorded.\n"
  1687. "Do you have a KVM guest running and not using 'perf kvm'?\n",
  1688. stats->nr_unprocessable_samples);
  1689. }
  1690. perf_session__warn_order(session);
  1691. events_stats__auxtrace_error_warn(stats);
  1692. if (stats->nr_proc_map_timeout != 0) {
  1693. ui__warning("%d map information files for pre-existing threads were\n"
  1694. "not processed, if there are samples for addresses they\n"
  1695. "will not be resolved, you may find out which are these\n"
  1696. "threads by running with -v and redirecting the output\n"
  1697. "to a file.\n"
  1698. "The time limit to process proc map is too short?\n"
  1699. "Increase it by --proc-map-timeout\n",
  1700. stats->nr_proc_map_timeout);
  1701. }
  1702. }
  1703. static int perf_session__flush_thread_stack(struct thread *thread,
  1704. void *p __maybe_unused)
  1705. {
  1706. return thread_stack__flush(thread);
  1707. }
  1708. static int perf_session__flush_thread_stacks(struct perf_session *session)
  1709. {
  1710. return machines__for_each_thread(&session->machines,
  1711. perf_session__flush_thread_stack,
  1712. NULL);
  1713. }
  1714. volatile sig_atomic_t session_done;
  1715. static int __perf_session__process_decomp_events(struct perf_session *session);
  1716. static int __perf_session__process_pipe_events(struct perf_session *session)
  1717. {
  1718. struct ordered_events *oe = &session->ordered_events;
  1719. const struct perf_tool *tool = session->tool;
  1720. struct ui_progress prog;
  1721. union perf_event *event;
  1722. uint32_t size, cur_size = 0;
  1723. void *buf = NULL;
  1724. s64 skip = 0;
  1725. u64 head;
  1726. ssize_t err;
  1727. void *p;
  1728. bool update_prog = false;
  1729. /*
  1730. * If it's from a file saving pipe data (by redirection), it would have
  1731. * a file name other than "-". Then we can get the total size and show
  1732. * the progress.
  1733. */
  1734. if (strcmp(session->data->path, "-") && session->data->file.size) {
  1735. ui_progress__init_size(&prog, session->data->file.size,
  1736. "Processing events...");
  1737. update_prog = true;
  1738. }
  1739. head = 0;
  1740. cur_size = sizeof(union perf_event);
  1741. buf = malloc(cur_size);
  1742. if (!buf)
  1743. return -errno;
  1744. ordered_events__set_copy_on_queue(oe, true);
  1745. more:
  1746. event = buf;
  1747. err = perf_data__read(session->data, event,
  1748. sizeof(struct perf_event_header));
  1749. if (err <= 0) {
  1750. if (err == 0)
  1751. goto done;
  1752. pr_err("failed to read event header\n");
  1753. goto out_err;
  1754. }
  1755. if (session->header.needs_swap)
  1756. perf_event_header__bswap(&event->header);
  1757. size = event->header.size;
  1758. if (size < sizeof(struct perf_event_header)) {
  1759. pr_err("bad event header size\n");
  1760. goto out_err;
  1761. }
  1762. if (size > cur_size) {
  1763. void *new = realloc(buf, size);
  1764. if (!new) {
  1765. pr_err("failed to allocate memory to read event\n");
  1766. goto out_err;
  1767. }
  1768. buf = new;
  1769. cur_size = size;
  1770. event = buf;
  1771. }
  1772. p = event;
  1773. p += sizeof(struct perf_event_header);
  1774. if (size - sizeof(struct perf_event_header)) {
  1775. err = perf_data__read(session->data, p,
  1776. size - sizeof(struct perf_event_header));
  1777. if (err <= 0) {
  1778. if (err == 0) {
  1779. pr_err("unexpected end of event stream\n");
  1780. goto done;
  1781. }
  1782. pr_err("failed to read event data\n");
  1783. goto out_err;
  1784. }
  1785. }
  1786. if ((skip = perf_session__process_event(session, event, head, "pipe")) < 0) {
  1787. pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
  1788. head, event->header.size, event->header.type);
  1789. err = -EINVAL;
  1790. goto out_err;
  1791. }
  1792. head += size;
  1793. if (skip > 0)
  1794. head += skip;
  1795. err = __perf_session__process_decomp_events(session);
  1796. if (err)
  1797. goto out_err;
  1798. if (update_prog)
  1799. ui_progress__update(&prog, size);
  1800. if (!session_done())
  1801. goto more;
  1802. done:
  1803. /* do the final flush for ordered samples */
  1804. err = ordered_events__flush(oe, OE_FLUSH__FINAL);
  1805. if (err)
  1806. goto out_err;
  1807. err = session__flush_deferred_samples(session, tool);
  1808. if (err)
  1809. goto out_err;
  1810. err = auxtrace__flush_events(session, tool);
  1811. if (err)
  1812. goto out_err;
  1813. err = perf_session__flush_thread_stacks(session);
  1814. out_err:
  1815. free(buf);
  1816. if (update_prog)
  1817. ui_progress__finish();
  1818. if (!tool->no_warn)
  1819. perf_session__warn_about_errors(session);
  1820. ordered_events__free(&session->ordered_events);
  1821. auxtrace__free_events(session);
  1822. return err;
  1823. }
  1824. static union perf_event *
  1825. prefetch_event(char *buf, u64 head, size_t mmap_size,
  1826. bool needs_swap, union perf_event *error)
  1827. {
  1828. union perf_event *event;
  1829. u16 event_size;
  1830. /*
  1831. * Ensure we have enough space remaining to read
  1832. * the size of the event in the headers.
  1833. */
  1834. if (head + sizeof(event->header) > mmap_size)
  1835. return NULL;
  1836. event = (union perf_event *)(buf + head);
  1837. if (needs_swap)
  1838. perf_event_header__bswap(&event->header);
  1839. event_size = event->header.size;
  1840. if (head + event_size <= mmap_size)
  1841. return event;
  1842. /* We're not fetching the event so swap back again */
  1843. if (needs_swap)
  1844. perf_event_header__bswap(&event->header);
  1845. /* Check if the event fits into the next mmapped buf. */
  1846. if (event_size <= mmap_size - head % page_size) {
  1847. /* Remap buf and fetch again. */
  1848. return NULL;
  1849. }
  1850. /* Invalid input. Event size should never exceed mmap_size. */
  1851. pr_debug("%s: head=%#" PRIx64 " event->header.size=%#x, mmap_size=%#zx:"
  1852. " fuzzed or compressed perf.data?\n", __func__, head, event_size, mmap_size);
  1853. return error;
  1854. }
  1855. static union perf_event *
  1856. fetch_mmaped_event(u64 head, size_t mmap_size, char *buf, bool needs_swap)
  1857. {
  1858. return prefetch_event(buf, head, mmap_size, needs_swap, ERR_PTR(-EINVAL));
  1859. }
  1860. static union perf_event *
  1861. fetch_decomp_event(u64 head, size_t mmap_size, char *buf, bool needs_swap)
  1862. {
  1863. return prefetch_event(buf, head, mmap_size, needs_swap, NULL);
  1864. }
  1865. static int __perf_session__process_decomp_events(struct perf_session *session)
  1866. {
  1867. s64 skip;
  1868. u64 size;
  1869. struct decomp *decomp = session->active_decomp->decomp_last;
  1870. if (!decomp)
  1871. return 0;
  1872. while (decomp->head < decomp->size && !session_done()) {
  1873. union perf_event *event = fetch_decomp_event(decomp->head, decomp->size, decomp->data,
  1874. session->header.needs_swap);
  1875. if (!event)
  1876. break;
  1877. size = event->header.size;
  1878. if (size < sizeof(struct perf_event_header) ||
  1879. (skip = perf_session__process_event(session, event, decomp->file_pos,
  1880. decomp->file_path)) < 0) {
  1881. pr_err("%#" PRIx64 " [%#x]: failed to process type: %d\n",
  1882. decomp->file_pos + decomp->head, event->header.size, event->header.type);
  1883. return -EINVAL;
  1884. }
  1885. if (skip)
  1886. size += skip;
  1887. decomp->head += size;
  1888. }
  1889. return 0;
  1890. }
  1891. /*
  1892. * On 64bit we can mmap the data file in one go. No need for tiny mmap
  1893. * slices. On 32bit we use 32MB.
  1894. */
  1895. #if BITS_PER_LONG == 64
  1896. #define MMAP_SIZE ULLONG_MAX
  1897. #define NUM_MMAPS 1
  1898. #else
  1899. #define MMAP_SIZE (32 * 1024 * 1024ULL)
  1900. #define NUM_MMAPS 128
  1901. #endif
  1902. struct reader;
  1903. typedef s64 (*reader_cb_t)(struct perf_session *session,
  1904. union perf_event *event,
  1905. u64 file_offset,
  1906. const char *file_path);
  1907. struct reader {
  1908. int fd;
  1909. const char *path;
  1910. u64 data_size;
  1911. u64 data_offset;
  1912. reader_cb_t process;
  1913. bool in_place_update;
  1914. char *mmaps[NUM_MMAPS];
  1915. size_t mmap_size;
  1916. int mmap_idx;
  1917. char *mmap_cur;
  1918. u64 file_pos;
  1919. u64 file_offset;
  1920. u64 head;
  1921. u64 size;
  1922. bool done;
  1923. struct zstd_data zstd_data;
  1924. struct decomp_data decomp_data;
  1925. };
  1926. static int
  1927. reader__init(struct reader *rd, bool *one_mmap)
  1928. {
  1929. u64 data_size = rd->data_size;
  1930. char **mmaps = rd->mmaps;
  1931. rd->head = rd->data_offset;
  1932. data_size += rd->data_offset;
  1933. rd->mmap_size = MMAP_SIZE;
  1934. if (rd->mmap_size > data_size) {
  1935. rd->mmap_size = data_size;
  1936. if (one_mmap)
  1937. *one_mmap = true;
  1938. }
  1939. memset(mmaps, 0, sizeof(rd->mmaps));
  1940. if (zstd_init(&rd->zstd_data, 0))
  1941. return -1;
  1942. rd->decomp_data.zstd_decomp = &rd->zstd_data;
  1943. return 0;
  1944. }
  1945. static void
  1946. reader__release_decomp(struct reader *rd)
  1947. {
  1948. perf_decomp__release_events(rd->decomp_data.decomp);
  1949. zstd_fini(&rd->zstd_data);
  1950. }
  1951. static int
  1952. reader__mmap(struct reader *rd, struct perf_session *session)
  1953. {
  1954. int mmap_prot, mmap_flags;
  1955. char *buf, **mmaps = rd->mmaps;
  1956. u64 page_offset;
  1957. mmap_prot = PROT_READ;
  1958. mmap_flags = MAP_SHARED;
  1959. if (rd->in_place_update) {
  1960. mmap_prot |= PROT_WRITE;
  1961. } else if (session->header.needs_swap) {
  1962. mmap_prot |= PROT_WRITE;
  1963. mmap_flags = MAP_PRIVATE;
  1964. }
  1965. if (mmaps[rd->mmap_idx]) {
  1966. munmap(mmaps[rd->mmap_idx], rd->mmap_size);
  1967. mmaps[rd->mmap_idx] = NULL;
  1968. }
  1969. page_offset = page_size * (rd->head / page_size);
  1970. rd->file_offset += page_offset;
  1971. rd->head -= page_offset;
  1972. buf = mmap(NULL, rd->mmap_size, mmap_prot, mmap_flags, rd->fd,
  1973. rd->file_offset);
  1974. if (buf == MAP_FAILED) {
  1975. pr_err("failed to mmap file\n");
  1976. return -errno;
  1977. }
  1978. mmaps[rd->mmap_idx] = rd->mmap_cur = buf;
  1979. rd->mmap_idx = (rd->mmap_idx + 1) & (ARRAY_SIZE(rd->mmaps) - 1);
  1980. rd->file_pos = rd->file_offset + rd->head;
  1981. if (session->one_mmap) {
  1982. session->one_mmap_addr = buf;
  1983. session->one_mmap_offset = rd->file_offset;
  1984. }
  1985. return 0;
  1986. }
  1987. enum {
  1988. READER_OK,
  1989. READER_NODATA,
  1990. };
  1991. static int
  1992. reader__read_event(struct reader *rd, struct perf_session *session,
  1993. struct ui_progress *prog)
  1994. {
  1995. u64 size;
  1996. int err = READER_OK;
  1997. union perf_event *event;
  1998. s64 skip;
  1999. event = fetch_mmaped_event(rd->head, rd->mmap_size, rd->mmap_cur,
  2000. session->header.needs_swap);
  2001. if (IS_ERR(event))
  2002. return PTR_ERR(event);
  2003. if (!event)
  2004. return READER_NODATA;
  2005. size = event->header.size;
  2006. skip = -EINVAL;
  2007. if (size < sizeof(struct perf_event_header) ||
  2008. (skip = rd->process(session, event, rd->file_pos, rd->path)) < 0) {
  2009. errno = -skip;
  2010. pr_err("%#" PRIx64 " [%#x]: failed to process type: %d [%m]\n",
  2011. rd->file_offset + rd->head, event->header.size,
  2012. event->header.type);
  2013. err = skip;
  2014. goto out;
  2015. }
  2016. if (skip)
  2017. size += skip;
  2018. rd->size += size;
  2019. rd->head += size;
  2020. rd->file_pos += size;
  2021. err = __perf_session__process_decomp_events(session);
  2022. if (err)
  2023. goto out;
  2024. ui_progress__update(prog, size);
  2025. out:
  2026. return err;
  2027. }
  2028. static inline bool
  2029. reader__eof(struct reader *rd)
  2030. {
  2031. return (rd->file_pos >= rd->data_size + rd->data_offset);
  2032. }
  2033. static int
  2034. reader__process_events(struct reader *rd, struct perf_session *session,
  2035. struct ui_progress *prog)
  2036. {
  2037. int err;
  2038. err = reader__init(rd, &session->one_mmap);
  2039. if (err)
  2040. goto out;
  2041. session->active_decomp = &rd->decomp_data;
  2042. remap:
  2043. err = reader__mmap(rd, session);
  2044. if (err)
  2045. goto out;
  2046. more:
  2047. err = reader__read_event(rd, session, prog);
  2048. if (err < 0)
  2049. goto out;
  2050. else if (err == READER_NODATA)
  2051. goto remap;
  2052. if (session_done())
  2053. goto out;
  2054. if (!reader__eof(rd))
  2055. goto more;
  2056. out:
  2057. session->active_decomp = &session->decomp_data;
  2058. return err;
  2059. }
  2060. static s64 process_simple(struct perf_session *session,
  2061. union perf_event *event,
  2062. u64 file_offset,
  2063. const char *file_path)
  2064. {
  2065. return perf_session__process_event(session, event, file_offset, file_path);
  2066. }
  2067. static int __perf_session__process_events(struct perf_session *session)
  2068. {
  2069. struct reader rd = {
  2070. .fd = perf_data__fd(session->data),
  2071. .path = session->data->file.path,
  2072. .data_size = session->header.data_size,
  2073. .data_offset = session->header.data_offset,
  2074. .process = process_simple,
  2075. .in_place_update = session->data->in_place_update,
  2076. };
  2077. struct ordered_events *oe = &session->ordered_events;
  2078. const struct perf_tool *tool = session->tool;
  2079. struct ui_progress prog;
  2080. int err;
  2081. if (rd.data_size == 0)
  2082. return -1;
  2083. ui_progress__init_size(&prog, rd.data_size, "Processing events...");
  2084. err = reader__process_events(&rd, session, &prog);
  2085. if (err)
  2086. goto out_err;
  2087. /* do the final flush for ordered samples */
  2088. err = ordered_events__flush(oe, OE_FLUSH__FINAL);
  2089. if (err)
  2090. goto out_err;
  2091. err = auxtrace__flush_events(session, tool);
  2092. if (err)
  2093. goto out_err;
  2094. err = session__flush_deferred_samples(session, tool);
  2095. if (err)
  2096. goto out_err;
  2097. err = perf_session__flush_thread_stacks(session);
  2098. out_err:
  2099. ui_progress__finish();
  2100. if (!tool->no_warn)
  2101. perf_session__warn_about_errors(session);
  2102. /*
  2103. * We may switching perf.data output, make ordered_events
  2104. * reusable.
  2105. */
  2106. ordered_events__reinit(&session->ordered_events);
  2107. auxtrace__free_events(session);
  2108. reader__release_decomp(&rd);
  2109. session->one_mmap = false;
  2110. return err;
  2111. }
  2112. /*
  2113. * Processing 2 MB of data from each reader in sequence,
  2114. * because that's the way the ordered events sorting works
  2115. * most efficiently.
  2116. */
  2117. #define READER_MAX_SIZE (2 * 1024 * 1024)
  2118. /*
  2119. * This function reads, merge and process directory data.
  2120. * It assumens the version 1 of directory data, where each
  2121. * data file holds per-cpu data, already sorted by kernel.
  2122. */
  2123. static int __perf_session__process_dir_events(struct perf_session *session)
  2124. {
  2125. struct perf_data *data = session->data;
  2126. const struct perf_tool *tool = session->tool;
  2127. int i, ret, readers, nr_readers;
  2128. struct ui_progress prog;
  2129. u64 total_size = perf_data__size(session->data);
  2130. struct reader *rd;
  2131. ui_progress__init_size(&prog, total_size, "Processing events...");
  2132. nr_readers = 1;
  2133. for (i = 0; i < data->dir.nr; i++) {
  2134. if (data->dir.files[i].size)
  2135. nr_readers++;
  2136. }
  2137. rd = zalloc(nr_readers * sizeof(struct reader));
  2138. if (!rd)
  2139. return -ENOMEM;
  2140. rd[0] = (struct reader) {
  2141. .fd = perf_data__fd(session->data),
  2142. .path = session->data->file.path,
  2143. .data_size = session->header.data_size,
  2144. .data_offset = session->header.data_offset,
  2145. .process = process_simple,
  2146. .in_place_update = session->data->in_place_update,
  2147. };
  2148. ret = reader__init(&rd[0], NULL);
  2149. if (ret)
  2150. goto out_err;
  2151. ret = reader__mmap(&rd[0], session);
  2152. if (ret)
  2153. goto out_err;
  2154. readers = 1;
  2155. for (i = 0; i < data->dir.nr; i++) {
  2156. if (!data->dir.files[i].size)
  2157. continue;
  2158. rd[readers] = (struct reader) {
  2159. .fd = data->dir.files[i].fd,
  2160. .path = data->dir.files[i].path,
  2161. .data_size = data->dir.files[i].size,
  2162. .data_offset = 0,
  2163. .process = process_simple,
  2164. .in_place_update = session->data->in_place_update,
  2165. };
  2166. ret = reader__init(&rd[readers], NULL);
  2167. if (ret)
  2168. goto out_err;
  2169. ret = reader__mmap(&rd[readers], session);
  2170. if (ret)
  2171. goto out_err;
  2172. readers++;
  2173. }
  2174. i = 0;
  2175. while (readers) {
  2176. if (session_done())
  2177. break;
  2178. if (rd[i].done) {
  2179. i = (i + 1) % nr_readers;
  2180. continue;
  2181. }
  2182. if (reader__eof(&rd[i])) {
  2183. rd[i].done = true;
  2184. readers--;
  2185. continue;
  2186. }
  2187. session->active_decomp = &rd[i].decomp_data;
  2188. ret = reader__read_event(&rd[i], session, &prog);
  2189. if (ret < 0) {
  2190. goto out_err;
  2191. } else if (ret == READER_NODATA) {
  2192. ret = reader__mmap(&rd[i], session);
  2193. if (ret)
  2194. goto out_err;
  2195. }
  2196. if (rd[i].size >= READER_MAX_SIZE) {
  2197. rd[i].size = 0;
  2198. i = (i + 1) % nr_readers;
  2199. }
  2200. }
  2201. ret = ordered_events__flush(&session->ordered_events, OE_FLUSH__FINAL);
  2202. if (ret)
  2203. goto out_err;
  2204. ret = session__flush_deferred_samples(session, tool);
  2205. if (ret)
  2206. goto out_err;
  2207. ret = perf_session__flush_thread_stacks(session);
  2208. out_err:
  2209. ui_progress__finish();
  2210. if (!tool->no_warn)
  2211. perf_session__warn_about_errors(session);
  2212. /*
  2213. * We may switching perf.data output, make ordered_events
  2214. * reusable.
  2215. */
  2216. ordered_events__reinit(&session->ordered_events);
  2217. session->one_mmap = false;
  2218. session->active_decomp = &session->decomp_data;
  2219. for (i = 0; i < nr_readers; i++)
  2220. reader__release_decomp(&rd[i]);
  2221. zfree(&rd);
  2222. return ret;
  2223. }
  2224. int perf_session__process_events(struct perf_session *session)
  2225. {
  2226. if (perf_session__register_idle_thread(session) < 0)
  2227. return -ENOMEM;
  2228. if (perf_data__is_pipe(session->data))
  2229. return __perf_session__process_pipe_events(session);
  2230. if (perf_data__is_dir(session->data) && session->data->dir.nr)
  2231. return __perf_session__process_dir_events(session);
  2232. return __perf_session__process_events(session);
  2233. }
  2234. bool perf_session__has_traces(struct perf_session *session, const char *msg)
  2235. {
  2236. struct evsel *evsel;
  2237. evlist__for_each_entry(session->evlist, evsel) {
  2238. if (evsel->core.attr.type == PERF_TYPE_TRACEPOINT)
  2239. return true;
  2240. }
  2241. pr_err("No trace sample to read. Did you call 'perf %s'?\n", msg);
  2242. return false;
  2243. }
  2244. bool perf_session__has_switch_events(struct perf_session *session)
  2245. {
  2246. struct evsel *evsel;
  2247. evlist__for_each_entry(session->evlist, evsel) {
  2248. if (evsel->core.attr.context_switch)
  2249. return true;
  2250. }
  2251. return false;
  2252. }
  2253. int map__set_kallsyms_ref_reloc_sym(struct map *map, const char *symbol_name, u64 addr)
  2254. {
  2255. char *bracket, *name;
  2256. struct ref_reloc_sym *ref;
  2257. struct kmap *kmap;
  2258. ref = zalloc(sizeof(struct ref_reloc_sym));
  2259. if (ref == NULL)
  2260. return -ENOMEM;
  2261. ref->name = name = strdup(symbol_name);
  2262. if (ref->name == NULL) {
  2263. free(ref);
  2264. return -ENOMEM;
  2265. }
  2266. bracket = strchr(name, ']');
  2267. if (bracket)
  2268. *bracket = '\0';
  2269. ref->addr = addr;
  2270. kmap = map__kmap(map);
  2271. if (kmap)
  2272. kmap->ref_reloc_sym = ref;
  2273. return 0;
  2274. }
  2275. size_t perf_session__fprintf_dsos(struct perf_session *session, FILE *fp)
  2276. {
  2277. return machines__fprintf_dsos(&session->machines, fp);
  2278. }
  2279. size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp,
  2280. bool (skip)(struct dso *dso, int parm), int parm)
  2281. {
  2282. return machines__fprintf_dsos_buildid(&session->machines, fp, skip, parm);
  2283. }
  2284. size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp)
  2285. {
  2286. size_t ret;
  2287. const char *msg = "";
  2288. if (perf_header__has_feat(&session->header, HEADER_AUXTRACE))
  2289. msg = " (excludes AUX area (e.g. instruction trace) decoded / synthesized events)";
  2290. ret = fprintf(fp, "\nAggregated stats:%s\n", msg);
  2291. ret += events_stats__fprintf(&session->evlist->stats, fp);
  2292. return ret;
  2293. }
  2294. size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
  2295. {
  2296. size_t ret = machine__fprintf(&session->machines.host, fp);
  2297. for (struct rb_node *nd = rb_first_cached(&session->machines.guests); nd; nd = rb_next(nd)) {
  2298. struct machine *pos = rb_entry(nd, struct machine, rb_node);
  2299. ret += machine__fprintf(pos, fp);
  2300. }
  2301. return ret;
  2302. }
  2303. void perf_session__dump_kmaps(struct perf_session *session)
  2304. {
  2305. int save_verbose = verbose;
  2306. fflush(stdout);
  2307. fprintf(stderr, "Kernel and module maps:\n");
  2308. verbose = 0; /* Suppress verbose to print a summary only */
  2309. maps__fprintf(machine__kernel_maps(&session->machines.host), stderr);
  2310. verbose = save_verbose;
  2311. }
  2312. struct evsel *perf_session__find_first_evtype(struct perf_session *session,
  2313. unsigned int type)
  2314. {
  2315. struct evsel *pos;
  2316. evlist__for_each_entry(session->evlist, pos) {
  2317. if (pos->core.attr.type == type)
  2318. return pos;
  2319. }
  2320. return NULL;
  2321. }
  2322. int perf_session__cpu_bitmap(struct perf_session *session,
  2323. const char *cpu_list, unsigned long *cpu_bitmap)
  2324. {
  2325. int i, err = -1;
  2326. struct perf_cpu_map *map;
  2327. int nr_cpus = min(perf_session__env(session)->nr_cpus_avail, MAX_NR_CPUS);
  2328. struct perf_cpu cpu;
  2329. for (i = 0; i < PERF_TYPE_MAX; ++i) {
  2330. struct evsel *evsel;
  2331. evsel = perf_session__find_first_evtype(session, i);
  2332. if (!evsel)
  2333. continue;
  2334. if (!(evsel->core.attr.sample_type & PERF_SAMPLE_CPU)) {
  2335. pr_err("File does not contain CPU events. "
  2336. "Remove -C option to proceed.\n");
  2337. return -1;
  2338. }
  2339. }
  2340. map = perf_cpu_map__new(cpu_list);
  2341. if (map == NULL) {
  2342. pr_err("Invalid cpu_list\n");
  2343. return -1;
  2344. }
  2345. perf_cpu_map__for_each_cpu(cpu, i, map) {
  2346. if (cpu.cpu >= nr_cpus) {
  2347. pr_err("Requested CPU %d too large. "
  2348. "Consider raising MAX_NR_CPUS\n", cpu.cpu);
  2349. goto out_delete_map;
  2350. }
  2351. __set_bit(cpu.cpu, cpu_bitmap);
  2352. }
  2353. err = 0;
  2354. out_delete_map:
  2355. perf_cpu_map__put(map);
  2356. return err;
  2357. }
  2358. void perf_session__fprintf_info(struct perf_session *session, FILE *fp,
  2359. bool full)
  2360. {
  2361. if (session == NULL || fp == NULL)
  2362. return;
  2363. fprintf(fp, "# ========\n");
  2364. perf_header__fprintf_info(session, fp, full);
  2365. fprintf(fp, "# ========\n#\n");
  2366. }
  2367. static int perf_session__register_guest(struct perf_session *session, pid_t machine_pid)
  2368. {
  2369. struct machine *machine = machines__findnew(&session->machines, machine_pid);
  2370. struct thread *thread;
  2371. if (!machine)
  2372. return -ENOMEM;
  2373. machine->single_address_space = session->machines.host.single_address_space;
  2374. thread = machine__idle_thread(machine);
  2375. if (!thread)
  2376. return -ENOMEM;
  2377. thread__put(thread);
  2378. machine->kallsyms_filename = perf_data__guest_kallsyms_name(session->data, machine_pid);
  2379. return 0;
  2380. }
  2381. static int perf_session__set_guest_cpu(struct perf_session *session, pid_t pid,
  2382. pid_t tid, int guest_cpu)
  2383. {
  2384. struct machine *machine = &session->machines.host;
  2385. struct thread *thread = machine__findnew_thread(machine, pid, tid);
  2386. if (!thread)
  2387. return -ENOMEM;
  2388. thread__set_guest_cpu(thread, guest_cpu);
  2389. thread__put(thread);
  2390. return 0;
  2391. }
  2392. int perf_event__process_id_index(const struct perf_tool *tool __maybe_unused,
  2393. struct perf_session *session,
  2394. union perf_event *event)
  2395. {
  2396. struct evlist *evlist = session->evlist;
  2397. struct perf_record_id_index *ie = &event->id_index;
  2398. size_t sz = ie->header.size - sizeof(*ie);
  2399. size_t i, nr, max_nr;
  2400. size_t e1_sz = sizeof(struct id_index_entry);
  2401. size_t e2_sz = sizeof(struct id_index_entry_2);
  2402. size_t etot_sz = e1_sz + e2_sz;
  2403. struct id_index_entry_2 *e2;
  2404. pid_t last_pid = 0;
  2405. max_nr = sz / e1_sz;
  2406. nr = ie->nr;
  2407. if (nr > max_nr) {
  2408. printf("Too big: nr %zu max_nr %zu\n", nr, max_nr);
  2409. return -EINVAL;
  2410. }
  2411. if (sz >= nr * etot_sz) {
  2412. max_nr = sz / etot_sz;
  2413. if (nr > max_nr) {
  2414. printf("Too big2: nr %zu max_nr %zu\n", nr, max_nr);
  2415. return -EINVAL;
  2416. }
  2417. e2 = (void *)ie + sizeof(*ie) + nr * e1_sz;
  2418. } else {
  2419. e2 = NULL;
  2420. }
  2421. if (dump_trace)
  2422. fprintf(stdout, " nr: %zu\n", nr);
  2423. for (i = 0; i < nr; i++, (e2 ? e2++ : 0)) {
  2424. struct id_index_entry *e = &ie->entries[i];
  2425. struct perf_sample_id *sid;
  2426. int ret;
  2427. if (dump_trace) {
  2428. fprintf(stdout, " ... id: %"PRI_lu64, e->id);
  2429. fprintf(stdout, " idx: %"PRI_lu64, e->idx);
  2430. fprintf(stdout, " cpu: %"PRI_ld64, e->cpu);
  2431. fprintf(stdout, " tid: %"PRI_ld64, e->tid);
  2432. if (e2) {
  2433. fprintf(stdout, " machine_pid: %"PRI_ld64, e2->machine_pid);
  2434. fprintf(stdout, " vcpu: %"PRI_lu64"\n", e2->vcpu);
  2435. } else {
  2436. fprintf(stdout, "\n");
  2437. }
  2438. }
  2439. sid = evlist__id2sid(evlist, e->id);
  2440. if (!sid)
  2441. return -ENOENT;
  2442. sid->idx = e->idx;
  2443. sid->cpu.cpu = e->cpu;
  2444. sid->tid = e->tid;
  2445. if (!e2)
  2446. continue;
  2447. sid->machine_pid = e2->machine_pid;
  2448. sid->vcpu.cpu = e2->vcpu;
  2449. if (!sid->machine_pid)
  2450. continue;
  2451. if (sid->machine_pid != last_pid) {
  2452. ret = perf_session__register_guest(session, sid->machine_pid);
  2453. if (ret)
  2454. return ret;
  2455. last_pid = sid->machine_pid;
  2456. perf_guest = true;
  2457. }
  2458. ret = perf_session__set_guest_cpu(session, sid->machine_pid, e->tid, e2->vcpu);
  2459. if (ret)
  2460. return ret;
  2461. }
  2462. return 0;
  2463. }
  2464. int perf_session__dsos_hit_all(struct perf_session *session)
  2465. {
  2466. struct rb_node *nd;
  2467. int err;
  2468. err = machine__hit_all_dsos(&session->machines.host);
  2469. if (err)
  2470. return err;
  2471. for (nd = rb_first_cached(&session->machines.guests); nd;
  2472. nd = rb_next(nd)) {
  2473. struct machine *pos = rb_entry(nd, struct machine, rb_node);
  2474. err = machine__hit_all_dsos(pos);
  2475. if (err)
  2476. return err;
  2477. }
  2478. return 0;
  2479. }
  2480. struct perf_env *perf_session__env(struct perf_session *session)
  2481. {
  2482. return &session->header.env;
  2483. }
  2484. struct perf_session__e_machine_cb_args {
  2485. uint32_t e_flags;
  2486. uint16_t e_machine;
  2487. };
  2488. static int perf_session__e_machine_cb(struct thread *thread, void *_args)
  2489. {
  2490. struct perf_session__e_machine_cb_args *args = _args;
  2491. args->e_machine = thread__e_machine(thread, /*machine=*/NULL, &args->e_flags);
  2492. return args->e_machine != EM_NONE ? 1 : 0;
  2493. }
  2494. /*
  2495. * Note, a machine may have mixed 32-bit and 64-bit processes and so mixed
  2496. * e_machines. Use thread__e_machine when this matters.
  2497. */
  2498. uint16_t perf_session__e_machine(struct perf_session *session, uint32_t *e_flags)
  2499. {
  2500. struct perf_session__e_machine_cb_args args = {
  2501. .e_machine = EM_NONE,
  2502. };
  2503. struct perf_env *env;
  2504. if (!session) {
  2505. /* Default to assuming a host machine. */
  2506. if (e_flags)
  2507. *e_flags = EF_HOST;
  2508. return EM_HOST;
  2509. }
  2510. env = perf_session__env(session);
  2511. if (env && env->e_machine != EM_NONE) {
  2512. if (e_flags)
  2513. *e_flags = env->e_flags;
  2514. return env->e_machine;
  2515. }
  2516. machines__for_each_thread(&session->machines,
  2517. perf_session__e_machine_cb,
  2518. &args);
  2519. if (args.e_machine != EM_NONE) {
  2520. if (env) {
  2521. env->e_machine = args.e_machine;
  2522. env->e_flags = args.e_flags;
  2523. }
  2524. if (e_flags)
  2525. *e_flags = args.e_flags;
  2526. return args.e_machine;
  2527. }
  2528. /*
  2529. * Couldn't determine from the perf_env or current set of
  2530. * threads. Default to the host.
  2531. */
  2532. if (e_flags)
  2533. *e_flags = EF_HOST;
  2534. return EM_HOST;
  2535. }