Messages in this thread | | | From | Namhyung Kim <> | Subject | Re: [PATCH 10/13] tracing/uprobes: Fetch args before reserving a ring buffer | Date | Tue, 27 Aug 2013 17:07:15 +0900 |
| |
Hi Steven,
On Thu, 22 Aug 2013 21:08:30 -0400, Steven Rostedt wrote: > On Fri, 23 Aug 2013 07:57:15 +0800 > "zhangwei(Jovi)" <jovi.zhangwei@huawei.com> wrote: > > >> > >> > What about creating a per cpu buffer when uprobes are registered, and >> > delete them when they are finished? Basically what trace_printk() does >> > if it detects that there are users of trace_printk() in the kernel. >> > Note, it does not deallocate them when finished, as it is never >> > finished until reboot ;-) >> > >> > -- Steve >> > >> I also thought out this approach, but the issue is we cannot fetch user >> memory into per-cpu buffer, because use per-cpu buffer should under >> preempt disabled, and fetching user memory could sleep. > > Actually, we could create a per_cpu mutex to match the per_cpu buffers. > This is not unlike what we do in -rt. > > int cpu; > struct mutex *mutex; > void *buf; > > > /* > * Use per cpu buffers for fastest access, but we might migrate > * So the mutex makes sure we have sole access to it. > */ > > cpu = raw_smp_processor_id(); > mutex = per_cpu(uprobe_cpu_mutex, cpu); > buf = per_cpu(uprobe_cpu_buffer, cpu); > > mutex_lock(mutex); > store_trace_args(..., buf,...); > mutex_unlock(mutex); >
Great! I'll go with this approach. Is it OK to you, Masami?
Thanks, Namhyung
| |