@@ -152,10 +152,10 @@ static void pai_event_destroy(struct perf_event *event)
152152 }
153153}
154154
155- static u64 paicrypt_getctr (unsigned long * page , int nr , bool kernel )
155+ static u64 pai_getctr (unsigned long * page , int nr , unsigned long offset )
156156{
157- if (kernel )
158- nr += PAI_CRYPTO_MAXCTR ;
157+ if (offset )
158+ nr += offset / sizeof ( * page ) ;
159159 return page [nr ];
160160}
161161
@@ -172,13 +172,14 @@ static u64 pai_getdata(struct perf_event *event, bool kernel)
172172 u64 sum = 0 ;
173173
174174 if (event -> attr .config != pp -> base ) {
175- return paicrypt_getctr (cpump -> area ,
175+ return pai_getctr (cpump -> area ,
176176 event -> attr .config - pp -> base ,
177- kernel );
177+ kernel ? pp -> kernel_offset : 0 );
178178 }
179179
180180 for (i = 1 ; i <= pp -> num_avail ; i ++ ) {
181- u64 val = paicrypt_getctr (cpump -> area , i , kernel );
181+ u64 val = pai_getctr (cpump -> area , i ,
182+ kernel ? pp -> kernel_offset : 0 );
182183
183184 if (!val )
184185 continue ;
@@ -416,7 +417,7 @@ static int paicrypt_add(struct perf_event *event, int flags)
416417 return 0 ;
417418}
418419
419- static void paicrypt_have_sample (struct perf_event * , struct pai_map * );
420+ static void pai_have_sample (struct perf_event * , struct pai_map * );
420421static void paicrypt_stop (struct perf_event * event , int flags )
421422{
422423 struct pai_mapptr * mp = this_cpu_ptr (pai_root .mapptr );
@@ -429,7 +430,7 @@ static void paicrypt_stop(struct perf_event *event, int flags)
429430 perf_sched_cb_dec (event -> pmu );
430431 list_del (PAI_SWLIST (event ));
431432 } else {
432- paicrypt_have_sample (event , cpump );
433+ pai_have_sample (event , cpump );
433434 cpump -> event = NULL ;
434435 }
435436 }
@@ -456,21 +457,21 @@ static void paicrypt_del(struct perf_event *event, int flags)
456457 * 8 bytes: Value of counter
457458 */
458459static size_t paicrypt_copy (struct pai_userdata * userdata , unsigned long * page ,
459- unsigned long * page_old , bool exclude_user ,
460- bool exclude_kernel )
460+ struct pai_pmu * pp , unsigned long * page_old ,
461+ bool exclude_user , bool exclude_kernel )
461462{
462463 int i , outidx = 0 ;
463464
464- for (i = 1 ; i <= paicrypt_cnt ; i ++ ) {
465+ for (i = 1 ; i <= pp -> num_avail ; i ++ ) {
465466 u64 val = 0 , val_old = 0 ;
466467
467468 if (!exclude_kernel ) {
468- val += paicrypt_getctr (page , i , true );
469- val_old += paicrypt_getctr (page_old , i , true );
469+ val += pai_getctr (page , i , pp -> kernel_offset );
470+ val_old += pai_getctr (page_old , i , pp -> kernel_offset );
470471 }
471472 if (!exclude_user ) {
472- val += paicrypt_getctr (page , i , false );
473- val_old += paicrypt_getctr (page_old , i , false );
473+ val += pai_getctr (page , i , 0 );
474+ val_old += pai_getctr (page_old , i , 0 );
474475 }
475476 if (val >= val_old )
476477 val -= val_old ;
@@ -524,14 +525,15 @@ static int paicrypt_push_sample(size_t rawsize, struct pai_map *cpump,
524525}
525526
526527/* Check if there is data to be saved on schedule out of a task. */
527- static void paicrypt_have_sample (struct perf_event * event ,
528- struct pai_map * cpump )
528+ static void pai_have_sample (struct perf_event * event , struct pai_map * cpump )
529529{
530+ struct pai_pmu * pp ;
530531 size_t rawsize ;
531532
532533 if (!event ) /* No event active */
533534 return ;
534- rawsize = paicrypt_copy (cpump -> save , cpump -> area ,
535+ pp = & pai_pmu [PAI_PMU_IDX (event )];
536+ rawsize = paicrypt_copy (cpump -> save , cpump -> area , pp ,
535537 (unsigned long * )PAI_SAVE_AREA (event ),
536538 event -> attr .exclude_user ,
537539 event -> attr .exclude_kernel );
@@ -547,7 +549,7 @@ static void paicrypt_have_samples(void)
547549 struct perf_event * event ;
548550
549551 list_for_each_entry (event , & cpump -> syswide_list , hw .tp_list )
550- paicrypt_have_sample (event , cpump );
552+ pai_have_sample (event , cpump );
551553}
552554
553555/* Called on schedule-in and schedule-out. No access to event structure,
0 commit comments