细节1:使用读写锁的text poke机制依然存在问题
参见《x86_64动态替换内核函数的hotpatch模块卸载问题》。
非常简单的case,如果我在成功注册kprobe的时候,有CPU的thread进入了hook函数的中间,岂不是在该thread退出hook函数的时候,在没有read_lock(因为进入函数的时候kprobe还没有注册)的前提下调用了read_unlock?这会搞乱rwlock的计数器的!
所以说,还要引入复杂度。即定义一个percpu的全局变量数组,其元素为一个atomic类型,这个percpu变量是为了控制每个CPU上只有read lock调用过才能read unlock。该变量初始值为0,进入hold这个前处理函数时执行inc,在post后处理中只有该atomic非0时才调用unlock!
static int hold(...)
{
atomic_t var = per_cpu(hook_var, this_cpu);
inc(var);
read_lock(&hook_lock);
return 0;
}
static int release(...)
{
atomic_t var = per_cpu(hook_var, this_cpu);
if (var) {
read_unlock(&hook_lock);
}
return 0;
}
static void hotpatch_poke_text(...)
{
register(&probe); // 借用kprobe的pre/post机制
// 大