如何在内核模块中使用跟踪点

时间:2018-05-01 23:09:17

标签: linux-kernel kernel-module bpf tracepoint

我最近开始学习这些东西。关于这个问题,我遇到了大量关于kprobes,BPF,eBPF,tracepoints和perf的资源。

我想在内核中测试一些irq事件(在它到达设备驱动程序之前)。因此,我在do_IRQ()函数中在内核中创建了一个跟踪事件。

我已将内核中的tracepoint声明为:

TRACE_EVENT(vector_irq_rcv,

        TP_PROTO(unsigned int vector, unsigned int irq),

        TP_ARGS(vector, irq),

        TP_STRUCT__entry(
                __field(    unsigned int, vector    )
                __field(    unsigned int, irq       )
        ),

        TP_fast_assign(
                __entry->vector     =   vector;
                __entry->irq        =   irq;
        ),

        TP_printk("irq=%u cpu=%u",
                __entry->irq, __entry->vector)
);

为了检查这一点,我尝试了以下使用eBPF的片段。

...

bpf_text = """
#include <linux/netdevice.h>
#include <uapi/linux/ptrace.h>

typedef struct my_stats {
    u32 irq;
    u32 ts;
} my_stat;

BPF_HASH(irq_rcv_stats, u32, my_stat);

TRACEPOINT_PROBE(irq_vectors, vector_irq_rcv) {

    if(!(args->irq == 65)) return 0;

    u32 pid = bpf_get_current_pid_tgid();
    my_stat val = {};
    val.ts = bpf_ktime_get_ns();
    val.irq = args->irq;
    irq_rcv_stats.update(&pid, &val);

    // bpf_trace_printk("IRQ %d encountered ; Vector = %d \\n", args->irq, args->vector);
    return 0;
}
"""
...

在这里,我正在侦听特定IRQ号码的IRQ事件。这暂时适合我。

现在,我试图将此跟踪点附加到内核模块中(就像我们在内核模块中附加kprobe的方式)。这甚至可能吗? 目前,我已经使用了perf,但它产生了一些抖动。在我评估一些抖动敏感的任务时,我希望我可以在内核模块中使用这个跟踪点。

我很感激有关此事的任何意见或建议。

谢谢, Cooshal。

0 个答案:

没有答案