~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/tests/sample-parsing.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /tools/perf/tests/sample-parsing.c (Version linux-6.12-rc7) and /tools/perf/tests/sample-parsing.c (Version ccs-tools-1.8.12)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 #include <stdbool.h>                              
  3 #include <inttypes.h>                             
  4 #include <stdlib.h>                               
  5 #include <string.h>                               
  6 #include <linux/bitops.h>                         
  7 #include <linux/kernel.h>                         
  8 #include <linux/types.h>                          
  9                                                   
 10 #include "map_symbol.h"                           
 11 #include "branch.h"                               
 12 #include "event.h"                                
 13 #include "evsel.h"                                
 14 #include "debug.h"                                
 15 #include "util/synthetic-events.h"                
 16 #include "util/util.h"                            
 17                                                   
 18 #include "tests.h"                                
 19                                                   
 20 #define COMP(m) do {                              
 21         if (s1->m != s2->m) {                     
 22                 pr_debug("Samples differ at '"    
 23                 return false;                     
 24         }                                         
 25 } while (0)                                       
 26                                                   
 27 #define MCOMP(m) do {                             
 28         if (memcmp(&s1->m, &s2->m, sizeof(s1->    
 29                 pr_debug("Samples differ at '"    
 30                 return false;                     
 31         }                                         
 32 } while (0)                                       
 33                                                   
 34 /*                                                
 35  * Hardcode the expected values for branch_ent    
 36  * These are based on the input value (213) sp    
 37  * in branch_stack variable.                      
 38  */                                               
 39 #define BS_EXPECTED_BE  0xa000d00000000000        
 40 #define BS_EXPECTED_LE  0x1aa00000000             
 41 #define FLAG(s) s->branch_stack->entries[i].fl    
 42                                                   
 43 static bool samples_same(const struct perf_sam    
 44                          const struct perf_sam    
 45                          u64 type, u64 read_fo    
 46 {                                                 
 47         size_t i;                                 
 48                                                   
 49         if (type & PERF_SAMPLE_IDENTIFIER)        
 50                 COMP(id);                         
 51                                                   
 52         if (type & PERF_SAMPLE_IP)                
 53                 COMP(ip);                         
 54                                                   
 55         if (type & PERF_SAMPLE_TID) {             
 56                 COMP(pid);                        
 57                 COMP(tid);                        
 58         }                                         
 59                                                   
 60         if (type & PERF_SAMPLE_TIME)              
 61                 COMP(time);                       
 62                                                   
 63         if (type & PERF_SAMPLE_ADDR)              
 64                 COMP(addr);                       
 65                                                   
 66         if (type & PERF_SAMPLE_ID)                
 67                 COMP(id);                         
 68                                                   
 69         if (type & PERF_SAMPLE_STREAM_ID)         
 70                 COMP(stream_id);                  
 71                                                   
 72         if (type & PERF_SAMPLE_CPU)               
 73                 COMP(cpu);                        
 74                                                   
 75         if (type & PERF_SAMPLE_PERIOD)            
 76                 COMP(period);                     
 77                                                   
 78         if (type & PERF_SAMPLE_READ) {            
 79                 if (read_format & PERF_FORMAT_    
 80                         COMP(read.group.nr);      
 81                 else                              
 82                         COMP(read.one.value);     
 83                 if (read_format & PERF_FORMAT_    
 84                         COMP(read.time_enabled    
 85                 if (read_format & PERF_FORMAT_    
 86                         COMP(read.time_running    
 87                 /* PERF_FORMAT_ID is forced fo    
 88                 if (read_format & PERF_FORMAT_    
 89                         for (i = 0; i < s1->re    
 90                                 /* FIXME: chec    
 91                                 if (read_forma    
 92                                         MCOMP(    
 93                         }                         
 94                 } else {                          
 95                         COMP(read.one.id);        
 96                         if (read_format & PERF    
 97                                 COMP(read.one.    
 98                 }                                 
 99         }                                         
100                                                   
101         if (type & PERF_SAMPLE_CALLCHAIN) {       
102                 COMP(callchain->nr);              
103                 for (i = 0; i < s1->callchain-    
104                         COMP(callchain->ips[i]    
105         }                                         
106                                                   
107         if (type & PERF_SAMPLE_RAW) {             
108                 COMP(raw_size);                   
109                 if (memcmp(s1->raw_data, s2->r    
110                         pr_debug("Samples diff    
111                         return false;             
112                 }                                 
113         }                                         
114                                                   
115         if (type & PERF_SAMPLE_BRANCH_STACK) {    
116                 COMP(branch_stack->nr);           
117                 COMP(branch_stack->hw_idx);       
118                 for (i = 0; i < s1->branch_sta    
119                         if (needs_swap)           
120                                 return ((host_    
121                                         (FLAG(    
122                                         (FLAG(    
123                         else                      
124                                 MCOMP(branch_s    
125                 }                                 
126         }                                         
127                                                   
128         if (type & PERF_SAMPLE_REGS_USER) {       
129                 size_t sz = hweight_long(s1->u    
130                                                   
131                 COMP(user_regs.mask);             
132                 COMP(user_regs.abi);              
133                 if (s1->user_regs.abi &&          
134                     (!s1->user_regs.regs || !s    
135                      memcmp(s1->user_regs.regs    
136                         pr_debug("Samples diff    
137                         return false;             
138                 }                                 
139         }                                         
140                                                   
141         if (type & PERF_SAMPLE_STACK_USER) {      
142                 COMP(user_stack.size);            
143                 if (memcmp(s1->user_stack.data    
144                            s1->user_stack.size    
145                         pr_debug("Samples diff    
146                         return false;             
147                 }                                 
148         }                                         
149                                                   
150         if (type & PERF_SAMPLE_WEIGHT)            
151                 COMP(weight);                     
152                                                   
153         if (type & PERF_SAMPLE_DATA_SRC)          
154                 COMP(data_src);                   
155                                                   
156         if (type & PERF_SAMPLE_TRANSACTION)       
157                 COMP(transaction);                
158                                                   
159         if (type & PERF_SAMPLE_REGS_INTR) {       
160                 size_t sz = hweight_long(s1->i    
161                                                   
162                 COMP(intr_regs.mask);             
163                 COMP(intr_regs.abi);              
164                 if (s1->intr_regs.abi &&          
165                     (!s1->intr_regs.regs || !s    
166                      memcmp(s1->intr_regs.regs    
167                         pr_debug("Samples diff    
168                         return false;             
169                 }                                 
170         }                                         
171                                                   
172         if (type & PERF_SAMPLE_PHYS_ADDR)         
173                 COMP(phys_addr);                  
174                                                   
175         if (type & PERF_SAMPLE_CGROUP)            
176                 COMP(cgroup);                     
177                                                   
178         if (type & PERF_SAMPLE_DATA_PAGE_SIZE)    
179                 COMP(data_page_size);             
180                                                   
181         if (type & PERF_SAMPLE_CODE_PAGE_SIZE)    
182                 COMP(code_page_size);             
183                                                   
184         if (type & PERF_SAMPLE_AUX) {             
185                 COMP(aux_sample.size);            
186                 if (memcmp(s1->aux_sample.data    
187                            s1->aux_sample.size    
188                         pr_debug("Samples diff    
189                         return false;             
190                 }                                 
191         }                                         
192                                                   
193         return true;                              
194 }                                                 
195                                                   
196 static int do_test(u64 sample_type, u64 sample    
197 {                                                 
198         struct evsel evsel = {                    
199                 .needs_swap = false,              
200                 .core = {                         
201                         . attr = {                
202                                 .sample_type =    
203                                 .read_format =    
204                         },                        
205                 },                                
206         };                                        
207         union perf_event *event;                  
208         union {                                   
209                 struct ip_callchain callchain;    
210                 u64 data[64];                     
211         } callchain = {                           
212                 /* 3 ips */                       
213                 .data = {3, 201, 202, 203},       
214         };                                        
215         union {                                   
216                 struct branch_stack branch_sta    
217                 u64 data[64];                     
218         } branch_stack = {                        
219                 /* 1 branch_entry */              
220                 .data = {1, -1ULL, 211, 212, 2    
221         };                                        
222         u64 regs[64];                             
223         const u32 raw_data[] = {0x12345678, 0x    
224         const u64 data[] = {0x2211443366558877    
225         const u64 aux_data[] = {0xa55a, 0, 0xe    
226         struct perf_sample sample = {             
227                 .ip             = 101,            
228                 .pid            = 102,            
229                 .tid            = 103,            
230                 .time           = 104,            
231                 .addr           = 105,            
232                 .id             = 106,            
233                 .stream_id      = 107,            
234                 .period         = 108,            
235                 .weight         = 109,            
236                 .cpu            = 110,            
237                 .raw_size       = sizeof(raw_d    
238                 .data_src       = 111,            
239                 .transaction    = 112,            
240                 .raw_data       = (void *)raw_    
241                 .callchain      = &callchain.c    
242                 .no_hw_idx      = false,          
243                 .branch_stack   = &branch_stac    
244                 .user_regs      = {               
245                         .abi    = PERF_SAMPLE_    
246                         .mask   = sample_regs,    
247                         .regs   = regs,           
248                 },                                
249                 .user_stack     = {               
250                         .size   = sizeof(data)    
251                         .data   = (void *)data    
252                 },                                
253                 .read           = {               
254                         .time_enabled = 0x030a    
255                         .time_running = 0x011b    
256                 },                                
257                 .intr_regs      = {               
258                         .abi    = PERF_SAMPLE_    
259                         .mask   = sample_regs,    
260                         .regs   = regs,           
261                 },                                
262                 .phys_addr      = 113,            
263                 .cgroup         = 114,            
264                 .data_page_size = 115,            
265                 .code_page_size = 116,            
266                 .aux_sample     = {               
267                         .size   = sizeof(aux_d    
268                         .data   = (void *)aux_    
269                 },                                
270         };                                        
271         struct sample_read_value values[] = {{    
272         struct perf_sample sample_out, sample_    
273         size_t i, sz, bufsz;                      
274         int err, ret = -1;                        
275                                                   
276         if (sample_type & PERF_SAMPLE_REGS_USE    
277                 evsel.core.attr.sample_regs_us    
278                                                   
279         if (sample_type & PERF_SAMPLE_REGS_INT    
280                 evsel.core.attr.sample_regs_in    
281                                                   
282         if (sample_type & PERF_SAMPLE_BRANCH_S    
283                 evsel.core.attr.branch_sample_    
284                                                   
285         for (i = 0; i < sizeof(regs); i++)        
286                 *(i + (u8 *)regs) = i & 0xfe;     
287                                                   
288         if (read_format & PERF_FORMAT_GROUP) {    
289                 sample.read.group.nr     = 4;     
290                 sample.read.group.values = val    
291         } else {                                  
292                 sample.read.one.value = 0x0878    
293                 sample.read.one.id    = 99;       
294                 sample.read.one.lost  = 1;        
295         }                                         
296                                                   
297         sz = perf_event__sample_event_size(&sa    
298         bufsz = sz + 4096; /* Add a bit for ov    
299         event = malloc(bufsz);                    
300         if (!event) {                             
301                 pr_debug("malloc failed\n");      
302                 return -1;                        
303         }                                         
304                                                   
305         memset(event, 0xff, bufsz);               
306         event->header.type = PERF_RECORD_SAMPL    
307         event->header.misc = 0;                   
308         event->header.size = sz;                  
309                                                   
310         err = perf_event__synthesize_sample(ev    
311                                             &s    
312         if (err) {                                
313                 pr_debug("%s failed for sample    
314                          "perf_event__synthesi    
315                 goto out_free;                    
316         }                                         
317                                                   
318         /* The data does not contain 0xff so w    
319         for (i = bufsz; i > 0; i--) {             
320                 if (*(i - 1 + (u8 *)event) !=     
321                         break;                    
322         }                                         
323         if (i != sz) {                            
324                 pr_debug("Event size mismatch:    
325                          i, sz);                  
326                 goto out_free;                    
327         }                                         
328                                                   
329         evsel.sample_size = __evsel__sample_si    
330                                                   
331         err = evsel__parse_sample(&evsel, even    
332         if (err) {                                
333                 pr_debug("%s failed for sample    
334                          "evsel__parse_sample"    
335                 goto out_free;                    
336         }                                         
337                                                   
338         if (!samples_same(&sample, &sample_out    
339                 pr_debug("parsing failed for s    
340                          sample_type);            
341                 goto out_free;                    
342         }                                         
343                                                   
344         if (sample_type == PERF_SAMPLE_BRANCH_    
345                 evsel.needs_swap = true;          
346                 evsel.sample_size = __evsel__s    
347                 err = evsel__parse_sample(&evs    
348                 if (err) {                        
349                         pr_debug("%s failed fo    
350                                  "evsel__parse    
351                         goto out_free;            
352                 }                                 
353                                                   
354                 if (!samples_same(&sample, &sa    
355                         pr_debug("parsing fail    
356                                  sample_type);    
357                         goto out_free;            
358                 }                                 
359         }                                         
360                                                   
361         ret = 0;                                  
362 out_free:                                         
363         free(event);                              
364         if (ret && read_format)                   
365                 pr_debug("read_format %#"PRIx6    
366         return ret;                               
367 }                                                 
368                                                   
369 /**                                               
370  * test__sample_parsing - test sample parsing.    
371  *                                                
372  * This function implements a test that synthe    
373  * and then checks that the parsed sample matc    
374  * checks sample format bits separately and to    
375  * returned, otherwise %-1 is returned.           
376  */                                               
377 static int test__sample_parsing(struct test_su    
378 {                                                 
379         const u64 rf[] = {4, 5, 6, 7, 12, 13,     
380         u64 sample_type;                          
381         u64 sample_regs;                          
382         size_t i;                                 
383         int err;                                  
384                                                   
385         /*                                        
386          * Fail the test if it has not been up    
387          * were added.  Please actually update    
388          * the condition below.                   
389          */                                       
390         if (PERF_SAMPLE_MAX > PERF_SAMPLE_WEIG    
391                 pr_debug("sample format has ch    
392                 return -1;                        
393         }                                         
394                                                   
395         /* Test each sample format bit separat    
396         for (sample_type = 1; sample_type != P    
397              sample_type <<= 1) {                 
398                 /* Test read_format variations    
399                 if (sample_type == PERF_SAMPLE    
400                         for (i = 0; i < ARRAY_    
401                                 err = do_test(    
402                                 if (err)          
403                                         return    
404                         }                         
405                         continue;                 
406                 }                                 
407                 sample_regs = 0;                  
408                                                   
409                 if (sample_type == PERF_SAMPLE    
410                         sample_regs = 0x3fff;     
411                                                   
412                 if (sample_type == PERF_SAMPLE    
413                         sample_regs = 0xff0fff    
414                                                   
415                 err = do_test(sample_type, sam    
416                 if (err)                          
417                         return err;               
418         }                                         
419                                                   
420         /*                                        
421          * Test all sample format bits togethe    
422          * Note: PERF_SAMPLE_WEIGHT and PERF_S    
423          *       be set simultaneously.           
424          */                                       
425         sample_type = (PERF_SAMPLE_MAX - 1) &     
426         sample_regs = 0x3fff; /* shared yb int    
427         for (i = 0; i < ARRAY_SIZE(rf); i++) {    
428                 err = do_test(sample_type, sam    
429                 if (err)                          
430                         return err;               
431         }                                         
432                                                   
433         return 0;                                 
434 }                                                 
435                                                   
436 DEFINE_SUITE("Sample parsing", sample_parsing)    
437                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php