function_trace 커널 모듈 인터럽트에 ftrace를 사용하는 방법은 무엇입니까?

function_trace 커널 모듈 인터럽트에 ftrace를 사용하는 방법은 무엇입니까?

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 | tailtrace_printkprintk

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 처리기의 오버헤드를 측정하려고 합니다.

관련 정보