Hi, Anil and Ananth
I ported the kprobe-booster to the IA64 architecture.
This patch can be applied against 2.6.17-rc5-mm3.
And here is the patch. Could you review it?
This patch modifies kprobe as below;
- Boost if the target bundle don't use B and X unit.
- Introduce INST_FLAG_BOOSTABLE value for ainsn.insn_flag.
If this flag is set, the kprobe is boostable.
- Change instruction buffer(ainsn.insn) to an array of
bundles which has three elements. The 2nd element and the
3rd element of this array are used for dynamic execution.
And this patch is Lindent clean ;)
I measured the overhead of the booster by using
the benchmark kernel module attached to this mail.
noprobe: 436 machine cycles
noboost: 1162 machine cycles
boosted: 829 machine cycles
CPU spec: Itanium2 1.3GHz (2CPUs)
------------------------------------------------------------------------
/*
* boost probe bench
* Copyright (c) 2006 Hitachi,Ltd.,
* Created by Masami Hiramatsu<hiramatu@sdl.hitachi.co.jp>
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kprobes.h>
MODULE_AUTHOR("M.Hiramatsu");
MODULE_LICENSE("GPL");
int dummy_function(int n)
{
int k,l=0;
for (k=1; k<n; k++) {
l += (k + 1) / k;
}
return l;
}
static int probe_handler (struct kprobe * kp,
struct pt_regs * regs)
{
return 0;
}
#include <linux/time.h>
#define CALLB 14
#define CALLN (1<<CALLB)
static int bench_probe(void)
{
int i;
cycles_t c = get_cycles();
for (i=0; i<CALLN; i++) {
dummy_function(10);
}
return (get_cycles() - c)>>CALLB;
}
static struct kprobe kp;
static int install_probe(void)
{
int ret = -10000;
kp.pre_handler = probe_handler;
kp.addr = *(void **)dummy_function;
printk("noprobe: %d machine cycles\n", bench_probe());
ret = register_kprobe(&kp);
if (ret != 0) {
printk("probe install error: %d\n",ret);
return -EINVAL;
}
printk("boosted: %d machine cycles \n", bench_probe());
kp.ainsn.inst_flag &= ~INST_FLAG_BOOSTABLE;
printk("noboost: %d machine cycles\n", bench_probe());
unregister_kprobe(&kp);
return -1;
}
static void uninstall_probe(void)
{
printk("module removed\n");
}
module_init(install_probe);
module_exit(uninstall_probe);