更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
Perf
Perf 的协作图:

结构体

struct  PerfEventConfig
 
struct  PerfConfigAttr
 

类型定义

typedef VOID(* PERF_BUF_NOTIFY_HOOK) (VOID)
 
typedef VOID(* PERF_BUF_FLUSH_HOOK) (VOID *addr, UINT32 size)
 

枚举

enum  PerfStatus { PERF_UNINIT , PERF_STARTED , PERF_STOPPED }
 
enum  PerfEventType {
  PERF_EVENT_TYPE_HW , PERF_EVENT_TYPE_TIMED , PERF_EVENT_TYPE_SW , PERF_EVENT_TYPE_RAW ,
  PERF_EVENT_TYPE_MAX , PERF_EVENT_TYPE_HW , PERF_EVENT_TYPE_TIMED , PERF_EVENT_TYPE_SW ,
  PERF_EVENT_TYPE_RAW , PERF_EVENT_TYPE_MAX
}
 
enum  PmuHwId {
  PERF_COUNT_HW_CPU_CYCLES = 0 , PERF_COUNT_HW_INSTRUCTIONS , PERF_COUNT_HW_DCACHE_REFERENCES , PERF_COUNT_HW_DCACHE_MISSES ,
  PERF_COUNT_HW_ICACHE_REFERENCES , PERF_COUNT_HW_ICACHE_MISSES , PERF_COUNT_HW_BRANCH_INSTRUCTIONS , PERF_COUNT_HW_BRANCH_MISSES ,
  PERF_COUNT_HW_MAX , PERF_COUNT_HW_CPU_CYCLES = 0 , PERF_COUNT_HW_INSTRUCTIONS , PERF_COUNT_HW_DCACHE_REFERENCES ,
  PERF_COUNT_HW_DCACHE_MISSES , PERF_COUNT_HW_ICACHE_REFERENCES , PERF_COUNT_HW_ICACHE_MISSES , PERF_COUNT_HW_BRANCH_INSTRUCTIONS ,
  PERF_COUNT_HW_BRANCH_MISSES , PERF_COUNT_HW_MAX
}
 
enum  PmuTimedId { PERF_COUNT_CPU_CLOCK = 0 , PERF_COUNT_CPU_CLOCK = 0 }
 
enum  PmuSwId {
  PERF_COUNT_SW_TASK_SWITCH = 1 , PERF_COUNT_SW_IRQ_RESPONSE , PERF_COUNT_SW_MEM_ALLOC , PERF_COUNT_SW_MUX_PEND ,
  PERF_COUNT_SW_MAX , PERF_COUNT_SW_TASK_SWITCH = 1 , PERF_COUNT_SW_IRQ_RESPONSE , PERF_COUNT_SW_MEM_ALLOC ,
  PERF_COUNT_SW_MUX_PEND , PERF_COUNT_SW_MAX
}
 
enum  PerfSampleType {
  PERF_RECORD_CPU = 1U << 0 , PERF_RECORD_TID = 1U << 1 , PERF_RECORD_TYPE = 1U << 2 , PERF_RECORD_PERIOD = 1U << 3 ,
  PERF_RECORD_TIMESTAMP = 1U << 4 , PERF_RECORD_IP = 1U << 5 , PERF_RECORD_CALLCHAIN = 1U << 6 , PERF_RECORD_PID = 1U << 7 ,
  PERF_RECORD_CPU = 1U << 0 , PERF_RECORD_TID = 1U << 1 , PERF_RECORD_TYPE = 1U << 2 , PERF_RECORD_PERIOD = 1U << 3 ,
  PERF_RECORD_TIMESTAMP = 1U << 4 , PERF_RECORD_IP = 1U << 5 , PERF_RECORD_CALLCHAIN = 1U << 6 , PERF_RECORD_PID = 1U << 7
}
 

函数

UINT32 LOS_PerfInit (VOID *buf, UINT32 size)
 Init perf. 更多...
 
VOID LOS_PerfStart (UINT32 sectionId)
 Start perf sampling. 更多...
 
VOID LOS_PerfStop (VOID)
 Stop perf sampling. 更多...
 
UINT32 LOS_PerfConfig (PerfConfigAttr *attr)
 Config perf parameters. 更多...
 
UINT32 LOS_PerfDataRead (CHAR *dest, UINT32 size)
 Read data from perf sample data buffer. 更多...
 
VOID LOS_PerfNotifyHookReg (const PERF_BUF_NOTIFY_HOOK func)
 Register perf sample data buffer water mark hook function. 更多...
 
VOID LOS_PerfFlushHookReg (const PERF_BUF_FLUSH_HOOK func)
 Register perf sample data buffer flush hook function. 更多...
 

详细描述

类型定义说明

◆ PERF_BUF_FLUSH_HOOK

typedef VOID(* PERF_BUF_FLUSH_HOOK) (VOID *addr, UINT32 size)

Define the type of the perf sample data buffer flush hook function.

在文件 los_perf.h94 行定义.

◆ PERF_BUF_NOTIFY_HOOK

typedef VOID(* PERF_BUF_NOTIFY_HOOK) (VOID)

Define the type of the perf sample data buffer water mark hook function.

在文件 los_perf.h87 行定义.

枚举类型说明

◆ PerfEventType

Perf types

枚举值
PERF_EVENT_TYPE_HW 
PERF_EVENT_TYPE_TIMED 
PERF_EVENT_TYPE_SW 
PERF_EVENT_TYPE_RAW 
PERF_EVENT_TYPE_MAX 
PERF_EVENT_TYPE_HW 
PERF_EVENT_TYPE_TIMED 
PERF_EVENT_TYPE_SW 
PERF_EVENT_TYPE_RAW 
PERF_EVENT_TYPE_MAX 

在文件 los_perf.h180 行定义.

180 {
181 PERF_EVENT_TYPE_HW, /* boards common hw events */
182 PERF_EVENT_TYPE_TIMED, /* hrtimer timed events */
183 PERF_EVENT_TYPE_SW, /* software trace events */
184 PERF_EVENT_TYPE_RAW, /* boards special hw events, see enum PmuEventType in corresponding arch headfile */
185
187};
@ PERF_EVENT_TYPE_SW
Definition: los_perf.h:183
@ PERF_EVENT_TYPE_HW
Definition: los_perf.h:181
@ PERF_EVENT_TYPE_MAX
Definition: los_perf.h:186
@ PERF_EVENT_TYPE_TIMED
Definition: los_perf.h:182
@ PERF_EVENT_TYPE_RAW
Definition: los_perf.h:184

◆ PerfSampleType

perf sample data types Config it through PerfConfigAttr->sampleType.

枚举值
PERF_RECORD_CPU 
PERF_RECORD_TID 
PERF_RECORD_TYPE 
PERF_RECORD_PERIOD 
PERF_RECORD_TIMESTAMP 
PERF_RECORD_IP 
PERF_RECORD_CALLCHAIN 
PERF_RECORD_PID 
PERF_RECORD_CPU 
PERF_RECORD_TID 
PERF_RECORD_TYPE 
PERF_RECORD_PERIOD 
PERF_RECORD_TIMESTAMP 
PERF_RECORD_IP 
PERF_RECORD_CALLCHAIN 
PERF_RECORD_PID 

在文件 los_perf.h232 行定义.

232 {
233 PERF_RECORD_CPU = 1U << 0, /* record current cpuid */
234 PERF_RECORD_TID = 1U << 1, /* record current task id */
235 PERF_RECORD_TYPE = 1U << 2, /* record event type */
236 PERF_RECORD_PERIOD = 1U << 3, /* record event period */
237 PERF_RECORD_TIMESTAMP = 1U << 4, /* record timestamp */
238 PERF_RECORD_IP = 1U << 5, /* record instruction pointer */
239 PERF_RECORD_CALLCHAIN = 1U << 6, /* record backtrace */
240 PERF_RECORD_PID = 1U << 7, /* record current process id */
241};
@ PERF_RECORD_CALLCHAIN
Definition: los_perf.h:239
@ PERF_RECORD_TIMESTAMP
Definition: los_perf.h:237
@ PERF_RECORD_TYPE
Definition: los_perf.h:235
@ PERF_RECORD_TID
Definition: los_perf.h:234
@ PERF_RECORD_PID
Definition: los_perf.h:240
@ PERF_RECORD_CPU
Definition: los_perf.h:233
@ PERF_RECORD_IP
Definition: los_perf.h:238
@ PERF_RECORD_PERIOD
Definition: los_perf.h:236

◆ PerfStatus

enum PerfStatus

Perf status.

枚举值
PERF_UNINIT 
PERF_STARTED 
PERF_STOPPED 

在文件 los_perf.h76 行定义.

76 {
77 PERF_UNINIT, /* perf isn't inited */
78 PERF_STARTED, /* perf is started */
79 PERF_STOPPED, /* perf is stopped */
80};
@ PERF_UNINIT
Definition: los_perf.h:77
@ PERF_STOPPED
Definition: los_perf.h:79
@ PERF_STARTED
Definition: los_perf.h:78

◆ PmuHwId

enum PmuHwId

Common hardware pmu events

枚举值
PERF_COUNT_HW_CPU_CYCLES 
PERF_COUNT_HW_INSTRUCTIONS 
PERF_COUNT_HW_DCACHE_REFERENCES 
PERF_COUNT_HW_DCACHE_MISSES 
PERF_COUNT_HW_ICACHE_REFERENCES 
PERF_COUNT_HW_ICACHE_MISSES 
PERF_COUNT_HW_BRANCH_INSTRUCTIONS 
PERF_COUNT_HW_BRANCH_MISSES 
PERF_COUNT_HW_MAX 
PERF_COUNT_HW_CPU_CYCLES 
PERF_COUNT_HW_INSTRUCTIONS 
PERF_COUNT_HW_DCACHE_REFERENCES 
PERF_COUNT_HW_DCACHE_MISSES 
PERF_COUNT_HW_ICACHE_REFERENCES 
PERF_COUNT_HW_ICACHE_MISSES 
PERF_COUNT_HW_BRANCH_INSTRUCTIONS 
PERF_COUNT_HW_BRANCH_MISSES 
PERF_COUNT_HW_MAX 

在文件 los_perf.h193 行定义.

193 {
194 PERF_COUNT_HW_CPU_CYCLES = 0, /* cpu cycle event */
195 PERF_COUNT_HW_INSTRUCTIONS, /* instruction event */
196 PERF_COUNT_HW_DCACHE_REFERENCES, /* dcache access event */
197 PERF_COUNT_HW_DCACHE_MISSES, /* dcache miss event */
198 PERF_COUNT_HW_ICACHE_REFERENCES, /* icache access event */
199 PERF_COUNT_HW_ICACHE_MISSES, /* icache miss event */
200 PERF_COUNT_HW_BRANCH_INSTRUCTIONS, /* software change of pc event */
201 PERF_COUNT_HW_BRANCH_MISSES, /* branch miss event */
202
204};
@ PERF_COUNT_HW_BRANCH_INSTRUCTIONS
Definition: los_perf.h:200
@ PERF_COUNT_HW_DCACHE_MISSES
Definition: los_perf.h:197
@ PERF_COUNT_HW_DCACHE_REFERENCES
Definition: los_perf.h:196
@ PERF_COUNT_HW_MAX
Definition: los_perf.h:203
@ PERF_COUNT_HW_BRANCH_MISSES
Definition: los_perf.h:201
@ PERF_COUNT_HW_ICACHE_MISSES
Definition: los_perf.h:199
@ PERF_COUNT_HW_ICACHE_REFERENCES
Definition: los_perf.h:198
@ PERF_COUNT_HW_CPU_CYCLES
Definition: los_perf.h:194
@ PERF_COUNT_HW_INSTRUCTIONS
Definition: los_perf.h:195

◆ PmuSwId

enum PmuSwId

Common software pmu events

枚举值
PERF_COUNT_SW_TASK_SWITCH 
PERF_COUNT_SW_IRQ_RESPONSE 
PERF_COUNT_SW_MEM_ALLOC 
PERF_COUNT_SW_MUX_PEND 
PERF_COUNT_SW_MAX 
PERF_COUNT_SW_TASK_SWITCH 
PERF_COUNT_SW_IRQ_RESPONSE 
PERF_COUNT_SW_MEM_ALLOC 
PERF_COUNT_SW_MUX_PEND 
PERF_COUNT_SW_MAX 

在文件 los_perf.h218 行定义.

218 {
219 PERF_COUNT_SW_TASK_SWITCH = 1, /* task switch event */
220 PERF_COUNT_SW_IRQ_RESPONSE, /* irq response event */
221 PERF_COUNT_SW_MEM_ALLOC, /* memory alloc event */
222 PERF_COUNT_SW_MUX_PEND, /* mutex pend event */
223
225};
@ PERF_COUNT_SW_IRQ_RESPONSE
Definition: los_perf.h:220
@ PERF_COUNT_SW_MAX
Definition: los_perf.h:224
@ PERF_COUNT_SW_MUX_PEND
Definition: los_perf.h:222
@ PERF_COUNT_SW_TASK_SWITCH
Definition: los_perf.h:219
@ PERF_COUNT_SW_MEM_ALLOC
Definition: los_perf.h:221

◆ PmuTimedId

enum PmuTimedId

Common hrtimer timed events

枚举值
PERF_COUNT_CPU_CLOCK 
PERF_COUNT_CPU_CLOCK 

在文件 los_perf.h210 行定义.

210 {
211 PERF_COUNT_CPU_CLOCK = 0, /* hrtimer timed event */
212};
@ PERF_COUNT_CPU_CLOCK
Definition: los_perf.h:211

函数说明

◆ LOS_PerfConfig()

UINT32 LOS_PerfConfig ( PerfConfigAttr attr)

Config perf parameters.

Description
Config perf parameters before sample, for example, sample event, sample task, etc. This interface need to be called before LOS_PerfStart.
注意
None.
参数
attr[IN] Address of a perf event attr struct.
返回值
#LOS_ERRNO_PERF_STATUS_INVALIDPerf in a wrong status.
#LOS_ERRNO_PERF_CONFIG_NULLAttr is NULL.
#LOS_ERRNO_PERF_INVALID_PMUConfig perf pmu with error type.
#LOS_ERRNO_PERF_PMU_CONFIG_ERRORConfig perf events fail with invalid event id or event period.
#LOS_OKConfig success.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

在文件 los_perf.c424 行定义.

425{
426 UINT32 ret;
427 UINT32 intSave;
428
429 if (attr == NULL) {
430 return LOS_ERRNO_PERF_CONFIG_NULL;
431 }
432
433 PERF_LOCK(intSave);
435 ret = LOS_ERRNO_PERF_STATUS_INVALID;
436 PRINT_ERR("perf config status error : 0x%x\n", g_perfCb.status);
437 goto PERF_CONFIG_ERROR;
438 }
439
440 g_pmu = NULL;
441
444
447
448 ret = OsPerfConfig(&attr->eventsCfg);
449 PerfInfoDump();
450PERF_CONFIG_ERROR:
451 PERF_UNLOCK(intSave);
452 return ret;
453}
STATIC VOID PerfInfoDump(VOID)
Definition: los_perf.c:385
STATIC Pmu * g_pmu
Definition: los_perf.c:41
STATIC UINT32 OsPerfConfig(PerfEventConfig *eventsCfg)
Definition: los_perf.c:81
STATIC PerfCB g_perfCb
Definition: los_perf.c:42
STATIC INLINE VOID OsPerfSetFilterIds(UINT32 *dstIds, UINT8 *dstIdsNr, UINT32 *ids, UINT32 idsNr)
Definition: los_perf.c:408
unsigned int UINT32
Definition: los_typedef.h:57
UINT8 taskIdsNr
Definition: los_perf_pri.h:121
enum PerfStatus status
Definition: los_perf_pri.h:115
UINT32 taskIds[PERF_MAX_FILTER_TSKS]
Definition: los_perf_pri.h:120
UINT8 processIdsNr
Definition: los_perf_pri.h:123
UINT32 sampleType
Definition: los_perf_pri.h:119
UINT8 needSample
Definition: los_perf_pri.h:124
UINT32 processIds[PERF_MAX_FILTER_TSKS]
Definition: los_perf_pri.h:122
unsigned int processIdsNr
Definition: perf.h:143
PerfEventConfig eventsCfg
Definition: perf.h:138
unsigned int processIds[PERF_MAX_FILTER_TSKS]
Definition: perf.h:142
size_t needSample
Definition: perf.h:146
unsigned int taskIds[PERF_MAX_FILTER_TSKS]
Definition: perf.h:139
unsigned int taskIdsNr
Definition: perf.h:140
unsigned int sampleType
Definition: perf.h:145
函数调用图:
这是这个函数的调用关系图:

◆ LOS_PerfDataRead()

UINT32 LOS_PerfDataRead ( CHAR dest,
UINT32  size 
)

Read data from perf sample data buffer.

Description
Because perf sample data buffer is a ringbuffer, the data may be covered after user read ringbuffer.
注意
None.
参数
dest[IN] The destination address.
size[IN] Read size.
返回值
UINT32The really read bytes.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

在文件 los_perf.c514 行定义.

515{
516 return OsPerfOutputRead(dest, size);
517}
UINT32 OsPerfOutputRead(CHAR *dest, UINT32 size)
Definition: perf_output.c:76
函数调用图:
这是这个函数的调用关系图:

◆ LOS_PerfFlushHookReg()

VOID LOS_PerfFlushHookReg ( const PERF_BUF_FLUSH_HOOK  func)

Register perf sample data buffer flush hook function.

Description
  • Register perf sample data buffer flush hook function.
  • The flush hook will be called when the buffer be read or written.
注意
None.
参数
func[IN] Buffer flush hook function.
返回值
None.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

在文件 los_perf.c528 行定义.

529{
530 UINT32 intSave;
531
532 PERF_LOCK(intSave);
533 OsPerfFlushHookReg(func);
534 PERF_UNLOCK(intSave);
535}
VOID OsPerfFlushHookReg(const PERF_BUF_FLUSH_HOOK func)
Definition: perf_output.c:123
函数调用图:

◆ LOS_PerfInit()

UINT32 LOS_PerfInit ( VOID *  buf,
UINT32  size 
)

Init perf.

Description:
  • Used to initialize the perf module, including initializing the PMU, allocating memory, etc.,which is called during the phase of system initialization.
注意
  • If buf is not NULL, user must ensure size is not bigger than buf's length.
参数
buf[IN] Pointer of sample data buffer;Use the dynamically allocated memory if the pointer is NULL.
size[IN] Length of sample data buffer.
返回值
#LOS_ERRNO_PERF_STATUS_INVALIDPerf in a wrong status.
#LOS_ERRNO_PERF_HW_INIT_ERRORPerf hardware pmu init fail.
#LOS_ERRNO_PERF_TIMED_INIT_ERRORPerf timed pmu init fail.
#LOS_ERRNO_PERF_SW_INIT_ERRORPerf software pmu init fail.
#LOS_ERRNO_PERF_BUF_ERRORPerf buffer init fail.
#LOS_OKPerf init success.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

◆ LOS_PerfNotifyHookReg()

VOID LOS_PerfNotifyHookReg ( const PERF_BUF_NOTIFY_HOOK  func)

Register perf sample data buffer water mark hook function.

Description
  • Register perf sample data buffer water mark hook function.
  • The registered hook will be called when buffer reaches the water mark./li>
注意
None.
参数
func[IN] Buffer water mark hook function.
返回值
None.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

在文件 los_perf.c519 行定义.

520{
521 UINT32 intSave;
522
523 PERF_LOCK(intSave);
525 PERF_UNLOCK(intSave);
526}
VOID OsPerfNotifyHookReg(const PERF_BUF_NOTIFY_HOOK func)
Definition: perf_output.c:118
函数调用图:

◆ LOS_PerfStart()

VOID LOS_PerfStart ( UINT32  sectionId)

Start perf sampling.

Description
Start perf sampling.
注意
None.
参数
sectionId[IN] Set the section id for marking this piece of data in the perf sample data buffer.
返回值
None.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

在文件 los_perf.c455 行定义.

456{
457 UINT32 intSave;
458 UINT32 ret;
459
460 PERF_LOCK(intSave);
462 PRINT_ERR("perf start status error : 0x%x\n", g_perfCb.status);
463 goto PERF_START_ERROR;
464 }
465
466 if (!OsPerfParamValid()) {
467 PRINT_ERR("forgot call `LOS_PerfConfig(...)` before perf start?\n");
468 goto PERF_START_ERROR;
469 }
470
471 if (g_perfCb.needSample) {
472 ret = OsPerfHdrInit(sectionId); /* section header init */
473 if (ret != LOS_OK) {
474 PRINT_ERR("perf hdr init error 0x%x\n", ret);
475 goto PERF_START_ERROR;
476 }
477 }
478
479 SMP_CALL_PERF_FUNC(OsPerfStart); /* send to all cpu to start pmu */
482PERF_START_ERROR:
483 PERF_UNLOCK(intSave);
484 return;
485}
STATIC INLINE UINT32 OsPerfParamValid(VOID)
Definition: los_perf.c:313
STATIC VOID OsPerfStart(VOID)
Definition: los_perf.c:146
STATIC INLINE UINT64 OsPerfGetCurrTime(VOID)
Definition: los_perf.c:50
STATIC UINT32 OsPerfHdrInit(UINT32 id)
Definition: los_perf.c:330
UINT64 startTime
Definition: los_perf_pri.h:111
函数调用图:
这是这个函数的调用关系图:

◆ LOS_PerfStop()

VOID LOS_PerfStop ( VOID  )

Stop perf sampling.

Description
Stop perf sampling.
注意
None.
参数
None.
返回值
None.
Dependency:
  • los_perf.h: the header file that contains the API declaration.

在文件 los_perf.c487 行定义.

488{
489 UINT32 intSave;
490
491 PERF_LOCK(intSave);
493 PRINT_ERR("perf stop status error : 0x%x\n", g_perfCb.status);
494 goto PERF_STOP_ERROR;
495 }
496
497 SMP_CALL_PERF_FUNC(OsPerfStop); /* send to all cpu to stop pmu */
498
500
501 if (g_perfCb.needSample) {
503 }
504
507
509PERF_STOP_ERROR:
510 PERF_UNLOCK(intSave);
511 return;
512}
STATIC VOID OsPerfStop(VOID)
Definition: los_perf.c:168
STATIC INLINE VOID OsPerfPrintTs(VOID)
Definition: los_perf.c:136
VOID OsPerfOutputInfo(VOID)
Definition: perf_output.c:113
VOID OsPerfOutputFlush(VOID)
Definition: perf_output.c:69
UINT64 endTime
Definition: los_perf_pri.h:112
函数调用图:
这是这个函数的调用关系图: