Messages in this thread | | | Date | Thu, 9 Apr 2020 20:43:02 +0200 | From | Jiri Olsa <> | Subject | Re: [RFC] kretprobe: Prevent triggering kretprobe from within kprobe_flush_task |
| |
On Thu, Apr 09, 2020 at 02:32:21PM +0530, Naveen N. Rao wrote:
SNIP
> > --- > > kernel/kprobes.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/kernel/kprobes.c b/kernel/kprobes.c > > index 2625c241ac00..b13247cae752 100644 > > --- a/kernel/kprobes.c > > +++ b/kernel/kprobes.c > > @@ -1236,6 +1236,10 @@ __releases(hlist_lock) > > } > > NOKPROBE_SYMBOL(kretprobe_table_unlock); > > +static struct kprobe kretprobe_dummy = { > > + .addr = (void *)kretprobe_trampoline, > > +}; > > + > > Perhaps a more meaningful name, say, kprobe_flush_task_protect ?
ok, will rename together with Masami's changes
> > > /* > > * This function is called from finish_task_switch when task tk becomes dead, > > * so that we can recycle any function-return probe instances associated > > @@ -1256,12 +1260,14 @@ void kprobe_flush_task(struct task_struct *tk) > > INIT_HLIST_HEAD(&empty_rp); > > hash = hash_ptr(tk, KPROBE_HASH_BITS); > > head = &kretprobe_inst_table[hash]; > > + __this_cpu_write(current_kprobe, &kretprobe_dummy); > > kretprobe_table_lock(hash, &flags); > > hlist_for_each_entry_safe(ri, tmp, head, hlist) { > > if (ri->task == tk) > > recycle_rp_inst(ri, &empty_rp); > > } > > kretprobe_table_unlock(hash, &flags); > > + __this_cpu_write(current_kprobe, NULL); > > I would move this to the end of the function to also cover the below code. > kprobe_flush_task() is marked NOKPROBE, so it is good to prevent probe > handling in the below code too.
ok, will do
thanks, jirka
> > > hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) { > > hlist_del(&ri->hlist); > > kfree(ri); > > > - Naveen >
| |