// SPDX-License-Identifier: GPL-2.0-only /* * kretprobe_example.c * * Here's a sample kernel module showing the use of return probes to * report the return value and total time taken for probed function * to run. * * usage: insmod kretprobe_example.ko func=<func_name> * * If no func_name is specified, kernel_clone is instrumented * * For more information on theory of operation of kretprobes, see * Documentation/trace/kprobes.rst * * Build and insert the kernel module as done in the kprobe example. * You will see the trace data in /var/log/messages and on the console * whenever the probed function returns. (Some messages may be suppressed * if syslogd is configured to eliminate duplicate messages.) */ #include <linux/kernel.h> #include <linux/module.h> #include <linux/kprobes.h> #include <linux/ktime.h> #include <linux/sched.h> static char func_name[KSYM_NAME_LEN] = …; module_param_string(…); MODULE_PARM_DESC(…) …; /* per-instance private data */ struct my_data { … }; /* Here we use the entry_handler to timestamp function entry */ static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { … } NOKPROBE_SYMBOL(entry_handler); /* * Return-probe handler: Log the return value and duration. Duration may turn * out to be zero consistently, depending upon the granularity of time * accounting on the platform. */ static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { … } NOKPROBE_SYMBOL(ret_handler); static struct kretprobe my_kretprobe = …; static int __init kretprobe_init(void) { … } static void __exit kretprobe_exit(void) { … } module_init(kretprobe_init) module_exit(kretprobe_exit) MODULE_DESCRIPTION(…) …; MODULE_LICENSE(…) …;