On Thu, 30 Apr 2020 12:18:22 -0400 (EDT)
Mathieu Desnoyers <mathieu.desnoy...@efficios.com> wrote:

> ----- On Apr 30, 2020, at 12:16 PM, rostedt rost...@goodmis.org wrote:
> 
> > On Thu, 30 Apr 2020 11:20:15 -0400 (EDT)
> > Mathieu Desnoyers <mathieu.desnoy...@efficios.com> wrote:
> >   
> >> > The right fix is to call vmalloc_sync_mappings() right after allocating
> >> > tracing or perf buffers via v[zm]alloc().  
> >> 
> >> Either right after allocation, or right before making the vmalloc'd data
> >> structure visible to the instrumentation. In the case of the pid filter,
> >> that would be the rcu_assign_pointer() which publishes the new pid filter
> >> table.
> >> 
> >> As long as vmalloc_sync_mappings() is performed somewhere *between* 
> >> allocation
> >> and publishing the pointer for instrumentation, it's fine.
> >> 
> >> I'll let Steven decide on which approach works best for him.  
> > 
> > As stated in the other email, I don't see it having anything to do with
> > vmalloc, but with the per_cpu() allocation. I'll test this theory out by
> > not even allocating the pid masks and touching the per cpu data at every
> > event to see if it crashes.  
> 
> As pointed out in my other email, per-cpu allocation uses vmalloc when
> size > PAGE_SIZE.

And as I replied:

        buf->data = alloc_percpu(struct trace_array_cpu);

struct trace_array_cpu {
        atomic_t                disabled;
        void                    *buffer_page;   /* ring buffer spare */

        unsigned long           entries;
        unsigned long           saved_latency;
        unsigned long           critical_start;
        unsigned long           critical_end;
        unsigned long           critical_sequence;
        unsigned long           nice;
        unsigned long           policy;
        unsigned long           rt_priority;
        unsigned long           skipped_entries;
        u64                     preempt_timestamp;
        pid_t                   pid;
        kuid_t                  uid;
        char                    comm[TASK_COMM_LEN];

        bool                    ignore_pid;
#ifdef CONFIG_FUNCTION_TRACER
        bool                    ftrace_ignore_pid;
#endif
};

That doesn't look bigger than PAGE_SIZE to me.

-- Steve

Reply via email to