Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757047AbcCaOor (ORCPT ); Thu, 31 Mar 2016 10:44:47 -0400 Received: from mail.kernel.org ([198.145.29.136]:59498 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753785AbcCaOoq (ORCPT ); Thu, 31 Mar 2016 10:44:46 -0400 Date: Thu, 31 Mar 2016 11:44:39 -0300 From: Arnaldo Carvalho de Melo To: Peter Zijlstra Cc: kan.liang@intel.com, ak@linux.intel.com, eranian@google.com, vincent.weaver@maine.edu, tglx@linutronix.de, mingo@kernel.org, acme@redhat.com, jolsa@redhat.com, alexander.shishkin@linux.intel.com, ying.huang@linux.intel.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH V2 1/1] perf/core: don't find side-band event from all pmus Message-ID: <20160331144439.GB27708@kernel.org> References: <1458757477-3781-1-git-send-email-kan.liang@intel.com> <20160329120609.GG3408@twins.programming.kicks-ass.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20160329120609.GG3408@twins.programming.kicks-ass.net> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3115 Lines: 86 Em Tue, Mar 29, 2016 at 02:06:09PM +0200, Peter Zijlstra escreveu: > On Wed, Mar 23, 2016 at 11:24:37AM -0700, kan.liang@intel.com wrote: > > The V2 patch is mainly based on Peter's suggestion. But I didn't rename > > perf_event_aux to perf_event_sb. Because it looks there are many aux things > > in the codes, e.g. AUX area in ring buffer. I'm not sure if we need to change > > all aux to sb. We may do the rename later in separate patch. > > Right.. no problem doing that in a separate patch. > > > +static void perf_event_sb_mask(unsigned int sb_mask, > > + perf_event_aux_output_cb output, > > + void *data) > > +{ > > + int sb; > > + > > + for (sb = 0; sb < sb_nr; sb++) { > > + if (!(sb_mask & (1 << sb))) > > + continue; > > + perf_event_sb_iterate(sb, output, data); > > + } > > +} > > > @@ -5852,7 +5910,8 @@ static void perf_event_task(struct task_struct *task, > > > > perf_event_aux(perf_event_task_output, > > &task_event, > > - task_ctx); > > + task_ctx, > > + (1 << sb_task) | (1 << sb_mmap) | (1 << sb_comm)); > > } > > So one side-effect of this change is that the above event can be > delivered 3 times if you're 'lucky'. > > Acme; does userspace care? So, when processing a PERF_RECORD_FORK there is some sanity checks in machine__process_fork_event() (tools/perf/util/machine.c), and one that is affected by copies is: struct thread *thread = machine__find_thread(machine, event->fork.pid, event->fork.tid); /* if a thread currently exists for the thread id remove it */ if (thread != NULL) { machine__remove_thread(machine, thread); thread__put(thread); } thread = machine__findnew_thread(machine, event->fork.pid, event->fork.tid); So we conceivably may end up with multiple 'struct thread' pointing to the same kernel thread, being held as references somewhere (in a hist_entry, for instance, if a PERF_RECORD_SAMPLE happens mid sentence). It probably will cope, but can't we just emit one single record? PERF_RECORD_EXIT are ok: int machine__process_exit_event(struct machine *machine, union perf_event *event, struct perf_sample *sample __maybe_unused) { struct thread *thread = machine__find_thread(machine, event->fork.pid, event->fork.tid); if (dump_trace) perf_event__fprintf_task(event, stdout); if (thread != NULL) { thread__exited(thread); thread__put(thread); } return 0; } PERF_RECORD_COMM will unecessarily add a new COMM to its list, leading tooling to think that there was a prctl(PR_SET_NAME). This could conceivably be annoyed away by checking if the "new" COMM is the current one, again, can't the kernel emit just one record? - Arnaldo