ftrace 커널 디버깅 옵션이 활성화된 Debian 커널을 실행하는 2개 코어(1.2GHz)가 있는 Banana Pi Arm 장치가 있습니다. 커널 모듈 기능에 소요되는 시간을 확인하고 싶습니다. 이 함수의 형태는
static irq_handler_t vtgpio_irq_handler(unsigned int irq, void *dev_id, struct pt_regs *regs);
모듈을 로드한 후 디버그 파일 시스템에서 이름이 필터로 노출된 것을 볼 수 있습니다. 모든 기능을 추적하고 있습니다. 이 명령문을 활성화하려고 시도했지만 trace_printk
추적 파일에 인쇄된 내용이 표시되지 않습니다. 이 함수의 구현은 다음과 같습니다.
/** @brief handler for rising signal */
static irq_handler_t vtgpio_irq_handler(unsigned int irq, void *dev_id, struct pt_regs *regs) {
trace_printk(KERN_INFO "rise\n");
pause();
return (irq_handler_t) IRQ_HANDLED; // return that we all good
}
printk
나는 그 안에 있는 if I replacement with 문을 보았기 때문에 함수가 호출되고 있다는 것을 알고 있습니다 . 또한 sysfs 저장 기능에 쓰기와 같은 일부 모듈 기능을 추적할 수 있다는 것도 알고 있습니다. 예를 들어 볼 수 있어요dmesg | tail
trace_printk
printk
static struct kobj_attribute mode_attr = __ATTR(mode, 0660, mode_show, mode_store);
ftrace가 에 기록되었습니다 mode_store
.
1) | sys_write() {
1) 0.708 us | fget_light();
1) | vfs_write() {
1) 0.875 us | rw_verify_area();
1) | sysfs_write_file() {
1) 0.459 us | mutex_lock();
1) | get_zeroed_page() {
1) | __get_free_pages() {
1) | __alloc_pages_nodemask() {
1) 0.708 us | next_zones_zonelist();
1) | get_page_from_freelist() {
1) 0.458 us | next_zones_zonelist();
1) 1.000 us | __zone_watermark_ok();
1) | kmap_atomic() {
1) 0.625 us | add_preempt_count();
1) 0.625 us | page_address();
1) 9.250 us | }
1) | __kunmap_atomic() {
1) 0.750 us | sub_preempt_count();
1) 5.459 us | }
1) + 41.000 us | }
1) + 53.209 us | }
1) 0.542 us | page_address();
1) + 62.541 us | }
1) + 66.958 us | }
1) 0.917 us | sysfs_get_active();
1) | mode_store() {
1) | /* <6>VT-GPIO_TEST: resume */
1) | gpio_direction_output() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.834 us | add_preempt_count();
1) 5.375 us | }
1) 9.458 us | }
1) 0.834 us | gpio_ensure_requested();
1) | _raw_spin_unlock_irqrestore() {
1) 0.708 us | sub_preempt_count();
1) 5.125 us | }
1) | sunxi_gpio_direction_out() {
1) 1.125 us | gpio_set_one_pin_io_status();
1) 1.167 us | gpio_write_one_pin_value();
1) + 12.333 us | }
1) + 47.250 us | }
1) | gpio_direction_input() {
1) | _raw_spin_lock_irqsave() {
1) | __raw_spin_lock_irqsave() {
1) 0.625 us | add_preempt_count();
1) 5.167 us | }
1) 9.667 us | }
1) 0.583 us | gpio_ensure_requested();
1) | _raw_spin_unlock_irqrestore() {
1) 0.708 us | sub_preempt_count();
1) 5.166 us | }
1) | sunxi_gpio_direction_in() {
1) 0.667 us | gpio_set_one_pin_io_status();
1) 5.208 us | }
1) + 38.833 us | }
1) ! 105.833 us | }
1) 0.875 us | sysfs_put_active();
1) 0.875 us | mutex_unlock();
1) ! 204.500 us | }
1) 0.416 us | __fsnotify_parent();
1) | fsnotify() {
1) | __srcu_read_lock() {
1) 0.583 us | add_preempt_count();
1) 0.667 us | sub_preempt_count();
1) 9.542 us | }
1) | __srcu_read_unlock() {
1) 0.584 us | add_preempt_count();
1) 0.667 us | sub_preempt_count();
1) 9.041 us | }
1) + 30.125 us | }
1) ! 252.708 us | }
1) ! 262.292 us | }
이 추적 에서는 mode_store
실제로 IRQ 처리기에 의해 등록된 핀에 높음 또는 낮음이 기록됩니다. 어떤 팁이라도 매우 도움이 될 것입니다. IRQ 처리기의 오버헤드를 측정하려고 합니다.