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

Linux kernel 如何在内核模块中使用跟踪点,linux-kernel,kernel-module,bpf,tracepoint,Linux Kernel,Kernel Module,Bpf,Tracepoint,我最近开始学习这些东西。关于这个问题,我遇到了很多关于kprobes、BPF、eBPF、跟踪点和性能的资源 我想在内核中测试一些irq事件(在它到达设备驱动程序之前)。因此,我在do_IRQ()函数的内核中创建了一个跟踪事件 我已在内核中将我的跟踪点声明为: TRACE_EVENT(vector_irq_rcv, TP_PROTO(unsigned int vector, unsigned int irq), TP_ARGS(vector, irq),

我最近开始学习这些东西。关于这个问题,我遇到了很多关于kprobes、BPF、eBPF、跟踪点和性能的资源

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

我已在内核中将我的跟踪点声明为:

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;
}
"""
...
。。。
bpf_text=“”
#包括
#包括
typedef struct my_stats{
u32 irq;
u32 ts;
}我的_统计;
BPF_散列(irq_rcv_统计、u32、my_统计);
跟踪点探测(irq\U矢量、矢量irq\U rcv){
如果(!(args->irq==65))返回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;向量=%d\\n”,参数->IRQ,参数->向量);
返回0;
}
"""
...
在这里,我正在收听特定IRQ号码上的IRQ事件。目前,这对我来说很有效

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

如果您能就此问题提供任何意见或建议,我将不胜感激

谢谢,
Cooshal.

如果你已经有了eBPF的概念证明,为什么要使用内核模块?一个原因是我对BPF语法不太熟悉。此外,如何将这些日志保存到文本文件或csv或类似文件中?请参阅Linux跟踪。特别是,第7课包含了一个如何在用户空间中从内核检索数据的示例,然后可以将其保存到文件中。此外,内核的源代码中还有跟踪点模块。在BPF中,您有什么特别想做的,我可以演示一下吗?如果有用的话,我可以添加一个保存到日志文件的示例。谢谢您的回复。我已经更新了代码片段。我想把irq_rcv_stats的内容写入一个日志文件,以便以后可以用它来计算抖动。@pchaigno我有一个关于这个问题的问题。根据我的代码,我应该用什么替换
register\u trace\u subsys\u event
?它是
寄存器\跟踪\向量\ irq \ rcv
?我试过了。我得到一个声明错误。如果我做错了,请告诉我。